support utf-8 encoding for PostgreSQL, SQLite and MySQL
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 4 Nov 2013 15:46:16 +0000 (16:46 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 4 Nov 2013 15:46:16 +0000 (16:46 +0100)
lib/WebPAC/Input/DBI.pm

index 069a0bf..bde569a 100644 (file)
@@ -10,6 +10,7 @@ __PACKAGE__->mk_accessors(qw(
        user
        passwd
        path
+       input_encoding
 ));
 
 use Encode;
@@ -48,11 +49,24 @@ sub new {
        my $sql = read_file $self->path;
 
        my $log = $self->_get_logger;
-       $log->debug( "dsn: ", $self->dsn );
+       $log->debug( "args: ", sub { dump($arg) } );
 
        my $dbh = DBI->connect( $self->dsn, $self->user, $self->passwd, { RaiseError => 1 } );
 
-       $dbh->{sqlite_unicode} = 1;
+       if ( my $db_encoding = $arg->{encoding} ) {
+               $self->debug("encoding $db_encoding");
+               my $dsn = $self->dsn;
+               if ( $dsn =~ m{Pg} ) {
+                       $dbh->do( qq{ set client_encoding = '$db_encoding'; } );
+                       $dbh->{pg_enable_utf8} = 1; # force utf-8 encoding for SQL_ASCII databases
+               } elsif ( $dsn =~ m{mysql} ) {
+                       $dbh->do( qq{ set names '$db_encoding'; } );
+               } elsif ( $dsn =~ m{SQLite} ) {
+                       $dbh->{sqlite_unicode} = 1;
+               } else {
+                       warn "Don't know how to set encoding to $db_encoding for $dsn";
+               }
+       }
 
        $log->debug( "sql ",$self->path, "\n", $sql );
 
@@ -83,12 +97,14 @@ Return record with ID C<$mfn> from database
 
 sub fetch_rec {
        my ( $self, $mfn, $filter_coderef ) = @_;
+       my $log = $self->_get_logger;
 
        my $rec = { '000' => [ $mfn ] };
        my $row = $self->{_rec}->[$mfn-1] || die "no record $mfn";
        foreach my $c ( keys %$row ) {
                $rec->{$c} = [ $row->{$c} ];
        }
+       $log->debug("fetch_rec ",sub { dump($rec) });
        return $rec;
 }