From aa1a40e9141fd718e85e6e92f78adf301f53cf1f Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Tue, 4 Jun 2013 14:32:00 +0200 Subject: [PATCH] =?utf8?q?SL::DBUpgrade2::Base=20neue=20Funktion=20db=5Fer?= =?utf8?q?rstr()=20f=C3=BCr=20korrekt=20encodierte=20Datenbankfehlermeldun?= =?utf8?q?gen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- SL/DBUpgrade2/Base.pm | 44 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/SL/DBUpgrade2/Base.pm b/SL/DBUpgrade2/Base.pm index 2c1e11114..9978b207e 100644 --- a/SL/DBUpgrade2/Base.pm +++ b/SL/DBUpgrade2/Base.pm @@ -5,6 +5,7 @@ use strict; use parent qw(Rose::Object); use Carp; +use Encode; use English qw(-no_match_vars); use File::Basename (); use File::Copy (); @@ -37,18 +38,28 @@ sub execute_script { sub db_error { my ($self, $msg) = @_; - die $::locale->text("Database update error:") . "
$msg
" . $DBI::errstr; + die $::locale->text("Database update error:") . "
$msg
" . $self->db_errstr('DBI'); } sub db_query { my ($self, $query, %params) = @_; - return if $self->dbh->do($query, undef, @{ $params{bind} || [] }); + my $dbh = $params{dbh} || $self->dbh; + + return if $dbh->do($query, undef, @{ $params{bind} || [] }); $self->db_error($query) unless $params{may_fail}; - $self->dbh->rollback; - $self->dbh->begin_work; + $dbh->rollback; + $dbh->begin_work; +} + +sub db_errstr { + my ($self, $handle) = @_; + + my $error = $handle ? $handle->errstr : $self->dbh->errstr; + + return $::locale->is_utf8 ? Encode::decode('utf-8', $error) : $error; } sub check_coa { @@ -221,6 +232,31 @@ current transaction will be rolled back, a new one will be started. An optional array reference containing bind parameter for the query. +=item C + +The database handle to use. If undefined then C<$self-Edbh> will +be used. + +=back + +=item C + +Returns the last database from C<$handle> error message encoded in +Perl's internal encoding. The PostgreSQL DBD leaves the UTF-8 flag off +for error messages even if the C attribute is set. + +C<$handle> is optional and can be one of three things: + +=over 2 + +=item 1. A database or statement handle. In that case +C<$handle-Eerrstr> is used. + +=item 2. The string 'DBI'. In that case C<$DBI::errstr> is used. + +=item 3. If it is undefined then C<$self-Edbh-Eerrstr> is +used. + =back =item C -- 2.20.1