From: Bill Erickson Date: Tue, 21 Oct 2014 02:55:20 +0000 (-0400) Subject: LP#1366964 Update libdbi connection test error parsing X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=de94a7f54a89b4c06a66cfd5ed6ab27060979fe6;p=evergreen%2Ftadl.git LP#1366964 Update libdbi connection test error parsing 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 Signed-off-by: Jason Stephenson --- diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c index 77cb12c44e..6c7d0618c2 100644 --- a/Open-ILS/src/c-apps/oils_sql.c +++ b/Open-ILS/src/c-apps/oils_sql.c @@ -271,8 +271,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 index 0000000000..3164a6c297 --- /dev/null +++ b/Open-ILS/src/perlmods/live_t/08-lp1366964-libdbi-error.t @@ -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'); +} + + +