/[cvs]/nfo/perl/libs/Data/Storage/Handler/DBI.pm
ViewVC logotype

Diff of /nfo/perl/libs/Data/Storage/Handler/DBI.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by joko, Sun Nov 17 06:34:39 2002 UTC revision 1.7 by joko, Sun Dec 1 07:09:09 2002 UTC
# Line 3  Line 3 
3  #  $Id$  #  $Id$
4  #  #
5  #  $Log$  #  $Log$
6    #  Revision 1.7  2002/12/01 07:09:09  joko
7    #  + sub getListFiltered (dummy redirecting to getListUnfiltered)
8    #
9    #  Revision 1.6  2002/12/01 04:46:01  joko
10    #  + sub eraseAll
11    #
12    #  Revision 1.5  2002/11/29 05:00:26  joko
13    #  + sub getListUnfiltered
14    #  + sub sendQuery
15    #
16    #  Revision 1.4  2002/11/17 08:46:42  jonen
17    #  + wrapped eval around DBI->connect to prevent deaths
18    #
19  #  Revision 1.3  2002/11/17 06:34:39  joko  #  Revision 1.3  2002/11/17 06:34:39  joko
20  #  + locator metadata can now be reached via ->{locator}  #  + locator metadata can now be reached via ->{locator}
21  #  - sub hash2sql now taken from libdb  #  - sub hash2sql now taken from libdb
# Line 26  use base ("Data::Storage::Handler::Abstr Line 39  use base ("Data::Storage::Handler::Abstr
39    
40  use DBI;  use DBI;
41  use Data::Dumper;  use Data::Dumper;
42  use libdb;  use libdb qw( getDbNameByDsn hash2Sql );
43    use Data::Storage::Result::DBI;
44    
45  # get logger instance  # get logger instance
46  my $logger = Log::Dispatch::Config->instance;  my $logger = Log::Dispatch::Config->instance;
47    
48    
49  our $metainfo = {  sub getMetaInfo {
50    'disconnectMethod' => 'disconnect',    my $self = shift;
51  };    $logger->debug( __PACKAGE__ . "->getMetaInfo()"  );
52      return {
53        'disconnectMethod' => 'disconnect',
54      };
55    }
56    
57  sub connect {  sub connect {
58    
# Line 52  sub connect { Line 70  sub connect {
70                    
71          #use Data::Dumper; print Dumper($self->{dbi});          #use Data::Dumper; print Dumper($self->{dbi});
72                    
73          $self->{COREHANDLE} = DBI->connect( $dsn, '', '', $self->{locator}->{dbi} );          eval {
74          if (!$self->{COREHANDLE}) {            $self->{COREHANDLE} = DBI->connect( $dsn, '', '', $self->{locator}->{dbi} );
75            $logger->warning( __PACKAGE__ . "->connect failed: " . DBI::errstr );            if (!$self->{COREHANDLE}) {
76            return;              $logger->warning( __PACKAGE__ . "->connect failed: " . DBI::errstr );
77          }              return;
78              }
79            };
80            $logger->warning( __PACKAGE__ . "->connect failed: " . $@ ) if $@;
81    
82        }        }
83        $self->configureCOREHANDLE();        $self->configureCOREHANDLE();
84    
# Line 72  sub configureCOREHANDLE { Line 94  sub configureCOREHANDLE {
94    
95    $logger->debug( __PACKAGE__ . "->configureCOREHANDLE" );    $logger->debug( __PACKAGE__ . "->configureCOREHANDLE" );
96    
97    # apply configured modifications    # apply configured modifications to DBI-handle
98      if (exists $self->{locator}->{dbi}->{trace_level} && exists $self->{locator}->{dbi}->{trace_file}) {      if (exists $self->{locator}->{dbi}->{trace_level} && exists $self->{locator}->{dbi}->{trace_file}) {
99        $self->{COREHANDLE}->trace($self->{locator}->{dbi}->{trace_level}, $self->{locator}->{dbi}->{trace_file});        $self->{COREHANDLE}->trace($self->{locator}->{dbi}->{trace_level}, $self->{locator}->{dbi}->{trace_file});
100      }      }
# Line 113  sub _sendSql { Line 135  sub _sendSql {
135  sub sendCommand {  sub sendCommand {
136    my $self = shift;    my $self = shift;
137    my $command = shift;    my $command = shift;
138      # TODO: when tracing: yes, do actually log this
139    #$logger->debug( __PACKAGE__ . "->sendCommand( command $command )" );    #$logger->debug( __PACKAGE__ . "->sendCommand( command $command )" );
140    my $cmdHandle = $self->_sendSql($command);    my $cmdHandle = $self->_sendSql($command);
141    my $result = Data::Storage::Result::DBI->new( RESULTHANDLE => $cmdHandle );    my $result = Data::Storage::Result::DBI->new( RESULTHANDLE => $cmdHandle );
142    return $result;    return $result;
143  }  }
144    
 sub quoteSql {  
   my $self = shift;  
   my $string = shift;  
   if ($string) {  
     $string =~ s/'/\\'/g;  
   }  
   return $string;  
 }  
   
   
