1 package WebPAC::Input::DBI;
7 use base qw/WebPAC::Common Class::Accessor/;
8 __PACKAGE__->mk_accessors(qw(
17 use Data::Dump qw/dump/;
23 WebPAC::Input::DBI - read data from RDBMS using DBI
31 my $input = new WebPAC::Input::DBI(
32 dsn => 'dbi:SQLite:dbname=/dev/shm/test.sqlite',
35 path => '/path/to.sql',
49 my $sql = read_file $self->path;
51 my $log = $self->_get_logger;
52 $log->debug( "args: ", sub { dump($arg) } );
54 my $dbh = DBI->connect( $self->dsn, $self->user, $self->passwd, { RaiseError => 1 } );
56 if ( my $db_encoding = $arg->{encoding} ) {
57 $self->debug("encoding $db_encoding");
59 if ( $dsn =~ m{Pg} ) {
60 $dbh->do( qq{ set client_encoding = '$db_encoding'; } );
61 $dbh->{pg_enable_utf8} = 1; # force utf-8 encoding for SQL_ASCII databases
62 } elsif ( $dsn =~ m{mysql} ) {
63 $dbh->do( qq{ set names '$db_encoding'; } );
64 } elsif ( $dsn =~ m{SQLite} ) {
65 $dbh->{sqlite_unicode} = 1;
67 warn "Don't know how to set encoding to $db_encoding for $dsn";
71 $log->debug( "sql ",$self->path, "\n", $sql );
73 my $sth = $dbh->prepare( $sql );
76 # XXX this should really be in fetch_rec, but DBD::SQLite doesn't return
77 # $sth->rows correctly, and we really need number of rows...
80 while ( my $row = $sth->fetchrow_hashref ) {
81 push @{ $self->{_rec} }, $row;
85 $log->info( $self->dsn, " query produced ", $self->size, " records");
87 $self ? return $self : return undef;
92 Return record with ID C<$mfn> from database
94 my $rec = $input->fetch_rec( $mfn, $filter_coderef );
99 my ( $self, $mfn, $filter_coderef ) = @_;
100 my $log = $self->_get_logger;
102 my $rec = { '000' => [ $mfn ] };
103 my $row = $self->{_rec}->[$mfn-1] || die "no record $mfn";
104 foreach my $c ( keys %$row ) {
105 $rec->{$c} = [ $row->{$c} ];
107 $log->debug("fetch_rec ",sub { dump($rec) });
114 Return number of records in database
116 my $size = $input->size;
122 return $self->{size};
127 Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>
129 =head1 COPYRIGHT & LICENSE
131 Copyright 2011 Dobrica Pavlinusic, All Rights Reserved.
133 This program is free software; you can redistribute it and/or modify it
134 under the same terms as Perl itself.
138 1; # End of WebPAC::Input::DBI