Bug 728717 - Ubuntu 14.04 - GNUcash crashes on close

Root cause is initializing twice with a static dbi_instance. Prevent
that.
This commit is contained in:
John Ralls 2014-05-26 13:41:49 -07:00
parent f8139efad1
commit 75114b7c62

View File

@ -69,7 +69,7 @@
#if LIBDBI_VERSION >= 900 #if LIBDBI_VERSION >= 900
#define HAVE_LIBDBI_R 1 #define HAVE_LIBDBI_R 1
static dbi_inst dbi_instance; static dbi_inst dbi_instance = NULL;
#else #else
#define HAVE_LIBDBI_R 0 #define HAVE_LIBDBI_R 0
#endif #endif
@ -292,7 +292,10 @@ gnc_dbi_sqlite3_session_begin( QofBackend *qbe, QofSession *session,
} }
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
be->conn = dbi_conn_new_r( "sqlite3", dbi_instance ); if (dbi_instance)
be->conn = dbi_conn_new_r( "sqlite3", dbi_instance );
else
PERR ("Attempt to connect with an uninitialized dbi_instance");
#else #else
be->conn = dbi_conn_new( "sqlite3" ); be->conn = dbi_conn_new( "sqlite3" );
#endif #endif
@ -822,7 +825,10 @@ gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
dbi_conn_close( be->conn ); dbi_conn_close( be->conn );
} }
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
be->conn = dbi_conn_new_r( "mysql", dbi_instance ); if (dbi_instance)
be->conn = dbi_conn_new_r( "mysql", dbi_instance );
else
PERR ("Attempt to connect with an uninitialized dbi_instance");
#else #else
be->conn = dbi_conn_new( "mysql" ); be->conn = dbi_conn_new( "mysql" );
#endif #endif
@ -911,7 +917,10 @@ gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
// Try again to connect to the db // Try again to connect to the db
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
be->conn = dbi_conn_new_r( "mysql", dbi_instance ); if (dbi_instance)
be->conn = dbi_conn_new_r( "mysql", dbi_instance );
else
PERR ("Attempt to connect with an uninitialized dbi_instance");
#else #else
be->conn = dbi_conn_new( "mysql" ); be->conn = dbi_conn_new( "mysql" );
#endif #endif
@ -1168,7 +1177,10 @@ gnc_dbi_postgres_session_begin( QofBackend *qbe, QofSession *session,
} }
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
be->conn = dbi_conn_new_r( "pgsql", dbi_instance ); if (dbi_instance)
be->conn = dbi_conn_new_r( "pgsql", dbi_instance );
else
PERR ("Attempt to connect with an uninitialized dbi_instance");
#else #else
be->conn = dbi_conn_new( "pgsql" ); be->conn = dbi_conn_new( "pgsql" );
#endif #endif
@ -1259,7 +1271,10 @@ gnc_dbi_postgres_session_begin( QofBackend *qbe, QofSession *session,
// Try again to connect to the db // Try again to connect to the db
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
be->conn = dbi_conn_new_r( "pgsql", dbi_instance ); if (dbi_instance)
be->conn = dbi_conn_new_r( "pgsql", dbi_instance );
else
PERR ("Attempt to connect with an uninitialized dbi_instance");
#else #else
be->conn = dbi_conn_new( "pgsql" ); be->conn = dbi_conn_new( "pgsql" );
#endif #endif
@ -1869,6 +1884,8 @@ gnc_module_init_backend_dbi(void)
/* dbi_initialize returns -1 in case of errors */ /* dbi_initialize returns -1 in case of errors */
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
if (dbi_instance)
return;
num_drivers = dbi_initialize_r( driver_dir, &dbi_instance ); num_drivers = dbi_initialize_r( driver_dir, &dbi_instance );
#else #else
num_drivers = dbi_initialize( driver_dir ); num_drivers = dbi_initialize( driver_dir );
@ -1987,11 +2004,15 @@ qof_backend_module_finalize( void )
void void
gnc_module_finalize_backend_dbi( void ) gnc_module_finalize_backend_dbi( void )
{ {
#if HAVE_LIBDBI_R #if HAVE_LIBDBI_R
dbi_shutdown_r(dbi_instance); if (dbi_instance)
#else {
dbi_shutdown_r(dbi_instance);
dbi_instance = NULL;
}
#else
dbi_shutdown(); dbi_shutdown();
#endif #endif
} }
/* --------------------------------------------------------- */ /* --------------------------------------------------------- */