--- nfo/perl/libs/Data/Storage/Handler/DBI.pm 2002/11/17 08:46:42 1.4 +++ nfo/perl/libs/Data/Storage/Handler/DBI.pm 2002/11/29 05:00:26 1.5 @@ -1,8 +1,12 @@ ################################# # -# $Id: DBI.pm,v 1.4 2002/11/17 08:46:42 jonen Exp $ +# $Id: DBI.pm,v 1.5 2002/11/29 05:00:26 joko Exp $ # # $Log: DBI.pm,v $ +# Revision 1.5 2002/11/29 05:00:26 joko +# + sub getListUnfiltered +# + sub sendQuery +# # Revision 1.4 2002/11/17 08:46:42 jonen # + wrapped eval around DBI->connect to prevent deaths # @@ -29,15 +33,20 @@ use DBI; use Data::Dumper; -use libdb; +use libdb qw( getDbNameByDsn hash2Sql ); +use Data::Storage::Result::DBI; # get logger instance my $logger = Log::Dispatch::Config->instance; -our $metainfo = { - 'disconnectMethod' => 'disconnect', -}; +sub getMetaInfo { + my $self = shift; + $logger->debug( __PACKAGE__ . "->getMetaInfo()" ); + return { + 'disconnectMethod' => 'disconnect', + }; +} sub connect { @@ -79,7 +88,7 @@ $logger->debug( __PACKAGE__ . "->configureCOREHANDLE" ); - # apply configured modifications + # apply configured modifications to DBI-handle if (exists $self->{locator}->{dbi}->{trace_level} && exists $self->{locator}->{dbi}->{trace_file}) { $self->{COREHANDLE}->trace($self->{locator}->{dbi}->{trace_level}, $self->{locator}->{dbi}->{trace_file}); } @@ -120,61 +129,57 @@ sub sendCommand { my $self = shift; my $command = shift; + # TODO: when tracing: yes, do actually log this #$logger->debug( __PACKAGE__ . "->sendCommand( command $command )" ); my $cmdHandle = $self->_sendSql($command); my $result = Data::Storage::Result::DBI->new( RESULTHANDLE => $cmdHandle ); return $result; } -sub quoteSql { - my $self = shift; - my $string = shift; - if ($string) { - $string =~ s/'/\\'/g; - } - return $string; -} - - sub getChildNodes { - my $self = shift; my @nodes; - $logger->debug( __PACKAGE__ . "->getChildNodes()" ); - if (my $result = $self->sendCommand( 'SHOW TABLES;' ) ) { my $dbname = getDbNameByDsn($self->{locator}->{dbi}->{dsn}); my $key = "Tables_in_$dbname"; - while ( my $row = $result->_getNextEntry() ) { + while ( my $row = $result->getNextEntry() ) { push @nodes, $row->{$key}; } } - return \@nodes; - } - - - -package Data::Storage::Result::DBI; - -use strict; -use warnings; - -use base ("Data::Storage::Result"); - -sub DESTROY { +sub getListUnfiltered { my $self = shift; - #$logger->debug( __PACKAGE__ . "->" . "DESTROY" ); - $self->{RESULTHANDLE} && $self->{RESULTHANDLE}->finish(); + my $nodename = shift; + my @list; + $logger->debug( __PACKAGE__ . "->getListUnfiltered( nodename => '" . $nodename . "' )" ); + # get list of rows from rdbms by table name + my $result = $self->sendCommand("SELECT * FROM $nodename"); + while ( my $row = $result->getNextEntry() ) { + push @list, $row; + } + return \@list; } -sub _getNextEntry { +sub sendQuery { my $self = shift; - $self->{RESULTHANDLE} && return $self->{RESULTHANDLE}->fetchrow_hashref; + my $query = shift; + #my $sql = "SELECT cs FROM $self->{metainfo}->{$descent}->{node} WHERE $self->{metainfo}->{$descent}->{IdentProvider}->{arg}='$self->{entry}->{source}->{ident}';"; + #my $result = $self->{metainfo}->{$descent}->{storage}->sendCommand($sql); + my @crits; + foreach (@{$query->{criterias}}) { + my $op = ''; + $op = '=' if lc $_->{op} eq 'eq'; + push @crits, "$_->{key}$op'$_->{val}'"; + } + my $subnodes = {}; + map { $subnodes->{$_}++ } @{$query->{subnodes}}; + # HACK: this is hardcoded ;( expand possibilities! + my $crit = join(' AND ', @crits); + my $sql = hash2Sql($query->{node}, $subnodes, 'SELECT', $crit); + return $self->sendCommand($sql); } - 1;