From 78d57cb817a8815f64d581181105346e3c32b8ff Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Mon, 4 Nov 2013 16:46:16 +0100 Subject: [PATCH] support utf-8 encoding for PostgreSQL, SQLite and MySQL --- lib/WebPAC/Input/DBI.pm | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/WebPAC/Input/DBI.pm b/lib/WebPAC/Input/DBI.pm index 069a0bf..bde569a 100644 --- a/lib/WebPAC/Input/DBI.pm +++ b/lib/WebPAC/Input/DBI.pm @@ -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; } -- 2.20.1