r17978 - gnucash/trunk/src/backend - Don't create qof backends for uri types where there is no libdbi driver installed.

Phil Longstaff plongstaff at cvs.gnucash.org
Sat Mar 7 12:36:13 EST 2009


Author: plongstaff
Date: 2009-03-07 12:36:13 -0500 (Sat, 07 Mar 2009)
New Revision: 17978
Trac: http://svn.gnucash.org/trac/changeset/17978

Modified:
   gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
   gnucash/trunk/src/backend/sql/gnc-backend-sql.c
Log:
Don't create qof backends for uri types where there is no libdbi driver installed.



Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2009-03-07 00:46:16 UTC (rev 17977)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2009-03-07 17:36:13 UTC (rev 17978)
@@ -510,7 +510,6 @@
 static void
 init_sql_backend( GncDbiBackend* dbi_be )
 {
-    static gboolean initialized = FALSE;
 	QofBackend* be;
 
     be = (QofBackend*)dbi_be;
@@ -542,34 +541,7 @@
 
     be->export = NULL;
 
-    if( !initialized ) {
-#define DEFAULT_DBD_DIR "/usr/lib/dbd"
-		const gchar* driver_dir;
-        int num_drivers;
-
-		driver_dir = g_getenv( "GNC_DBD_DIR" );
-		if( driver_dir == NULL ) {
-			PWARN( "GNC_DBD_DIR not set: using %s\n", DEFAULT_DBD_DIR );
-			driver_dir = DEFAULT_DBD_DIR;
-		}
-
-        num_drivers = dbi_initialize( driver_dir );
-		if( num_drivers == 0 ) {
-			PWARN( "No DBD drivers found\n" );
-		} else {
-			dbi_driver driver = NULL;
-			PINFO( "%d DBD drivers found\n", num_drivers );
-
-			do {
-				driver = dbi_driver_list( driver );
-				if( driver != NULL ) {
-					PINFO( "Driver: %s\n", dbi_driver_get_name( driver ) );
-				}
-			} while( driver != NULL );
-		}
-		gnc_sql_init( &dbi_be->sql_be );
-        initialized = TRUE;
-    }
+	gnc_sql_init( &dbi_be->sql_be );
 }
 
 static QofBackend*