145  sub getChildNodes {  sub getChildNodes {
   
146    my $self = shift;    my $self = shift;
147    my @nodes;    my @nodes;
   
148    $logger->debug( __PACKAGE__ . "->getChildNodes()" );    $logger->debug( __PACKAGE__ . "->getChildNodes()" );
   
149    if (my $result = $self->sendCommand( 'SHOW TABLES;' ) ) {    if (my $result = $self->sendCommand( 'SHOW TABLES;' ) ) {
150      my $dbname = getDbNameByDsn($self->{locator}->{dbi}->{dsn});      my $dbname = getDbNameByDsn($self->{locator}->{dbi}->{dsn});
151      my $key = "Tables_in_$dbname";      my $key = "Tables_in_$dbname";
152      while ( my $row = $result->_getNextEntry() ) {      while ( my $row = $result->getNextEntry() ) {
153        push @nodes, $row->{$key};        push @nodes, $row->{$key};
154      }      }
155    }    }
     
156    return \@nodes;    return \@nodes;
   
157  }  }
158    
159    sub getListUnfiltered {
160      my $self = shift;
161      my $nodename = shift;
162      my @list;
163      $logger->debug( __PACKAGE__ . "->getListUnfiltered( nodename => '" . $nodename . "' )" );
164      # get list of rows from rdbms by table name
165      my $result = $self->sendCommand("SELECT * FROM $nodename");
166      while ( my $row = $result->getNextEntry() ) {
167        push @list, $row;
168      }
169      return \@list;
170    }
171    
172    sub sendQuery {
   
 package Data::Storage::Result::DBI;  
   
 use strict;  
 use warnings;  
   
 use base ("Data::Storage::Result");  
   
 sub DESTROY {  
173    my $self = shift;    my $self = shift;
174    #$logger->debug( __PACKAGE__ . "->" . "DESTROY" );    my $query = shift;
175    $self->{RESULTHANDLE} && $self->{RESULTHANDLE}->finish();    #my $sql = "SELECT cs FROM $self->{metainfo}->{$descent}->{node} WHERE $self->{metainfo}->{$descent}->{IdentProvider}->{arg}='$self->{entry}->{source}->{ident}';";
176      #my $result = $self->{metainfo}->{$descent}->{storage}->sendCommand($sql);
177      my @crits;
178      foreach (@{$query->{criterias}}) {
179        my $op = '';
180        $op = '=' if lc $_->{op} eq 'eq';
181        push @crits, "$_->{key}$op'$_->{val}'";
182      }
183      my $subnodes = {};
184      map { $subnodes->{$_}++ } @{$query->{subnodes}};
185      # HACK: this is hardcoded ;(    expand possibilities!
186      my $crit = join(' AND ', @crits);
187      my $sql = hash2Sql($query->{node}, $subnodes, 'SELECT', $crit);
188      return $self->sendCommand($sql);
189  }  }
190    
191  sub _getNextEntry {  sub eraseAll {
192    my $self = shift;    my $self = shift;
193    $self->{RESULTHANDLE} && return $self->{RESULTHANDLE}->fetchrow_hashref;    my $classname = shift;
194      my $sql = "DELETE FROM $classname";
195      $self->sendCommand($sql);
196  }  }
197    
198    # TODO: actually implement the filtering functionality using $this->sendQuery
199    sub getListFiltered {
200      my $self = shift;
201      my $nodename = shift;
202      return $self->getListUnfiltered($nodename);
203    }
204    
 1;  
205    1;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.7

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed