X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=inline;f=SL%2FDBUpgrade2%2FBase.pm;h=9978b207e40637e2a634dbec0e5600f80d12dd71;hb=f383c4239b5f1f41d47e8bd92814fb9f241760ad;hp=09e4e5fff31c7d41d79872b97f3a8604c060c405;hpb=a23454bb1b039a31b7f77710ff663fa9152d530c;p=kivitendo-erp.git diff --git a/SL/DBUpgrade2/Base.pm b/SL/DBUpgrade2/Base.pm index 09e4e5fff..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, $may_fail) = @_; + my ($self, $query, %params) = @_; - return if $self->dbh->do($query); + my $dbh = $params{dbh} || $self->dbh; - $self->db_error($query) unless $may_fail; + return if $dbh->do($query, undef, @{ $params{bind} || [] }); - $self->dbh->rollback; - $self->dbh->begin_work; + $self->db_error($query) unless $params{may_fail}; + + $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 { @@ -204,13 +215,49 @@ C<$coa_name>. Outputs an error message C<$message> to the user and aborts execution. -=item C +=item C + +Executes an SQL query. The following parameters are supported: + +=over 2 + +=item C + +What the method does if the query fails depends on this parameter. If +it is falsish (the default) then the method will simply die outputting +the error message via L. If C is trueish then the +current transaction will be rolled back, a new one will be started. + +=item C + +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: -Executes an SQL query. What the method does if the query fails depends -on C<$may_fail>. If it is falsish then the method will simply die -outputting the error message via L. If C<$may_fail> is -trueish then the current transaction will be rolled back, a new one -will be started +=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