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