LP#1366964 Update libdbi connection test error parsing
authorBill Erickson <berickxx@gmail.com>
Tue, 21 Oct 2014 02:55:20 +0000 (22:55 -0400)
committerJason Stephenson <jstephenson@mvlc.org>
Wed, 5 Nov 2014 15:08:33 +0000 (10:08 -0500)
Modern version of libdbi return a slightly different error message for
queries which fail mid-transaction, causing an C-based DB backends to
exit abruptly unnecessarily.  Update the error message test to include
the new format.

Includes Perl live test for confirming functionality.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
Open-ILS/src/c-apps/oils_sql.c
Open-ILS/src/perlmods/live_t/08-lp1366964-libdbi-error.t [new file with mode: 0644]

index d29c6f2..9cf6591 100644 (file)
@@ -272,8 +272,12 @@ int oilsIsDBConnected( dbi_conn handle ) {
                        "ignored until end of transaction block\n";
                const char* msg;
                dbi_conn_error( handle, &msg );
-               if( strcmp( msg, ok_msg )) {
-                       osrfLogError( OSRF_LOG_MARK, "Database connection isn't working" );
+               // Newer versions of dbi_conn_error return codes within the error msg.
+               // E.g. 3624914: ERROR:  current transaction is aborted, commands ignored until end of transaction block
+               // Substring test should work regardless.
+               const char* substr = strstr(msg, ok_msg);
+               if( substr == NULL ) {
+                       osrfLogError( OSRF_LOG_MARK, "Database connection isn't working : %s", msg );
                        return 0;
                } else
                        return 1;   // ignoring SELECT due to previous error; that's okay
diff --git a/Open-ILS/src/perlmods/live_t/08-lp1366964-libdbi-error.t b/Open-ILS/src/perlmods/live_t/08-lp1366964-libdbi-error.t
new file mode 100644 (file)
index 0000000..3164a6c
--- /dev/null
@@ -0,0 +1,39 @@
+#!perl
+
+use Test::More tests => 2;
+
+diag("Tests libdbi transaction error reporting");
+
+use strict; use warnings;
+
+use OpenILS::Utils::TestUtils;
+use OpenILS::Utils::CStoreEditor (':funcs');
+use OpenILS::Utils::Fieldmapper;
+my $script = OpenILS::Utils::TestUtils->new();
+$script->bootstrap;
+
+my $e = new_editor(xact => 1);
+$e->init;
+
+# create a copy status object with ID 1, which will fail.
+my $stat = Fieldmapper::config::copy_status->new;
+$stat->id(1);
+
+# when functioning well, this should happen and fail quickly
+my $start = time;
+$e->create_config_copy_status($stat);
+my $evt = $e->die_event; # this part takes the longest
+my $duration = time - $start;
+
+cmp_ok($duration, '<', '10', 
+    'Confirm cstore reports standard query error in a timely fashion');
+
+if ($evt) {
+    is($evt->{textcode}, 'DATABASE_QUERY_FAILED',
+        'CStoreEditor returns standard query error');
+} else {
+    fail('CStoreEditor returned no event');
+}
+
+
+