From ca4e28a2d1d8d9cabc28b68e943806d4527114ca Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Mon, 20 Oct 2014 22:55:20 -0400 Subject: [PATCH] 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 --- Open-ILS/src/c-apps/oils_sql.c | 8 +++- .../live_t/08-lp1366964-libdbi-error.t | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Open-ILS/src/perlmods/live_t/08-lp1366964-libdbi-error.t diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c index d29c6f2583..9cf65912f5 100644 --- a/Open-ILS/src/c-apps/oils_sql.c +++ b/Open-ILS/src/c-apps/oils_sql.c @@ -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 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'); +} + + + -- 2.43.2