r16543 - gnucash/branches/gda-dev/src - Make GDA backend (sqlite) the default if file: or no access method is

Phil Longstaff plongstaff at cvs.gnucash.org
Sun Sep 23 12:43:29 EDT 2007


Author: plongstaff
Date: 2007-09-23 12:43:27 -0400 (Sun, 23 Sep 2007)
New Revision: 16543
Trac: http://svn.gnucash.org/trac/changeset/16543

Modified:
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c
   gnucash/branches/gda-dev/src/backend/xml/gnc-backend-xml.c
   gnucash/branches/gda-dev/src/engine/gnc-engine.c
   gnucash/branches/gda-dev/src/engine/gnc-filepath-utils.c
Log:
Make GDA backend (sqlite) the default if file: or no access method is
supplied.  The XML backend is still available if the file is not an
sqlite file or if xml: is the access method.



Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2007-09-19 16:49:09 UTC (rev 16542)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2007-09-23 16:43:27 UTC (rev 16543)
@@ -30,6 +30,8 @@
 
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
 #include <libgda/libgda.h>
 
 #include "qof.h"
@@ -78,6 +80,8 @@
 
 static QofLogModule log_module = GNC_MOD_BACKEND;
 
+#define SQLITE_PROVIDER_NAME "SQLite"
+
 /* ================================================================= */
 
 static void
@@ -111,38 +115,49 @@
     ENTER (" ");
 
     be->pClient = gda_client_new();
+	be->pConnection = NULL;
 
-    /* Split book_id into provider and connection string */
+    /* Split book_id into provider and connection string.  If there's no
+	provider, use "file" */
     book_info = g_strdup( book_id );
     dsn = strchr( book_info, ':' );