@@ -669,40 +641,84 @@
 qof_backend_module_init(void)
 {
     QofBackendProvider *prov;
+#define DEFAULT_DBD_DIR "/usr/lib/dbd"
+	const gchar* driver_dir;
+    int num_drivers;
+	gboolean have_sqlite3_driver = FALSE;
+	gboolean have_mysql_driver = FALSE;
+	gboolean have_pgsql_driver = FALSE;
 
-    prov = g_new0 (QofBackendProvider, 1);
-    prov->provider_name = "GnuCash Libdbi (SQLITE3) Backend";
-    prov->access_method = FILE_URI_TYPE;
-    prov->partial_book_supported = FALSE;
-    prov->backend_new = gnc_dbi_backend_sqlite3_new;
-    prov->provider_free = gnc_dbi_provider_free;
-    prov->check_data_type = gnc_dbi_check_sqlite3_file;
-    qof_backend_register_provider( prov );
+	/* Initialize libdbi and see which drivers are available.  Only register qof backends which
+	   have drivers available. */
+	driver_dir = g_getenv( "GNC_DBD_DIR" );
+	if( driver_dir == NULL ) {
+		PWARN( "GNC_DBD_DIR not set: using %s\n", DEFAULT_DBD_DIR );
+		driver_dir = DEFAULT_DBD_DIR;
+	}
 
-    prov = g_new0 (QofBackendProvider, 1);
-    prov->provider_name = "GnuCash Libdbi (SQLITE3) Backend";
-    prov->access_method = SQLITE3_URI_TYPE;
-    prov->partial_book_supported = FALSE;
-    prov->backend_new = gnc_dbi_backend_sqlite3_new;
-    prov->provider_free = gnc_dbi_provider_free;
-    prov->check_data_type = gnc_dbi_check_sqlite3_file;
-    qof_backend_register_provider( prov );
+    num_drivers = dbi_initialize( driver_dir );
+	if( num_drivers == 0 ) {
+		PWARN( "No DBD drivers found\n" );
+	} else {
+		dbi_driver driver = NULL;
+		PINFO( "%d DBD drivers found\n", num_drivers );
 
-    prov = g_new0 (QofBackendProvider, 1);
-    prov->provider_name = "GnuCash Libdbi (MYSQL) Backend";
-    prov->access_method = "mysql";
-    prov->partial_book_supported = FALSE;
-    prov->backend_new = gnc_dbi_backend_mysql_new;
-    prov->provider_free = gnc_dbi_provider_free;
-    qof_backend_register_provider( prov );
+		do {
+			driver = dbi_driver_list( driver );
+			if( driver != NULL ) {
+				const gchar* name = dbi_driver_get_name( driver );
 
-    prov = g_new0 (QofBackendProvider, 1);
-    prov->provider_name = "GnuCash Libdbi (POSTGRESQL) Backend";
-    prov->access_method = "postgres";
-    prov->partial_book_supported = FALSE;
-    prov->backend_new = gnc_dbi_backend_postgres_new;
-    prov->provider_free = gnc_dbi_provider_free;
-    qof_backend_register_provider( prov );
+				PINFO( "Driver: %s\n", name );
+				if( strcmp( name, "sqlite3" ) == 0 ) {
+					have_sqlite3_driver = TRUE;
+				} else if( strcmp( name, "mysql" ) == 0 ) {
+					have_mysql_driver = TRUE;
+				} else if( strcmp( name, "pgsql" ) == 0 ) {
+					have_pgsql_driver = TRUE;
+				}
+			}
+		} while( driver != NULL );
+	}
+
+	if( have_sqlite3_driver ) {
+    	prov = g_new0 (QofBackendProvider, 1);
+    	prov->provider_name = "GnuCash Libdbi (SQLITE3) Backend";
+    	prov->access_method = FILE_URI_TYPE;
+    	prov->partial_book_supported = FALSE;
+    	prov->backend_new = gnc_dbi_backend_sqlite3_new;
+    	prov->provider_free = gnc_dbi_provider_free;
+    	prov->check_data_type = gnc_dbi_check_sqlite3_file;
+    	qof_backend_register_provider( prov );
+
+    	prov = g_new0 (QofBackendProvider, 1);
+    	prov->provider_name = "GnuCash Libdbi (SQLITE3) Backend";
+    	prov->access_method = SQLITE3_URI_TYPE;
+    	prov->partial_book_supported = FALSE;
+    	prov->backend_new = gnc_dbi_backend_sqlite3_new;
+    	prov->provider_free = gnc_dbi_provider_free;
+    	prov->check_data_type = gnc_dbi_check_sqlite3_file;
+    	qof_backend_register_provider( prov );
+	}
+
+	if( have_mysql_driver ) {
+    	prov = g_new0 (QofBackendProvider, 1);
+    	prov->provider_name = "GnuCash Libdbi (MYSQL) Backend";
+    	prov->access_method = "mysql";
+    	prov->partial_book_supported = FALSE;
+    	prov->backend_new = gnc_dbi_backend_mysql_new;
+    	prov->provider_free = gnc_dbi_provider_free;
+    	qof_backend_register_provider( prov );
+	}
+
+	if( have_pgsql_driver ) {
+    	prov = g_new0 (QofBackendProvider, 1);
+    	prov->provider_name = "GnuCash Libdbi (POSTGRESQL) Backend";
+    	prov->access_method = "postgres";
+    	prov->partial_book_supported = FALSE;
+    	prov->backend_new = gnc_dbi_backend_postgres_new;
+    	prov->provider_free = gnc_dbi_provider_free;
+    	qof_backend_register_provider( prov );
+	}
 }
 
 /* --------------------------------------------------------- */

Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.c	2009-03-07 00:46:16 UTC (rev 17977)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.c	2009-03-07 17:36:13 UTC (rev 17978)
@@ -107,8 +107,13 @@
 void
 gnc_sql_init( GncSqlBackend* be )
 {
-	register_standard_col_type_handlers();
-	gnc_sql_init_object_handlers();
+	static gboolean initialized = FALSE;
+
+	if( !initialized ) {
+		register_standard_col_type_handlers();
+		gnc_sql_init_object_handlers();
+		initialized = TRUE;
+	}
 }
 
 /* ================================================================= */



More information about the gnucash-changes mailing list