From c82ac158cce83b8613ae60dc9a476939203b2752 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Sat, 21 May 2016 09:04:27 +0100 Subject: [PATCH] Bug 13669: Catch the errors to have them to the logs This patch redirect STDERR to a variable to retrieve the errors raised by the DBMS when loading a sql file, it could be useful to debug errors. Signed-off-by: Bernardo Gonzalez Kriegel It's better of course, trying to load a failed fiel it outputs mysl errors DBD::mysql::st execute failed: You have an error in your SQL syntax... No errors Signed-off-by: Jonathan Druart --- C4/Installer.pm | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/C4/Installer.pm b/C4/Installer.pm index 9ffc396..1e6768e 100644 --- a/C4/Installer.pm +++ b/C4/Installer.pm @@ -412,18 +412,11 @@ sub set_version_syspref { my $error = $installer->load_sql($filename); -Runs a the specified SQL using the DB's command-line -SQL tool, and returns any strings sent to STDERR -by the command-line tool. +Runs a the specified SQL file using a sql loader DBIx::RunSQL +Returns any strings sent to STDERR -B there has been a long-standing desire to -replace this with an SQL loader that goes -through DBI; partly for portability issues -and partly to improve error handling. - -B even using the command-line loader, some more -basic error handling should be added - deal -with missing files, e.g. +# FIXME This should be improved: sometimes the caller and load_sql warn the same +error. =cut @@ -434,17 +427,23 @@ sub load_sql { my $dbh = $self->{ dbh }; - eval { - DBIx::RunSQL->run_sql_file( - dbh => $dbh, - sql => $filename, - ); + my $dup_stderr; + do { + local *STDERR; + open STDERR, ">>", \$dup_stderr; + + eval { + DBIx::RunSQL->run_sql_file( + dbh => $dbh, + sql => $filename, + ); + }; }; # errors thrown while loading installer data should be logged - if( $@ ) { + if( $dup_stderr ) { warn "C4::Installer::load_sql returned the following errors while attempting to load $filename:\n"; - warn "$@"; - $error = "Error attempting to load $filename:\n$@"; + $error = $dup_stderr; + } return $error; -- 2.8.1