-    *dsn = '\0';
-    dsn += 3;						// Skip '://'
+	if( dsn != NULL ) {
+    	*dsn = '\0';
+    	dsn += 3;						// Skip '://'
 
-	// String will be one of:
-	//
-	//    sqlite:<filename>
-	//    mysql:<dbname>
-	//    pgsql:<dbname>
-	//    @<gda_connectionname>
+		// String will be one of:
+		//
+		//    sqlite:<filename>
+		//    mysql:<dbname>
+		//    pgsql:<dbname>
+		//    @<gda_connectionname>
 
-	if( dsn[0] == '@' ) {
-	    dsn++;
+		if( dsn[0] == '@' ) {
+	    	dsn++;
 
-	    be->pConnection = gda_client_open_connection( be->pClient,
-						dsn,
-						username, password,
-						0,
-						&error );
-    } else {
+	    	be->pConnection = gda_client_open_connection( be->pClient,
+													dsn,
+													username, password,
+													0,
+													&error );
+		}
+	}
+
+	if( dsn == NULL || dsn[0] != '@' ) {
 		gchar* provider;
 		GList* provider_list;
 		GList* l;
 		gboolean provider_found;
 		
-		provider = dsn;
-	    dsn = strchr( dsn, ':' );
-		*dsn = '\0';
-		dsn++;
+		if( dsn != NULL ) {
+			provider = dsn;
+	    	dsn = strchr( dsn, ':' );
+			*dsn = '\0';
+			dsn++;
+		} else {
+			provider = SQLITE_PROVIDER_NAME;
+			dsn = book_info;
+		}
 
 		// Get a list of all of the providers.  If the requested provider is on the list, use it.
 		// Note that we need a case insensitive comparison here
@@ -164,14 +179,25 @@
 
 		    // If the provider is SQLite, split the file name into DB_DIR and
 			// DB_NAME
-			if( strcmp( provider, "SQLite" ) == 0 ) {
+			if( strcmp( provider, SQLITE_PROVIDER_NAME ) == 0 ) {
 				gchar* dirname;
 				gchar* basename;
 
 				dirname = g_path_get_dirname( dsn );
 				basename = g_path_get_basename( dsn );
-				cnc = g_strdup_printf( "DB_DIR=%s;DB_NAME=%s",
+				
+				// Remove .db from the base name if it exists
+				if( g_str_has_suffix( basename, ".db" ) ) {
+					gchar* bn = g_strdup( basename );
+					gchar* suffix = g_strrstr( bn, ".db" );
+					*suffix = '\0';
+
+					cnc = g_strdup_printf( "DB_DIR=%s;DB_NAME=%s", dirname, bn );
+					g_free( bn );
+				} else {
+					cnc = g_strdup_printf( "DB_DIR=%s;DB_NAME=%s",
 											dirname, basename );
+				}
 				g_free( dirname );
 				g_free( basename );
 			} else {
@@ -936,19 +962,74 @@
     g_free (prov);
 }
 
+/*
+ * Checks to see whether the file is an sqlite file or not
+ *
+ */
+static gboolean
+gnc_gda_check_sqlite_file(const gchar *path)
+{
+	FILE* f;
+	gchar buf[50];
+
+	// BAD if the path is null
+	if( path == NULL ) {
+		return FALSE;
+	}
+
+	if( g_str_has_suffix( path, ".db" ) ) {
+		f = g_fopen( path, "r" );
+
+		// OK if the file doesn't exist - new file
+		if( f == NULL ) {
+			return TRUE;
+		}
+
+		// OK if file has the correct header
+		fread( buf, sizeof(buf), 1, f );
+		fclose( f );
+		if( g_str_has_prefix( buf, "SQLite format" ) ) {
+			return TRUE;
+		}
+	} else {
+		f = g_fopen( path, "r" );
+
+		// BAD if the file exists - not ours
+		if( f != NULL ) {
+			fclose( f );
+			return FALSE;
+		}
+
+		// OK - new file
+		return TRUE;
+	}
+
+	// Otherwise, BAD
+	return FALSE;
+}
+
 G_MODULE_EXPORT void
 qof_backend_module_init(void)
 {
     QofBackendProvider *prov;
 
     prov = g_new0 (QofBackendProvider, 1);
-    prov->provider_name = "GnuCash LibGDA Backend (MySQL)";
+    prov->provider_name = "GnuCash LibGDA Backend";
     prov->access_method = "gda";
     prov->partial_book_supported = FALSE;
     prov->backend_new = gnc_gda_backend_new;
     prov->provider_free = gnc_gda_provider_free;
     prov->check_data_type = NULL;
     qof_backend_register_provider (prov);
+
+    prov = g_new0 (QofBackendProvider, 1);
+    prov->provider_name = "GnuCash LibGDA Backend";
+    prov->access_method = "file";
+    prov->partial_book_supported = FALSE;
+    prov->backend_new = gnc_gda_backend_new;
+    prov->provider_free = gnc_gda_provider_free;
+    prov->check_data_type = gnc_gda_check_sqlite_file;
+    qof_backend_register_provider (prov);
 }
 
 /* ========================== END OF FILE ===================== */

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c	2007-09-19 16:49:09 UTC (rev 16542)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c	2007-09-23 16:43:27 UTC (rev 16543)
@@ -159,9 +159,9 @@
         s = g_value_get_string( val );
     }
     if( table->gobj_param_name != NULL ) {
-	g_object_set( pObject, table->gobj_param_name, s, NULL );
+		g_object_set( pObject, table->gobj_param_name, s, NULL );
     } else {
-	(*setter)( pObject, (const gpointer)s );
+		(*setter)( pObject, (const gpointer)s );
     }
 }
 
@@ -173,8 +173,12 @@
     gchar* s;
 
     memset( value, 0, sizeof( GValue ) );
-    getter = get_getter( obj_name, table_row );
-    s = (gchar*)(*getter)( pObject, NULL );
+	if( table_row->gobj_param_name != NULL ) {
+		g_object_get( pObject, table_row->gobj_param_name, &s, NULL );
+	} else {
+    	getter = get_getter( obj_name, table_row );
+    	s = (gchar*)(*getter)( pObject, NULL );
+	}
     if( s ) {
         g_value_init( value, G_TYPE_STRING );
         g_value_set_string( value, s );

Modified: gnucash/branches/gda-dev/src/backend/xml/gnc-backend-xml.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/xml/gnc-backend-xml.c	2007-09-19 16:49:09 UTC (rev 16542)
+++ gnucash/branches/gda-dev/src/backend/xml/gnc-backend-xml.c	2007-09-23 16:43:27 UTC (rev 16543)
@@ -452,6 +452,12 @@
 	FILE *t;
 
 	if (!path) { return FALSE; }
+
+	// Since this can be called with "xml:" as a prefix, remove it if it exists
+	if( g_str_has_prefix( path, "xml:" ) ) {
+	    path += 4;
+	}
+
 	if (0 == safe_strcmp(path, QOF_STDOUT)) { return FALSE; }
 	t = g_fopen(path, "r");
 	if(!t) { PINFO (" new file"); return TRUE; }
@@ -461,7 +467,7 @@
 	if (sbuf.st_size == 0)    { PINFO (" empty file"); return TRUE; }
 	if(gnc_is_xml_data_file_v2(path, NULL)) { return TRUE; } 
 	else if(gnc_is_xml_data_file(path))     { return TRUE; } 
-	PINFO (" %s is not a gnc file", path);
+	PINFO (" %s is not a gnc XML file", path);
 	return FALSE;
 }	
 
@@ -1069,6 +1075,15 @@
         prov->provider_free = gnc_provider_free;
         prov->check_data_type = gnc_determine_file_type;
         qof_backend_register_provider (prov);
+
+        prov = g_new0 (QofBackendProvider, 1);
+        prov->provider_name = "GnuCash File Backend Version 2";
+        prov->access_method = "xml";
+        prov->partial_book_supported = FALSE;
+        prov->backend_new = gnc_backend_new;
+        prov->provider_free = gnc_provider_free;
+        prov->check_data_type = gnc_determine_file_type;
+        qof_backend_register_provider (prov);
 }
 
 /* ========================== END OF FILE ===================== */

Modified: gnucash/branches/gda-dev/src/engine/gnc-engine.c
===================================================================
--- gnucash/branches/gda-dev/src/engine/gnc-engine.c	2007-09-19 16:49:09 UTC (rev 16542)
+++ gnucash/branches/gda-dev/src/engine/gnc-engine.c	2007-09-23 16:43:27 UTC (rev 16543)
@@ -36,7 +36,7 @@
 #include "gnc-pricedb-p.h"
 
 /** gnc file backend library name */
-#define GNC_LIB_NAME "gncmod-backend-file"
+#define GNC_LIB_NAME "gncmod-backend-xml"
 
 /* gnc-backend-file location */
 #include "gnc-path.h"
@@ -76,8 +76,8 @@
     const gchar* lib;
     gboolean required;
   } libs[] = {
+    { "gncmod-backend-gda", TRUE },
     { GNC_LIB_NAME, TRUE },
-    { "gncmod-backend-gda", TRUE },
     /* shouldn't the PG gnc-module do this instead of US doing it? */
     { "gncmod-backend-postgres", FALSE },
     { NULL, FALSE } }, *lib;

