Bug 13669: Catch the errors to have them to the logs
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Sat, 21 May 2016 08:04:27 +0000 (09:04 +0100)
committerKyle M Hall <kyle@bywatersolutions.com>
Mon, 23 May 2016 16:47:32 +0000 (16:47 +0000)
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 <bgkriegel@gmail.com>
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 <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

C4/Installer.pm

index 9ffc396..1e6768e 100644 (file)
@@ -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<FIXME:> 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<FIXME:> 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;