Modified: gnucash/branches/gda-dev/src/engine/gnc-filepath-utils.c
===================================================================
--- gnucash/branches/gda-dev/src/engine/gnc-filepath-utils.c	2007-09-19 16:49:09 UTC (rev 16542)
+++ gnucash/branches/gda-dev/src/engine/gnc-filepath-utils.c	2007-09-23 16:43:27 UTC (rev 16543)
@@ -205,6 +205,10 @@
       LEAVE("filefrag is file uri");
       return g_strdup(filefrag + 5);
   }
+  if( g_ascii_strncasecmp( filefrag, "xml:", 4 ) == 0 ) {
+  	  LEAVE( "filefrag is xml file uri" );
+	  return g_strdup( filefrag + 4);
+  }
 
   /* get conservative on the length so that sprintf(getpid()) works ... */
   /* strlen ("/.LCK") + sprintf (%x%d) */
@@ -302,6 +306,9 @@
   if (!g_ascii_strncasecmp (pathfrag, "file:", 5)) {
     return (xaccResolveFilePath (pathfrag));
   }
+  if (!g_ascii_strncasecmp (pathfrag, "xml:", 4)) {
+    return (g_strdup_printf( "xml:%s", xaccResolveFilePath (pathfrag)) );
+  }
 
   return (xaccResolveFilePath (pathfrag));
 }



More information about the gnucash-changes mailing list