r17231 - gnucash/branches/gda-dev2/src - 1) Merge gnc-backend-sql and gnc-backend-util-sql into 1 file (gnc-backend-sql.c). This also

Phil Longstaff plongstaff at cvs.gnucash.org
Fri Jun 13 22:01:58 EDT 2008


Author: plongstaff
Date: 2008-06-13 22:01:58 -0400 (Fri, 13 Jun 2008)
New Revision: 17231
Trac: http://svn.gnucash.org/trac/changeset/17231

Removed:
   gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h
Modified:
   gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c
   gnucash/branches/gda-dev2/src/backend/sql/Makefile.am
   gnucash/branches/gda-dev2/src/backend/sql/gnc-account-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.h
   gnucash/branches/gda-dev2/src/backend/sql/gnc-book-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-budget-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-commodity-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-lots-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-price-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-recurrence-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-schedxaction-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-slots-sql.c
   gnucash/branches/gda-dev2/src/backend/sql/gnc-transaction-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/Makefile.am
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-address-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-bill-term-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-customer-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-employee-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-entry-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-invoice-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-job-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-order-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-owner-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-tax-table-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-vendor-sql.c
   gnucash/branches/gda-dev2/src/business/business-core/sql/gncmod-business-backend-sql.c
   gnucash/branches/gda-dev2/src/pixmaps/
Log:
1) Merge gnc-backend-sql and gnc-backend-util-sql into 1 file (gnc-backend-sql.c).  This also
results in a single .so.
2) Remove extraneous gnc_sql_execute_sql_command() (which just called gnc_sql_execute_select_command()).
3) Ignore some pixmaps directories



Modified: gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/dbi/gnc-backend-dbi.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -35,7 +35,6 @@
 
 #include <dbi/dbi.h>
 
-#include "gnc-backend-util-sql.h"
 #include "gnc-backend-sql.h"
 
 #include "qof.h"

Modified: gnucash/branches/gda-dev2/src/backend/sql/Makefile.am
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/Makefile.am	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/Makefile.am	2008-06-14 02:01:58 UTC (rev 17231)
@@ -1,7 +1,6 @@
 SUBDIRS = . test
 
 # Now a shared library AND a GModule
-lib_LTLIBRARIES = libgnc-backend-utils-sql.la
 pkglib_LTLIBRARIES = libgncmod-backend-sql.la
 
 
@@ -18,8 +17,8 @@
   ${GCONF_CFLAGS} \
   ${WARN_CFLAGS}
 
-libgnc_backend_utils_sql_la_SOURCES = \
-  gnc-backend-util-sql.c \
+libgncmod_backend_sql_la_SOURCES = \
+  gnc-backend-sql.c \
   gnc-account-sql.c \
   gnc-book-sql.c \
   gnc-budget-sql.c \
@@ -31,13 +30,9 @@
   gnc-slots-sql.c \
   gnc-transaction-sql.c
 
-libgncmod_backend_sql_la_SOURCES = \
-  gnc-backend-sql.c
-
 noinst_HEADERS = \
   gnc-account-sql.h \
   gnc-backend-sql.h \
-  gnc-backend-util-sql.h \
   gnc-book-sql.h \
   gnc-budget-sql.h \
   gnc-commodity-sql.h \
@@ -48,16 +43,10 @@
   gnc-slots-sql.h \
   gnc-transaction-sql.h
 
-libgnc_backend_utils_sql_la_LIBADD = \
-   ${GLIB_LIBS} ${GCONF_LIBS} \
-   ${top_builddir}/src/engine/libgncmod-engine.la \
-   ${QOF_LIBS}
-
 libgncmod_backend_sql_la_LDFLAGS = -module -avoid-version
 libgncmod_backend_sql_la_LIBADD = \
    ${GLIB_LIBS} ${GCONF_LIBS} \
    ${top_builddir}/src/engine/libgncmod-engine.la \
-   libgnc-backend-utils-sql.la \
    ${QOF_LIBS}
 
 INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.sql\"

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-account-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-account-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-account-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -35,7 +35,7 @@
 #include "AccountP.h"
 #include "gnc-commodity.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-account-sql.h"
 #include "gnc-commodity-sql.h"
@@ -189,7 +189,7 @@
     pTable = gnc_commodity_table_get_table( pBook );
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
 	if( result != NULL ) {
 	    GncSqlRow* row = gnc_sql_result_get_first_row( result );

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -26,6 +26,7 @@
  * restoring data to/from an SQL db
  */
 
+#include <stdlib.h>
 #include "config.h"
 
 #include <errno.h>
@@ -42,9 +43,10 @@
 #include "SX-book.h"
 #include "Recurrence.h"
 
-#include "gnc-backend-util-sql.h"
 #include "gnc-gconf-utils.h"
 
+#include "gnc-backend-sql.h"
+
 #include "gnc-account-sql.h"
 #include "gnc-book-sql.h"
 #include "gnc-budget-sql.h"
@@ -57,8 +59,6 @@
 #include "gnc-slots-sql.h"
 #include "gnc-transaction-sql.h"
 
-#include "gnc-backend-sql.h"
-
 static const gchar* convert_search_obj( QofIdType objType );
 static void gnc_sql_init_object_handlers( void );
 static void update_save_progress( GncSqlBackend* be );
@@ -838,4 +838,1723 @@
 {
 }
 
+static void register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version );
+static gint get_table_version( const GncSqlBackend* be, const gchar* table_name );
+
+/* ================================================================= */
+static gint64
+get_integer_value( const GValue* value )
+{
+	g_return_val_if_fail( value != NULL, 0 );
+
+	if( G_VALUE_HOLDS_INT(value) ) {
+		return g_value_get_int( value );
+	} else if( G_VALUE_HOLDS_UINT(value) ) {
+		return g_value_get_uint( value );
+	} else if( G_VALUE_HOLDS_LONG(value) ) {
+		return g_value_get_long( value );
+	} else if( G_VALUE_HOLDS_ULONG(value) ) {
+		return g_value_get_ulong( value );
+	} else if( G_VALUE_HOLDS_INT64(value) ) {
+		return g_value_get_int64( value );
+	} else if( G_VALUE_HOLDS_UINT64(value) ) {
+		return g_value_get_uint64( value );
+	} else {
+		PWARN( "Unknown type: %s", G_VALUE_TYPE_NAME( value ) );
+	}
+
+	return 0;
+}
+
+/* ----------------------------------------------------------------- */
+static gpointer
+get_autoinc_id( gpointer pObject, const QofParam* param )
+{
+    // Just need a 0 to force a new recurrence id
+    return (gpointer)0;
+}
+
+static void
+set_autoinc_id( gpointer pObject, gpointer pValue )
+{
+    // Nowhere to put the ID
+}
+
+QofAccessFunc
+gnc_sql_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row )
+{
+    QofAccessFunc getter;
+
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( table_row != NULL, NULL );
+
+	if( (table_row->flags & COL_AUTOINC) != 0 ) {
+		getter = get_autoinc_id;
+    } else if( table_row->param_name != NULL ) {
+        getter = qof_class_get_parameter_getter( obj_name,
+                                                table_row->param_name );
+    } else {
+        getter = table_row->getter;
+    }
+
+    return getter;
+}
+
+/* ----------------------------------------------------------------- */
+void
+gnc_sql_add_colname_to_list( const col_cvt_t* table_row, GList** pList )
+{
+	(*pList) = g_list_append( (*pList), g_strdup( table_row->col_name ) );
+}
+
+/* ----------------------------------------------------------------- */
+void
+gnc_sql_add_subtable_colnames_to_list( const col_cvt_t* table_row, const col_cvt_t* subtable,
+								GList** pList )
+{
+	const col_cvt_t* subtable_row;
+	gchar* buf;
+
+	for( subtable_row = subtable; subtable_row->col_name != NULL; subtable_row++ ) {
+		buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
+		(*pList) = g_list_append( (*pList), buf );
+	}
+}
+
+GncSqlColumnInfo*
+gnc_sql_create_column_info( const col_cvt_t* table_row, const gchar* type,
+							gint size )
+{
+	GncSqlColumnInfo* info;
+
+	info = g_new0( GncSqlColumnInfo, 1 );
+	info->name = table_row->col_name;
+	info->type_name = type;
+	info->size = size;
+	info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
+	info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
+
+	return info;
+}
+
+/* ----------------------------------------------------------------- */
+static void
+load_string( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    const gchar* s;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        s = NULL;
+    } else {
+        s = g_value_get_string( val );
+    }
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, s, NULL );
+    } else {
+		(*setter)( pObject, (const gpointer)s );
+    }
+}
+
+static void
+add_string_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_STRING, table_row->size ),
+				    table_row->size );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_string_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    QofAccessFunc getter;
+    gchar* s;
+	GValue* value = g_new0( GValue, 1 );
+	gchar* buf;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+    memset( value, 0, sizeof( GValue ) );
+	if( table_row->gobj_param_name != NULL ) {
+		g_object_get( pObject, table_row->gobj_param_name, &s, NULL );
+	} else {
+    	getter = gnc_sql_get_getter( obj_name, table_row );
+    	s = (gchar*)(*getter)( pObject, NULL );
+	}
+	g_value_init( value, G_TYPE_STRING );
+    if( s ) {
+        g_value_set_string( value, s );
+    } else {
+		g_value_set_string( value, "NULL" );
+	}
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t string_handler
+    = { load_string,
+		add_string_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+        add_gvalue_string_to_slist };
+/* ----------------------------------------------------------------- */
+typedef gint (*IntAccessFunc)( const gpointer );
+typedef void (*IntSetterFunc)( const gpointer, gint );
+
+static void
+load_int( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    gint int_value;
+	IntSetterFunc i_setter;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        int_value = 0;
+    } else {
+        int_value = get_integer_value( val );
+    }
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, int_value, NULL );
+    } else {
+		i_setter = (IntSetterFunc)setter;
+    	(*i_setter)( pObject, int_value );
+    }
+}
+
+static void
+add_int_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_INT, table_row->size ),
+				    0 );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_int_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    gint int_value;
+    IntAccessFunc i_getter;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	value = g_new0( GValue, 1 );
+
+    i_getter = (IntAccessFunc)gnc_sql_get_getter( obj_name, table_row );
+    int_value = (*i_getter)( pObject );
+    g_value_init( value, G_TYPE_INT );
+    g_value_set_int( value, int_value );
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t int_handler
+	= { load_int,
+		add_int_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_int_to_slist };
+/* ----------------------------------------------------------------- */
+typedef gboolean (*BooleanAccessFunc)( const gpointer );
+typedef void (*BooleanSetterFunc)( const gpointer, gboolean );
+
+static void
+load_boolean( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    gint int_value;
+	BooleanSetterFunc b_setter;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        int_value = 0;
+    } else {
+        int_value = g_value_get_int( val );
+    }
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, int_value, NULL );
+    } else {
+		b_setter = (BooleanSetterFunc)setter;
+    	(*b_setter)( pObject, int_value ? TRUE : FALSE );
+    }
+}
+
+static void
+add_boolean_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_INT, table_row->size ),
+				    0 );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_boolean_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    gint int_value;
+    BooleanAccessFunc b_getter;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+    value = g_new0( GValue, 1 );
+
+    b_getter = (BooleanAccessFunc)gnc_sql_get_getter( obj_name, table_row );
+    int_value = ((*b_getter)( pObject )) ? 1 : 0;
+    g_value_init( value, G_TYPE_INT );
+    g_value_set_int( value, int_value );
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t boolean_handler
+	= { load_boolean,
+		add_boolean_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_boolean_to_slist };
+/* ----------------------------------------------------------------- */
+typedef gint64 (*Int64AccessFunc)( const gpointer );
+typedef void (*Int64SetterFunc)( const gpointer, gint64 );
+
+static void
+load_int64( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    gint64 i64_value = 0;
+	Int64SetterFunc i64_setter = (Int64SetterFunc)setter;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( setter != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val != NULL ) {
+        i64_value = get_integer_value( val );
+    }
+    (*i64_setter)( pObject, i64_value );
+}
+
+static void
+add_int64_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_INT64, table_row->size ),
+				    0 );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_int64_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+				const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    gint64 i64_value;
+    Int64AccessFunc getter;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+    value = g_new0( GValue, 1 );
+    getter = (Int64AccessFunc)gnc_sql_get_getter( obj_name, table_row );
+    i64_value = (*getter)( pObject );
+    g_value_init( value, G_TYPE_INT64 );
+    g_value_set_int64( value, i64_value );
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t int64_handler
+	= { load_int64,
+		add_int64_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_int64_to_slist };
+/* ----------------------------------------------------------------- */
+
+static void
+load_double( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    gdouble d_value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        (*setter)( pObject, (gpointer)NULL );
+    } else {
+		if( G_VALUE_HOLDS(val, G_TYPE_INT) ) {
+			d_value = g_value_get_int( val );
+		} else {
+			d_value = g_value_get_double( val );
+		}
+        (*setter)( pObject, (gpointer)&d_value );
+    }
+}
+
+static void
+add_double_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_DOUBLE, table_row->size ),
+				    0 );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_double_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+						const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    QofAccessFunc getter;
+    gdouble* pDouble;
+    gdouble d_value;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+	value = g_new0( GValue, 1 );
+    getter = gnc_sql_get_getter( obj_name, table_row );
+    pDouble = (*getter)( pObject, NULL );
+    if( pDouble != NULL ) {
+        d_value = *pDouble;
+        g_value_init( value, G_TYPE_DOUBLE );
+        g_value_set_double( value, d_value );
+    } else {
+        g_value_init( value, G_TYPE_STRING );
+		g_value_set_string( value, "NULL" );
+	}
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t double_handler
+	= { load_double,
+		add_double_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_double_to_slist };
+/* ----------------------------------------------------------------- */
+
+static void
+load_guid( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    GUID guid;
+    const GUID* pGuid;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        pGuid = NULL;
+    } else {
+        string_to_guid( g_value_get_string( val ), &guid );
+        pGuid = &guid;
+    }
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, pGuid, NULL );
+    } else {
+		(*setter)( pObject, (const gpointer)pGuid );
+    }
+}
+
+static void
+add_guid_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row, "CHAR", GUID_ENCODING_LENGTH );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+					const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    QofAccessFunc getter;
+    const GUID* guid;
+    gchar guid_buf[GUID_ENCODING_LENGTH+1];
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    value = g_new0( GValue, 1 );
+	if( table_row->gobj_param_name != NULL ) {
+		g_object_get( pObject, table_row->gobj_param_name, &guid, NULL );
+	} else {
+    	getter = gnc_sql_get_getter( obj_name, table_row );
+    	guid = (*getter)( pObject, NULL );
+	}
+    if( guid != NULL ) {
+        (void)guid_to_string_buff( guid, guid_buf );
+        g_value_init( value, G_TYPE_STRING );
+        g_value_set_string( value, guid_buf );
+    } else {
+        g_value_init( value, G_TYPE_STRING );
+		g_value_set_string( value, "NULL" );
+	}
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t guid_handler
+	= { load_guid,
+		add_guid_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+        add_gvalue_guid_to_slist };
+/* ----------------------------------------------------------------- */
+
+void
+gnc_sql_add_gvalue_objectref_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+						const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    QofAccessFunc getter;
+    const GUID* guid = NULL;
+    gchar guid_buf[GUID_ENCODING_LENGTH+1];
+	QofInstance* inst;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+	value = g_new0( GValue, 1 );
+	if( table_row->gobj_param_name != NULL ) {
+		g_object_get( pObject, table_row->gobj_param_name, &inst, NULL );
+	} else {
+    	getter = gnc_sql_get_getter( obj_name, table_row );
+    	inst = (*getter)( pObject, NULL );
+	}
+	if( inst != NULL ) {
+		guid = qof_instance_get_guid( inst );
+	}
+    if( guid != NULL ) {
+        (void)guid_to_string_buff( guid, guid_buf );
+        g_value_init( value, G_TYPE_STRING );
+        g_value_set_string( value, guid_buf );
+    } else {
+        g_value_init( value, G_TYPE_STRING );
+		g_value_set_string( value, "NULL" );
+	}
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+void
+gnc_sql_add_objectref_guid_col_info_to_list( const GncSqlBackend* be,
+								const col_cvt_t* table_row,
+								GList** pList )
+{
+	add_guid_col_info_to_list( be, table_row, pList );
+}
+
+/* ----------------------------------------------------------------- */
+typedef Timespec (*TimespecAccessFunc)( const gpointer );
+typedef void (*TimespecSetterFunc)( const gpointer, Timespec );
+
+#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
+#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
+
+static void
+load_timespec( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    GDate* date;
+    Timespec ts = {0, 0};
+	TimespecSetterFunc ts_setter;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+	ts_setter = (TimespecSetterFunc)setter;
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+        (*ts_setter)( pObject, ts );
+    } else {
+		if( G_VALUE_HOLDS_STRING( val ) ) {
+			const gchar* s = g_value_get_string( val );
+			gchar* buf;
+			buf = g_strdup_printf( "%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
+									s[0], s[1], s[2], s[3],
+									s[4], s[5],
+									s[6], s[7],
+									s[9], s[10],
+									s[11], s[12],
+									s[13], s[14] );
+		    ts = gnc_iso8601_to_timespec_gmt( buf );
+			(*ts_setter)( pObject, ts );
+			g_free( buf );
+
+		} else {
+			PWARN( "Unknown timespec type: %s", G_VALUE_TYPE_NAME( val ) );
+        }
+    }
+}
+
+static void
+add_timespec_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					"CHAR", TIMESPEC_COL_SIZE );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_timespec_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    TimespecAccessFunc ts_getter;
+    Timespec ts;
+	gchar* datebuf;
+	time_t time;
+	struct tm tm;
+	gint year;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+    value = g_new0( GValue, 1 );
+    ts_getter = (TimespecAccessFunc)gnc_sql_get_getter( obj_name, table_row );
+    ts = (*ts_getter)( pObject );
+
+	time = timespecToTime_t( ts );
+	(void)gmtime_r( &time, &tm );	
+
+	if( tm.tm_year < 60 ) year = tm.tm_year + 2000;
+	else year = tm.tm_year + 1900;
+
+	datebuf = g_strdup_printf( TIMESPEC_STR_FORMAT,
+					year, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec );
+    g_value_init( value, G_TYPE_STRING );
+	g_value_take_string( value, datebuf );
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t timespec_handler
+	= { load_timespec,
+		add_timespec_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_timespec_to_slist };
+/* ----------------------------------------------------------------- */
+#define DATE_COL_SIZE 8
+
+static void
+load_date( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    GDate* date;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
+    if( val == NULL ) {
+		date = g_date_new_dmy( 1, 1, 1970 );
+        (*setter)( pObject, date );
+		g_date_free( date );
+    } else {
+		if( G_VALUE_HOLDS_STRING( val ) ) {
+			// Format of date is YYYYMMDD
+			const gchar* s = g_value_get_string( val );
+			gchar buf[5];
+			guint year, month, day;
+
+			strncpy( buf, &s[0], 4 );
+			buf[4] = '\0';
+			year = atoi( buf );
+			strncpy( buf, &s[4], 2 );
+			buf[2] = '\0';
+			month = atoi( buf );
+			day = atoi( &s[6] );
+
+			if( year != 0 || month != 0 || day != 0 ) {
+				date = g_date_new_dmy( day, month, year );
+				(*setter)( pObject, date );
+				g_date_free( date );
+			}
+		} else {
+			PWARN( "Unknown date type: %s", G_VALUE_TYPE_NAME( val ) );
+        }
+    }
+}
+
+static void
+add_date_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	info = gnc_sql_create_column_info( table_row,
+					"CHAR", DATE_COL_SIZE );
+
+	*pList = g_list_append( *pList, info );
+}
+
+static void
+add_gvalue_date_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+				const gpointer pObject,
+                const col_cvt_t* table_row, GSList** pList )
+{
+    GDate* date;
+    QofAccessFunc getter;
+	gchar* buf;
+	GValue* value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    value = g_new0( GValue, 1 );
+    getter = gnc_sql_get_getter( obj_name, table_row );
+    date = (GDate*)(*getter)( pObject, NULL );
+	buf = g_strdup_printf( "%04d%02d%02d",
+					g_date_get_year( date ), g_date_get_month( date ), g_date_get_day( date ) );
+    g_value_init( value, G_TYPE_STRING );
+    g_value_take_string( value, buf );
+
+	(*pList) = g_slist_append( (*pList), value );
+}
+
+static col_type_handler_t date_handler
+	= { load_date,
+		add_date_col_info_to_list,
+		gnc_sql_add_colname_to_list,
+		add_gvalue_date_to_slist };
+/* ----------------------------------------------------------------- */
+typedef gnc_numeric (*NumericGetterFunc)( const gpointer );
+typedef void (*NumericSetterFunc)( gpointer, gnc_numeric );
+
+static const col_cvt_t numeric_col_table[] =
+{
+    { "num",    CT_INT64, 0, COL_NNUL, "guid" },
+    { "denom",  CT_INT64, 0, COL_NNUL, "guid" },
+	{ NULL }
+};
+
+static void
+load_numeric( const GncSqlBackend* be, GncSqlRow* row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table_row )
+{
+    const GValue* val;
+    gchar* buf;
+    gint64 num, denom;
+    gnc_numeric n;
+    gboolean isNull = FALSE;
+	NumericSetterFunc n_setter = (NumericSetterFunc)setter;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    buf = g_strdup_printf( "%s_num", table_row->col_name );
+    val = gnc_sql_row_get_value_at_col_name( row, buf );
+    g_free( buf );
+    if( val == NULL ) {
+        isNull = TRUE;
+        num = 0;
+    } else {
+        num = get_integer_value( val );
+    }
+    buf = g_strdup_printf( "%s_denom", table_row->col_name );
+    val = gnc_sql_row_get_value_at_col_name( row, buf );
+    g_free( buf );
+    if( val == NULL ) {
+        isNull = TRUE;
+        denom = 1;
+    } else {
+        denom = get_integer_value( val );
+    }
+    n = gnc_numeric_create( num, denom );
+    if( !isNull ) {
+        (*n_setter)( pObject, n );
+    }
+}
+
+static void
+add_numeric_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
+								GList** pList )
+{
+	GncSqlColumnInfo* info;
+    gchar* buf;
+	const col_cvt_t* subtable_row;
+	const gchar* type;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( pList != NULL );
+
+	for( subtable_row = numeric_col_table; subtable_row->col_name != NULL; subtable_row++ ) {
+    	buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
+		info = g_new0( GncSqlColumnInfo, 1 );
+		info->name = buf;
+		info->type_name = gnc_sql_connection_get_column_type_name( be->conn,
+											G_TYPE_INT64, table_row->size );
+		info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
+		info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
+		*pList = g_list_append( *pList, info );
+	}
+}
+
+static void
+add_numeric_colname_to_list( const col_cvt_t* table_row, GList** pList )
+{
+	gnc_sql_add_subtable_colnames_to_list( table_row, numeric_col_table, pList );
+}
+
+static void
+add_gvalue_numeric_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+					const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
+{
+    NumericGetterFunc getter;
+    gnc_numeric n;
+    GValue* num_value;
+    GValue* denom_value;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    getter = (NumericGetterFunc)gnc_sql_get_getter( obj_name, table_row );
+    n = (*getter)( pObject );
+
+    num_value = g_new0( GValue, 1 );
+    g_value_init( num_value, G_TYPE_INT64 );
+    g_value_set_int64( num_value, gnc_numeric_num( n ) );
+    denom_value = g_new0( GValue, 1 );
+    g_value_init( denom_value, G_TYPE_INT64 );
+    g_value_set_int64( denom_value, gnc_numeric_denom( n ) );
+
+	(*pList) = g_slist_append( (*pList), num_value );
+	(*pList) = g_slist_append( (*pList), denom_value );
+}
+
+static col_type_handler_t numeric_handler
+	= { load_numeric,
+		add_numeric_col_info_to_list,
+		add_numeric_colname_to_list,
+		add_gvalue_numeric_to_slist };
+/* ================================================================= */
+
+static GHashTable* g_columnTypeHash = NULL;
+
+void
+gnc_sql_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler )
+{
+	g_return_if_fail( colType != NULL );
+	g_return_if_fail( handler != NULL );
+
+	if( g_columnTypeHash == NULL ) {
+		g_columnTypeHash = g_hash_table_new( g_str_hash, g_str_equal );
+	}
+
+	g_hash_table_insert( g_columnTypeHash, (gpointer)colType, (gpointer)handler );
+	DEBUG( "Col type %s registered\n", colType );
+}
+
+static col_type_handler_t*
+get_handler( const col_cvt_t* table_row )
+{
+    col_type_handler_t* pHandler;
+
+	g_return_val_if_fail( table_row != NULL, NULL );
+	g_return_val_if_fail( table_row->col_type != NULL, NULL );
+
+	pHandler = g_hash_table_lookup( g_columnTypeHash, table_row->col_type );
+	if( pHandler == NULL ) {
+        g_assert( FALSE );
+    }
+
+    return pHandler;
+}
+
+void
+gnc_sql_register_standard_col_type_handlers( void )
+{
+	gnc_sql_register_col_type_handler( CT_STRING, &string_handler );
+    gnc_sql_register_col_type_handler( CT_BOOLEAN, &boolean_handler );
+    gnc_sql_register_col_type_handler( CT_INT, &int_handler );
+    gnc_sql_register_col_type_handler( CT_INT64, &int64_handler );
+    gnc_sql_register_col_type_handler( CT_DOUBLE, &double_handler );
+    gnc_sql_register_col_type_handler( CT_GUID, &guid_handler );
+    gnc_sql_register_col_type_handler( CT_TIMESPEC, &timespec_handler );
+    gnc_sql_register_col_type_handler( CT_GDATE, &date_handler );
+    gnc_sql_register_col_type_handler( CT_NUMERIC, &numeric_handler );
+}
+
+void 
+_retrieve_guid_( gpointer pObject, gpointer pValue )
+{
+    GUID* pGuid = (GUID*)pObject;
+    GUID* guid = (GUID*)pValue;
+
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( pValue != NULL );
+
+	memcpy( pGuid, guid, sizeof( GUID ) );
+}
+
+
+// Table to retrieve just the guid
+static col_cvt_t guid_table[] =
+{
+    { "guid", CT_GUID, 0, 0, NULL, NULL, NULL, _retrieve_guid_ },
+    { NULL }
+};
+
+const GUID*
+gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row )
+{
+	static GUID guid;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( row != NULL, NULL );
+
+    gnc_sql_load_object( be, row, NULL, &guid, guid_table );
+
+    return &guid;
+}
+
+// Table to retrieve just the guid
+static col_cvt_t tx_guid_table[] =
+{
+    { "tx_guid", CT_GUID, 0, 0, NULL, NULL, NULL, _retrieve_guid_ },
+    { NULL }
+};
+
+const GUID*
+gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row )
+{
+    static GUID guid;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( row != NULL, NULL );
+
+    gnc_sql_load_object( be, row, NULL, &guid, tx_guid_table );
+
+    return &guid;
+}
+
+void
+gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
+                    QofIdTypeConst obj_name, gpointer pObject,
+                    const col_cvt_t* table_row )
+{
+    int col;
+    QofSetterFunc setter;
+    col_type_handler_t* pHandler;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( row != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    for( col = 0; table_row[col].col_name != NULL; col++ ) {
+		if( (table_row[col].flags & COL_AUTOINC) != 0 ) {
+			setter = set_autoinc_id;
+        } else if( table_row[col].param_name != NULL ) {
+            setter = qof_class_get_parameter_setter( obj_name,
+                                                    table_row[col].param_name );
+        } else {
+            setter = table_row[col].setter;
+        }
+        pHandler = get_handler( &table_row[col] );
+        pHandler->load_fn( be, row, setter, pObject, &table_row[col] );
+    }
+}
+
+/* ================================================================= */
+GncSqlStatement*
+gnc_sql_create_select_statement( const GncSqlBackend* be, const gchar* table_name,
+							const col_cvt_t* table_row )
+{
+	gchar* sql;
+
+	sql = g_strdup_printf( "SELECT * FROM %s", table_name );
+	return gnc_sql_create_statement_from_sql( be, sql );
+}
+
+static GncSqlStatement*
+create_single_col_select_statement( const GncSqlBackend* be,
+							const gchar* table_name,
+							const col_cvt_t* table_row )
+{
+	gchar* sql;
+
+	sql = g_strdup_printf( "SELECT %s FROM %s", table_row->col_name, table_name );
+	return gnc_sql_create_statement_from_sql( be, sql );
+}
+
+/* ================================================================= */
+gint
+gnc_sql_execute_statement( GncSqlBackend* be, GncSqlStatement* stmt )
+{
+    GError* error = NULL;
+    gint numRows;
+
+	g_return_val_if_fail( be != NULL, -1 );
+	g_return_val_if_fail( stmt != NULL, -1 );
+
+	numRows = gnc_sql_connection_execute_nonselect_statement( be->conn, stmt );
+    if( error != NULL ) {
+        PERR( "SQL error: %s\n%s\n", gnc_sql_statement_to_sql( stmt ), error->message );
+		qof_backend_set_error( &be->be, ERR_BACKEND_SERVER_ERR );
+    }
+
+    return numRows;
+}
+
+GncSqlResult*
+gnc_sql_execute_select_statement( GncSqlBackend* be, GncSqlStatement* stmt )
+{
+    GError* error = NULL;
+    GncSqlResult* result;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( stmt != NULL, NULL );
+
+    result = gnc_sql_connection_execute_select_statement( be->conn, stmt );
+    if( error != NULL ) {
+        PERR( "SQL error: %s\n%s\n", gnc_sql_statement_to_sql( stmt ), error->message );
+		qof_backend_set_error( &be->be, ERR_BACKEND_SERVER_ERR );
+    }
+
+    return result;
+}
+
+GncSqlStatement*
+gnc_sql_create_statement_from_sql( const GncSqlBackend* be, gchar* sql )
+{
+    GError* error = NULL;
+	GncSqlStatement* stmt;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( sql != NULL, NULL );
+
+	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql );
+    if( stmt == NULL ) {
+        PERR( "SQL error: %s\n%s\n", sql, error->message );
+    }
+
+	return stmt;
+}
+
+GncSqlResult*
+gnc_sql_execute_select_sql( const GncSqlBackend* be, gchar* sql )
+{
+	GncSqlStatement* stmt;
+    GError* error = NULL;
+	GncSqlResult* result = NULL;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( sql != NULL, NULL );
+
+	stmt = gnc_sql_create_statement_from_sql( be, sql );
+    if( stmt == NULL ) {
+		return NULL;
+    }
+	result = gnc_sql_connection_execute_select_statement( be->conn, stmt );
+    if( error != NULL ) {
+        PERR( "SQL error: %s\n%s\n", sql, error->message );
+    }
+
+	return result;
+}
+
+gint
+gnc_sql_execute_nonselect_sql( const GncSqlBackend* be, gchar* sql )
+{
+	GncSqlStatement* stmt;
+    GError* error = NULL;
+	gint result;
+
+	g_return_val_if_fail( be != NULL, 0 );
+	g_return_val_if_fail( sql != NULL, 0 );
+
+	stmt = gnc_sql_create_statement_from_sql( be, sql );
+    if( stmt == NULL ) {
+		return 0;
+    }
+	result = gnc_sql_connection_execute_nonselect_statement( be->conn, stmt );
+	gnc_sql_statement_dispose( stmt );
+    if( error != NULL ) {
+        PERR( "SQL error: %s\n%s\n", sql, error->message );
+    }
+	return result;
+}
+
+int
+gnc_sql_execute_select_get_count( const GncSqlBackend* be, gchar* sql )
+{
+    int count = 0;
+    GncSqlResult* result;
+
+	g_return_val_if_fail( be != NULL, 0 );
+	g_return_val_if_fail( sql != NULL, 0 );
+
+    result = gnc_sql_execute_select_sql( be, sql );
+    if( result != NULL ) {
+        count = gnc_sql_result_get_num_rows( result );
+		gnc_sql_result_dispose( result );
+    }
+
+    return count;
+}
+
+int
+gnc_sql_execute_statement_get_count( GncSqlBackend* be, GncSqlStatement* stmt )
+{
+    GncSqlResult* result;
+	int count = 0;
+
+	g_return_val_if_fail( be != NULL, 0 );
+	g_return_val_if_fail( stmt != NULL, 0 );
+
+    result = gnc_sql_execute_select_statement( be, stmt );
+    if( result != NULL ) {
+        count = gnc_sql_result_get_num_rows( result );
+		gnc_sql_result_dispose( result );
+    }
+
+    return count;
+}
+
+guint
+gnc_sql_append_guid_list_to_sql( GString* sql, GList* list, guint maxCount )
+{
+	gchar guid_buf[GUID_ENCODING_LENGTH+1];
+	gboolean first_guid = TRUE;
+	guint count;
+
+	g_return_val_if_fail( sql != NULL, 0 );
+
+	if( list == NULL ) return 0;
+
+	for( count = 0; list != NULL && count < maxCount; list = list->next, count++ ) {
+		QofInstance* inst = QOF_INSTANCE(list->data);
+    	guid_to_string_buff( qof_instance_get_guid( inst ), guid_buf );
+
+		if( !first_guid ) {
+			g_string_append( sql, "," );
+		}
+		g_string_append( sql, "'" );
+		g_string_append( sql, guid_buf );
+		g_string_append( sql, "'" );
+		first_guid = FALSE;
+    }
+
+	return count;
+}
+/* ================================================================= */
+
+gboolean
+gnc_sql_object_is_it_in_db( GncSqlBackend* be, const gchar* table_name,
+                    QofIdTypeConst obj_name, gpointer pObject,
+                    const col_cvt_t* table )
+{
+    GncSqlStatement* sqlStmt;
+    int count;
+    col_type_handler_t* pHandler;
+	GSList* list = NULL;
+
+	g_return_val_if_fail( be != NULL, FALSE );
+	g_return_val_if_fail( table_name != NULL, FALSE );
+	g_return_val_if_fail( obj_name != NULL, FALSE );
+	g_return_val_if_fail( pObject != NULL, FALSE );
+	g_return_val_if_fail( table != NULL, FALSE );
+
+    /* SELECT * FROM */
+    sqlStmt = create_single_col_select_statement( be, table_name, table );
+
+    /* WHERE */
+    pHandler = get_handler( table );
+	pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table, &list );
+	gnc_sql_statement_add_where_cond( sqlStmt, obj_name, pObject, &table[0], (GValue*)(list->data) );
+
+    count = gnc_sql_execute_statement_get_count( be, sqlStmt );
+	gnc_sql_statement_dispose( sqlStmt );
+    if( count == 0 ) {
+        return FALSE;
+    } else {
+        return TRUE;
+    }
+}
+
+gboolean
+gnc_sql_do_db_operation( GncSqlBackend* be,
+                        E_DB_OPERATION op,
+                        const gchar* table_name,
+                        QofIdTypeConst obj_name, gpointer pObject,
+                        const col_cvt_t* table )
+{
+    GncSqlStatement* sqlStmt;
+
+	g_return_val_if_fail( be != NULL, FALSE );
+	g_return_val_if_fail( table_name != NULL, FALSE );
+	g_return_val_if_fail( obj_name != NULL, FALSE );
+	g_return_val_if_fail( pObject != NULL, FALSE );
+	g_return_val_if_fail( table != NULL, FALSE );
+
+    if( op == OP_DB_ADD_OR_UPDATE ) {
+        if( gnc_sql_object_is_it_in_db( be, table_name, obj_name, pObject, table ) ) {
+            sqlStmt = gnc_sql_build_update_statement( be, table_name, obj_name, pObject, table );
+        } else {
+            sqlStmt = gnc_sql_build_insert_statement( be, table_name, obj_name, pObject, table );
+        }
+    } else if( op == OP_DB_DELETE ) {
+        sqlStmt = gnc_sql_build_delete_statement( be, table_name, obj_name, pObject, table );
+    } else if( op == OP_DB_ADD ) {
+        sqlStmt = gnc_sql_build_insert_statement( be, table_name, obj_name, pObject, table );
+    } else {
+        g_assert( FALSE );
+    }
+    if( sqlStmt != NULL ) {
+        gnc_sql_execute_statement( be, sqlStmt );
+		gnc_sql_statement_dispose( sqlStmt );
+
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+static GSList*
+create_gslist_from_values( GncSqlBackend* be,
+                            QofIdTypeConst obj_name, gpointer pObject,
+                            const col_cvt_t* table )
+{
+	GSList* list = NULL;
+	col_type_handler_t* pHandler;
+	const col_cvt_t* table_row;
+
+    for( table_row = table; table_row->col_name != NULL; table_row++ ) {
+		if(( table_row->flags & COL_AUTOINC ) == 0 ) {
+    		pHandler = get_handler( table_row );
+			pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table_row, &list );
+		}
+    }
+
+	return list;
+}
+
+gchar*
+gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value )
+{
+	if( value != NULL && G_IS_VALUE( value ) ) {
+		if( G_VALUE_HOLDS_STRING(value) ) {
+			gchar *before_str;
+			gchar* after_str;
+			before_str = g_value_dup_string( value );
+			after_str = gnc_sql_connection_quote_string( conn, before_str );
+			g_free( before_str );
+			return after_str;
+		} else if( g_value_type_transformable( G_VALUE_TYPE(value), G_TYPE_STRING ) ) {
+			GValue *string;
+			gchar *str;
+			
+			string = g_value_init( g_new0( GValue, 1 ), G_TYPE_STRING );
+			g_value_transform( value, string );
+			str = g_value_dup_string( string );
+			g_value_unset( string );
+			g_free( string );
+			return str;
+		} else {
+			PWARN( "not transformable, gtype = '%s'\n", g_type_name( G_VALUE_TYPE(value) ) );
+			return "$$$";
+		}
+	} else {
+		PWARN( "value is NULL or not G_IS_VALUE()\n" );
+		return "";
+	}
+}
+
+GncSqlStatement*
+gnc_sql_build_insert_statement( GncSqlBackend* be,
+                            const gchar* table_name,
+                            QofIdTypeConst obj_name, gpointer pObject,
+                            const col_cvt_t* table )
+{
+	GncSqlStatement* stmt;
+	GString* sql;
+	GSList* values;
+	GSList* node;
+	gchar* sqlbuf;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( table_name != NULL, NULL );
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( table != NULL, NULL );
+
+	sqlbuf = g_strdup_printf( "INSERT INTO %s VALUES(", table_name );
+	sql = g_string_new( sqlbuf );
+	g_free( sqlbuf );
+	values = create_gslist_from_values( be, obj_name, pObject, table );
+	for( node = values; node != NULL; node = node->next ) {
+		GValue* value = (GValue*)node->data;
+		gchar* value_str;
+		if( node != values ) {
+			g_string_append( sql, "," );
+		}
+		value_str = gnc_sql_get_sql_value( be->conn, value );
+		g_string_append( sql, value_str );
+		g_free( value_str );
+		g_value_reset( value );
+		g_free( value );
+	}
+	g_slist_free( values );
+	g_string_append( sql, ")" );
+
+	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
+	return stmt;
+}
+
+GncSqlStatement*
+gnc_sql_build_update_statement( GncSqlBackend* be,
+                            const gchar* table_name,
+                            QofIdTypeConst obj_name, gpointer pObject,
+                            const col_cvt_t* table )
+{
+	GncSqlStatement* stmt;
+	GString* sql;
+	GSList* values;
+	GList* colnames = NULL;
+	GSList* value;
+	GList* colname;
+	gboolean firstCol;
+	const col_cvt_t* table_row = table;
+	gchar* sqlbuf;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( table_name != NULL, NULL );
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( table != NULL, NULL );
+
+    // Get all col names and all values
+	for( ; table_row->col_name != NULL; table_row++ ) {
+    	col_type_handler_t* pHandler;
+
+		// Add col names to the list
+		pHandler = get_handler( table_row );
+		pHandler->add_colname_to_list_fn( table_row, &colnames );
+	}
+	values = create_gslist_from_values( be, obj_name, pObject, table );
+
+	// Create the SQL statement
+	sqlbuf = g_strdup_printf( "UPDATE %s SET ", table_name );
+	sql = g_string_new( sqlbuf );
+	g_free( sqlbuf );
+
+	firstCol = TRUE;
+	for( colname = colnames->next, value = values->next;
+					colname != NULL && value != NULL;
+					colname = colname->next, value = value->next ) {
+		gchar* value_str;
+		if( !firstCol ) {
+			g_string_append( sql, "," );
+		}
+		g_string_append( sql, (gchar*)colname->data );
+		g_string_append( sql, "=" );
+		value_str = gnc_sql_get_sql_value( be->conn, (GValue*)(value->data) );
+		g_string_append( sql, value_str );
+		g_free( value_str );
+		firstCol = FALSE;
+	}
+	g_list_free( colnames );
+	if( value != NULL || colname != NULL ) {
+		PERR( "Mismatch in number of column names and values" );
+	}
+
+	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
+	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(values->data) );
+	g_slist_free( values );
+
+	return stmt;
+}
+
+GncSqlStatement*
+gnc_sql_build_delete_statement( GncSqlBackend* be,
+                            const gchar* table_name,
+                            QofIdTypeConst obj_name, gpointer pObject,
+                            const col_cvt_t* table )
+{
+	GncSqlStatement* stmt;
+	GString* sql;
+    col_type_handler_t* pHandler;
+	GSList* list = NULL;
+	gchar* sqlbuf;
+
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( table_name != NULL, NULL );
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( table != NULL, NULL );
+
+	sqlbuf = g_strdup_printf( "DELETE FROM %s ", table_name );
+	sql = g_string_new( sqlbuf );
+	g_free( sqlbuf );
+	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
+
+    /* WHERE */
+    pHandler = get_handler( table );
+	pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table, &list );
+	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(list->data) );
+
+	return stmt;
+}
+
+/* ================================================================= */
+
+static gboolean
+create_table( const GncSqlBackend* be, const gchar* table_name,
+				const col_cvt_t* col_table, GError** pError )
+{
+	GList* col_info_list = NULL;
+    
+	g_return_val_if_fail( be != NULL, FALSE );
+	g_return_val_if_fail( table_name != NULL, FALSE );
+	g_return_val_if_fail( col_table != NULL, FALSE );
+	g_return_val_if_fail( pError != NULL, FALSE );
+    
+    for( ; col_table->col_name != NULL; col_table++ ) {
+        col_type_handler_t* pHandler;
+
+        pHandler = get_handler( col_table );
+        pHandler->add_col_info_to_list_fn( be, col_table, &col_info_list );
+    }
+	gnc_sql_connection_create_table( be->conn, table_name, col_info_list );
+	return TRUE;
+}
+
+gboolean
+gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
+					gint table_version, const col_cvt_t* col_table, GError** error )
+{
+	gboolean ok;
+
+	ok = create_table( be, table_name, col_table, error );
+	if( ok ) {
+		register_table_version( be, table_name, table_version );
+	}
+	return ok;
+}
+
+void
+gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
+					const gchar* table_name,
+                    const col_cvt_t* col_table )
+{
+    g_return_if_fail( be != NULL );
+	g_return_if_fail( index_name != NULL );
+	g_return_if_fail( table_name != NULL );
+	g_return_if_fail( col_table != NULL );
+    
+	gnc_sql_connection_create_index( be->conn, index_name, table_name,
+								col_table );
+}
+
+gint
+gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name )
+{
+	g_return_val_if_fail( be != NULL, 0 );
+	g_return_val_if_fail( table_name != NULL, 0 );
+
+	/* If the db is pristine because it's being saved, the table does not
+	 * exist.  This gets around a GDA-3 bug where deleting all tables and
+	 * updating the meta-data leaves the meta-data still thinking 1 table
+	 * exists.
+	 */
+	if( be->is_pristine_db ) {
+		return 0;
+	}
+
+	return get_table_version( be, table_name );
+	}
+
+/* ================================================================= */
+#define VERSION_TABLE_NAME "versions"
+#define MAX_TABLE_NAME_LEN 50
+#define TABLE_COL_NAME "table_name"
+#define VERSION_COL_NAME "table_version"
+
+static col_cvt_t version_table[] =
+{
+    { TABLE_COL_NAME,   CT_STRING, MAX_TABLE_NAME_LEN },
+	{ VERSION_COL_NAME, CT_INT },
+    { NULL }
+};
+
+/**
+ * Sees if the version table exists, and if it does, loads the info into
+ * the version hash table.  Otherwise, it creates an empty version table.
+ *
+ * @param be Backend struct
+ */
+void
+gnc_sql_init_version_info( GncSqlBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+	be->versions = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );
+
+	if( gnc_sql_connection_does_table_exist( be->conn, VERSION_TABLE_NAME ) ) {
+		GncSqlResult* result;
+		gchar* sql;
+
+		sql = g_strdup_printf( "SELECT * FROM %s", VERSION_TABLE_NAME );
+		result = gnc_sql_execute_select_sql( be, sql );
+		if( result != NULL ) {
+			const GValue* name;
+			const GValue* version;
+			GncSqlRow* row;
+
+			row = gnc_sql_result_get_first_row( result );
+			while( row != NULL ) {
+    			name = gnc_sql_row_get_value_at_col_name( row, TABLE_COL_NAME );
+				version = gnc_sql_row_get_value_at_col_name( row, VERSION_COL_NAME );
+				g_hash_table_insert( be->versions,
+									g_strdup( g_value_get_string( name ) ),
+									GINT_TO_POINTER(g_value_get_int( version )) );
+				row = gnc_sql_result_get_next_row( result );
+			}
+			gnc_sql_result_dispose( result );
+		}
+	} else {
+		gboolean ok;
+		GError* error = NULL;
+
+		ok = create_table( be, VERSION_TABLE_NAME, version_table, &error );
+		if( error != NULL ) {
+			PERR( "Error creating versions table: %s\n", error->message );
+		}
+	}
+}
+
+/**
+ * Resets the version table information by removing all version table info.
+ * It also recreates the version table in the db.
+ *
+ * @param be Backend struct
+ */
+void
+gnc_sql_reset_version_info( GncSqlBackend* be )
+{
+	gboolean ok;
+	GError* error = NULL;
+
+	g_return_if_fail( be != NULL );
+
+	ok = create_table( be, VERSION_TABLE_NAME, version_table, &error );
+	if( error != NULL ) {
+		PERR( "Error creating versions table: %s\n", error->message );
+	}
+	if( be->versions == NULL ) {
+		be->versions = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );
+	} else {
+		g_hash_table_remove_all( be->versions );
+	}
+}
+
+/**
+ * Finalizes the version table info by destroying the hash table.
+ *
+ * @param be Backend struct
+ */
+void
+gnc_sql_finalize_version_info( GncSqlBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+	g_hash_table_destroy( be->versions );
+}
+
+/**
+ * Registers the version for a table.  Registering involves updating the
+ * db version table and also the hash table.
+ *
+ * @param be Backend struct
+ * @param table_name Table name
+ * @param version Version number
+ */
+static void
+register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version )
+{
+	gchar* sql;
+	gint cur_version;
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( table_name != NULL );
+	g_return_if_fail( version > 0 );
+
+	cur_version = get_table_version( be, table_name );
+	if( cur_version != version ) {
+		if( cur_version == 0 ) {
+			sql = g_strdup_printf( "INSERT INTO %s VALUES('%s',%d)", VERSION_TABLE_NAME,
+								table_name, version );
+		} else {
+			sql = g_strdup_printf( "UPDATE %s SET %s=%d WHERE %s='%s'", VERSION_TABLE_NAME,
+								VERSION_COL_NAME, version,
+								TABLE_COL_NAME, table_name );
+		}
+		(void)gnc_sql_execute_nonselect_sql( be, sql );
+	}
+
+	g_hash_table_insert( be->versions, g_strdup( table_name ), GINT_TO_POINTER(version) );
+}
+
+/**
+ * Returns the registered version number for a table.
+ *
+ * @param be Backend struct
+ * @param table_name Table name
+ * @return Version number
+ */
+static gint
+get_table_version( const GncSqlBackend* be, const gchar* table_name )
+{
+	g_return_val_if_fail( be != NULL, 0 );
+	g_return_val_if_fail( table_name != NULL, 0 );
+
+	return GPOINTER_TO_INT(g_hash_table_lookup( be->versions, table_name ));
+}
 /* ========================== END OF FILE ===================== */

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.h	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-sql.h	2008-06-14 02:01:58 UTC (rev 17231)
@@ -52,8 +52,29 @@
 #ifndef GNC_BACKEND_SQL_H_
 #define GNC_BACKEND_SQL_H_
 
+#include "qof.h"
+#include "qofbackend-p.h"
 #include <gmodule.h>
 
+typedef struct GncSqlConnection GncSqlConnection;
+struct GncSqlBackend_struct
+{
+  QofBackend be;
+
+  GncSqlConnection* conn;
+
+  QofBook *primary_book;	/* The primary, main open book */
+  gboolean	loading;		/* We are performing an initial load */
+  gboolean  in_query;
+  gboolean  supports_transactions;
+  gboolean  is_pristine_db;	// Are we saving to a new pristine db?
+
+  gint obj_total;			// Total # of objects (for percentage calculation)
+  gint operations_done;		// Number of operations (save/load) done
+  GHashTable* versions;		// Version number for each table
+};
+typedef struct GncSqlBackend_struct GncSqlBackend;
+
 /**
  * Initialize the SQL backend.
  *
@@ -101,6 +122,262 @@
  */
 void gnc_sql_commit_edit( GncSqlBackend* qbe, QofInstance *inst );
 
+/**
+ */
+typedef struct col_cvt col_cvt_t;
+typedef struct GncSqlStatement GncSqlStatement;
+typedef struct GncSqlResult GncSqlResult;
+typedef struct GncSqlRow GncSqlRow;
+
+/**
+ *@struct GncSqlStatement
+ */
+struct GncSqlStatement
+{
+	void (*dispose)( GncSqlStatement* );
+	gchar* (*toSql)( GncSqlStatement* );
+	void (*addWhereCond)( GncSqlStatement*, QofIdTypeConst, gpointer, const col_cvt_t*, GValue* );
+};
+#define gnc_sql_statement_dispose(STMT) \
+		(STMT)->dispose(STMT)
+#define gnc_sql_statement_to_sql(STMT) \
+		(STMT)->toSql(STMT)
+#define gnc_sql_statement_add_where_cond(STMT,TYPENAME,OBJ,COLDESC,VALUE) \
+		(STMT)->addWhereCond(STMT, TYPENAME, OBJ, COLDESC, VALUE)
+
+/**
+ * @struct GncSqlColumnInfo
+ */
+typedef struct {
+	const gchar* name;
+	const gchar* type_name;
+	gint size;
+	gboolean is_primary_key;
+	gboolean null_allowed;
+} GncSqlColumnInfo;
+
+/**
+ * @struct GncSqlConnection
+ */
+struct GncSqlConnection
+{
+	void (*dispose)( GncSqlConnection* );
+	GncSqlResult* (*executeSelectStatement)( GncSqlConnection*, GncSqlStatement* );
+	gint (*executeNonSelectStatement)( GncSqlConnection*, GncSqlStatement* );
+	GncSqlStatement* (*createStatementFromSql)( GncSqlConnection*, gchar* );
+	gboolean (*doesTableExist)( GncSqlConnection*, const gchar* );
+	void (*beginTransaction)( GncSqlConnection* );
+	void (*rollbackTransaction)( GncSqlConnection* );
+	void (*commitTransaction)( GncSqlConnection* );
+	const gchar* (*getColumnTypeName)( GncSqlConnection*, GType, gint size );
+	void (*createTable)( GncSqlConnection*, const gchar*, const GList* );
+	void (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const col_cvt_t* );
+	gchar* (*quoteString)( const GncSqlConnection*, gchar* );
+};
+#define gnc_sql_connection_dispose(CONN) (CONN)->dispose(CONN)
+#define gnc_sql_connection_execute_select_statement(CONN,STMT) \
+		(CONN)->executeSelectStatement(CONN,STMT)
+#define gnc_sql_connection_execute_nonselect_statement(CONN,STMT) \
+		(CONN)->executeNonSelectStatement(CONN,STMT)
+#define gnc_sql_connection_create_statement_from_sql(CONN,SQL) \
+		(CONN)->createStatementFromSql(CONN,SQL)
+#define gnc_sql_connection_does_table_exist(CONN,NAME) \
+		(CONN)->doesTableExist(CONN,NAME)
+#define gnc_sql_connection_begin_transaction(CONN) \
+		(CONN)->beginTransaction(CONN)
+#define gnc_sql_connection_rollback_transaction(CONN) \
+		(CONN)->rollbackTransaction(CONN)
+#define gnc_sql_connection_commit_transaction(CONN) \
+		(CONN)->commitTransaction(CONN)
+#define gnc_sql_connection_get_column_type_name(CONN,TYPE,SIZE) \
+		(CONN)->getColumnTypeName(CONN,TYPE,SIZE)
+#define gnc_sql_connection_create_table(CONN,NAME,COLLIST) \
+		(CONN)->createTable(CONN,NAME,COLLIST)
+#define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
+		(CONN)->createIndex(CONN,INDEXNAME,TABLENAME,COLTABLE)
+#define gnc_sql_connection_quote_string(CONN,STR) \
+		(CONN)->quoteString(CONN,STR)
+
+struct GncSqlRow
+{
+	const GValue* (*getValueAtColName)( GncSqlRow*, const gchar* );
+	void (*dispose)( GncSqlRow* );
+};
+#define gnc_sql_row_get_value_at_col_name(ROW,N) \
+		(ROW)->getValueAtColName(ROW,N)
+#define gnc_sql_row_dispose(ROW) \
+		(ROW)->dispose(ROW)
+
+struct GncSqlResult
+{
+	int (*getNumRows)( GncSqlResult* );
+    GncSqlRow* (*getFirstRow)( GncSqlResult* );
+	GncSqlRow* (*getNextRow)( GncSqlResult* );
+	void (*dispose)( GncSqlResult* );
+};
+#define gnc_sql_result_get_num_rows(RESULT) \
+		(RESULT)->getNumRows(RESULT)
+#define gnc_sql_result_get_first_row(RESULT) \
+		(RESULT)->getFirstRow(RESULT)
+#define gnc_sql_result_get_next_row(RESULT) \
+		(RESULT)->getNextRow(RESULT)
+#define gnc_sql_result_dispose(RESULT) \
+		(RESULT)->dispose(RESULT)
+
+/**
+ * Struct used to pass in a new data type for GDA storage.  This contains
+ * the set of callbacks to read and write GDA for new data objects..  New
+ * types should register an instance of this object with the engine.
+ *
+ * commit()			- commit an object to the db
+ * initial_load()	- load stuff when new db opened
+ * create_tables()  - create any db tables
+ * compile_query()  - compile a backend object query
+ * run_query()      - run a compiled query
+ * free_query()     - free a compiled query
+ * write()          - write all objects
+ */
+#define GNC_SQL_BACKEND             "gnc:sql:1"
+#define GNC_SQL_BACKEND_VERSION	1
+typedef struct
+{
+  int		version;	/* backend version number */
+  const gchar *	type_name;	/* The XML tag for this type */
+
+  void		(*commit)( QofInstance* inst, GncSqlBackend* be );
+  void		(*initial_load)( GncSqlBackend* pBackend );
+  void		(*create_tables)( GncSqlBackend* pBackend );
+  gpointer	(*compile_query)( GncSqlBackend* pBackend, QofQuery* pQuery );
+  void		(*run_query)( GncSqlBackend* pBackend, gpointer pQuery );
+  void		(*free_query)( GncSqlBackend* pBackend, gpointer pQuery );
+  void		(*write)( GncSqlBackend* pBackend );
+} GncSqlDataType_t;
+
+// Type for conversion of db row to object.
+#define CT_STRING "ct_string"
+#define CT_GUID "ct_guid"
+#define CT_INT "ct_int"
+#define CT_INT64 "ct_int64"
+#define CT_TIMESPEC "ct_timespec"
+#define CT_GDATE "ct_gdate"
+#define CT_NUMERIC "ct_numeric"
+#define CT_DOUBLE "ct_double"
+#define CT_BOOLEAN "ct_boolean"
+#define CT_ACCOUNTREF "ct_accountref"
+#define CT_COMMODITYREF "ct_commodityref"
+#define CT_TXREF "ct_txref"
+#define CT_LOTREF "ct_lotref"
+
+struct col_cvt {
+	const gchar* col_name;
+	const gchar* col_type;
+	gint size;
+#define COL_PKEY	0x01
+#define COL_NNUL	0x02
+#define COL_UNIQUE	0x04
+#define COL_AUTOINC	0x08
+	gint flags;
+	const gchar* gobj_param_name;	// If non-null, use g_object_get/g_object_set
+	const gchar* param_name;	// If non null, use qof getter/setter
+	QofAccessFunc getter;
+	QofSetterFunc setter;
+};
+
+typedef enum {
+	OP_DB_ADD,
+	OP_DB_ADD_OR_UPDATE,
+	OP_DB_DELETE
+} E_DB_OPERATION;
+
+typedef void (*GNC_SQL_LOAD_FN)( const GncSqlBackend* be,
+								GncSqlRow* row,
+                                QofSetterFunc setter, gpointer pObject,
+                                const col_cvt_t* table );
+typedef void (*GNC_SQL_ADD_COL_INFO_TO_LIST_FN)( const GncSqlBackend* be,
+                        						const col_cvt_t* table_row,
+												GList** pList );
+typedef void (*GNC_SQL_ADD_COLNAME_TO_LIST_FN)( const col_cvt_t* table_row, GList** pList );
+typedef void (*GNC_SQL_ADD_GVALUE_TO_SLIST_FN)( const GncSqlBackend* be,
+                QofIdTypeConst obj_name, const gpointer pObject,
+                const col_cvt_t* table_row, GSList** pList );
+
+typedef struct {
+    GNC_SQL_LOAD_FN                 load_fn;
+    GNC_SQL_ADD_COL_INFO_TO_LIST_FN add_col_info_to_list_fn;
+    GNC_SQL_ADD_COLNAME_TO_LIST_FN  add_colname_to_list_fn;
+	GNC_SQL_ADD_GVALUE_TO_SLIST_FN	add_gvalue_to_slist_fn;
+} col_type_handler_t;
+
+GncSqlColumnInfo* gnc_sql_create_column_info( const col_cvt_t* table_row, const gchar* type, gint size );
+QofAccessFunc gnc_sql_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row );
+
+void gnc_sql_add_colname_to_list( const col_cvt_t* table_row, GList** pList );
+
+gboolean gnc_sql_do_db_operation( GncSqlBackend* pBackend,
+									E_DB_OPERATION op,
+									const gchar* table_name,
+									QofIdTypeConst obj_name,
+									gpointer pObject,
+									const col_cvt_t* table );
+GncSqlStatement* gnc_sql_build_insert_statement( GncSqlBackend* pBackend,
+									const gchar* table_name,
+									QofIdTypeConst obj_name,
+									gpointer pObject,
+									const col_cvt_t* table );
+GncSqlStatement* gnc_sql_build_update_statement( GncSqlBackend* pBackend,
+									const gchar* table_name,
+									QofIdTypeConst obj_name,
+									gpointer pObject,
+									const col_cvt_t* table );
+GncSqlStatement* gnc_sql_build_delete_statement( GncSqlBackend* pBackend,
+									const gchar* table_name,
+									QofIdTypeConst obj_name,
+									gpointer pObject,
+									const col_cvt_t* table );
+gint gnc_sql_execute_statement( GncSqlBackend* pBackend, GncSqlStatement* statement );
+GncSqlResult* gnc_sql_execute_select_statement( GncSqlBackend* pBackend, GncSqlStatement* statement );
+GncSqlResult* gnc_sql_execute_select_sql( const GncSqlBackend* pBackend, gchar* sql );
+gint gnc_sql_execute_nonselect_sql( const GncSqlBackend* pBackend, gchar* sql );
+GncSqlStatement* gnc_sql_create_statement_from_sql( const GncSqlBackend* pBackend, gchar* sql );
+int gnc_sql_execute_select_get_count( const GncSqlBackend* pBackend, gchar* sql );
+int gnc_sql_execute_statement_get_count( GncSqlBackend* pBackend, GncSqlStatement* statement );
+void gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
+						QofIdTypeConst obj_name, gpointer pObject,
+						const col_cvt_t* table );
+gboolean gnc_sql_object_is_it_in_db( GncSqlBackend* be,
+									const gchar* table_name,
+									QofIdTypeConst obj_name, const gpointer pObject,
+									const col_cvt_t* table );
+gint gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name );
+gboolean gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
+								gint table_version, const col_cvt_t* col_table,
+						GError** error );
+void gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
+						const gchar* table_name, const col_cvt_t* col_table );
+const GUID* gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row );
+const GUID* gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row );
+GncSqlStatement* gnc_sql_create_select_statement( const GncSqlBackend* be, const gchar* table_name,
+										const col_cvt_t* col_table );
+void gnc_sql_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler );
+void gnc_sql_register_standard_col_type_handlers( void );
+
+void gnc_sql_add_gvalue_objectref_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GSList** pList );
+void gnc_sql_add_objectref_guid_col_info_to_list( const GncSqlBackend* be,
+	            const col_cvt_t* table_row, GList** pList );
+guint gnc_sql_append_guid_list_to_sql( GString* str, GList* list, guint maxCount );
+void gnc_sql_add_subtable_colnames_to_list( const col_cvt_t* table_row, const col_cvt_t* subtable,
+								GList** pList );
+gchar* gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value );
+
+void _retrieve_guid_( gpointer pObject, gpointer pValue );
+void gnc_sql_init_version_info( GncSqlBackend* be );
+void gnc_sql_reset_version_info( GncSqlBackend* be );
+void gnc_sql_finalize_version_info( GncSqlBackend* be );
+
+G_MODULE_EXPORT const gchar *
+g_module_check_init( GModule *module );
+
 G_MODULE_EXPORT void
 qof_backend_module_init(void);
 

Deleted: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -1,1771 +0,0 @@
-/********************************************************************
- * gnc-backend-util-sql.c: load and save data to SQL                *
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-/** @file gnc-backend-util-sql.c
- *  @brief load and save data to SQL - utility functions
- *  @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff at rogers.com>
- *
- * This file contains utility routines to support saving/restoring
- * data to/from an SQL db
- */
-
-#include <stdlib.h>
-#include "config.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-#include "qof.h"
-#include "qofquery-p.h"
-#include "qofquerycore-p.h"
-#include "TransLog.h"
-#include "gnc-engine.h"
-
-#include "gnc-backend-util-sql.h"
-#include "gnc-gconf-utils.h"
-
-static QofLogModule log_module = G_LOG_DOMAIN;
-
-static void register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version );
-static gint get_table_version( const GncSqlBackend* be, const gchar* table_name );
-
-/* ================================================================= */
-static gint64
-get_integer_value( const GValue* value )
-{
-	g_return_val_if_fail( value != NULL, 0 );
-
-	if( G_VALUE_HOLDS_INT(value) ) {
-		return g_value_get_int( value );
-	} else if( G_VALUE_HOLDS_UINT(value) ) {
-		return g_value_get_uint( value );
-	} else if( G_VALUE_HOLDS_LONG(value) ) {
-		return g_value_get_long( value );
-	} else if( G_VALUE_HOLDS_ULONG(value) ) {
-		return g_value_get_ulong( value );
-	} else if( G_VALUE_HOLDS_INT64(value) ) {
-		return g_value_get_int64( value );
-	} else if( G_VALUE_HOLDS_UINT64(value) ) {
-		return g_value_get_uint64( value );
-	} else {
-		PWARN( "Unknown type: %s", G_VALUE_TYPE_NAME( value ) );
-	}
-
-	return 0;
-}
-
-/* ----------------------------------------------------------------- */
-static gpointer
-get_autoinc_id( gpointer pObject, const QofParam* param )
-{
-    // Just need a 0 to force a new recurrence id
-    return (gpointer)0;
-}
-
-static void
-set_autoinc_id( gpointer pObject, gpointer pValue )
-{
-    // Nowhere to put the ID
-}
-
-QofAccessFunc
-gnc_sql_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row )
-{
-    QofAccessFunc getter;
-
-	g_return_val_if_fail( obj_name != NULL, NULL );
-	g_return_val_if_fail( table_row != NULL, NULL );
-
-	if( (table_row->flags & COL_AUTOINC) != 0 ) {
-		getter = get_autoinc_id;
-    } else if( table_row->param_name != NULL ) {
-        getter = qof_class_get_parameter_getter( obj_name,
-                                                table_row->param_name );
-    } else {
-        getter = table_row->getter;
-    }
-
-    return getter;
-}
-
-/* ----------------------------------------------------------------- */
-void
-gnc_sql_add_colname_to_list( const col_cvt_t* table_row, GList** pList )
-{
-	(*pList) = g_list_append( (*pList), g_strdup( table_row->col_name ) );
-}
-
-/* ----------------------------------------------------------------- */
-void
-gnc_sql_add_subtable_colnames_to_list( const col_cvt_t* table_row, const col_cvt_t* subtable,
-								GList** pList )
-{
-	const col_cvt_t* subtable_row;
-	gchar* buf;
-
-	for( subtable_row = subtable; subtable_row->col_name != NULL; subtable_row++ ) {
-		buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
-		(*pList) = g_list_append( (*pList), buf );
-	}
-}
-
-GncSqlColumnInfo*
-gnc_sql_create_column_info( const col_cvt_t* table_row, const gchar* type,
-							gint size )
-{
-	GncSqlColumnInfo* info;
-
-	info = g_new0( GncSqlColumnInfo, 1 );
-	info->name = table_row->col_name;
-	info->type_name = type;
-	info->size = size;
-	info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
-	info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
-
-	return info;
-}
-
-/* ----------------------------------------------------------------- */
-static void
-load_string( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    const gchar* s;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        s = NULL;
-    } else {
-        s = g_value_get_string( val );
-    }
-    if( table_row->gobj_param_name != NULL ) {
-		g_object_set( pObject, table_row->gobj_param_name, s, NULL );
-    } else {
-		(*setter)( pObject, (const gpointer)s );
-    }
-}
-
-static void
-add_string_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_STRING, table_row->size ),
-				    table_row->size );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_string_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    QofAccessFunc getter;
-    gchar* s;
-	GValue* value = g_new0( GValue, 1 );
-	gchar* buf;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-    memset( value, 0, sizeof( GValue ) );
-	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &s, NULL );
-	} else {
-    	getter = gnc_sql_get_getter( obj_name, table_row );
-    	s = (gchar*)(*getter)( pObject, NULL );
-	}
-	g_value_init( value, G_TYPE_STRING );
-    if( s ) {
-        g_value_set_string( value, s );
-    } else {
-		g_value_set_string( value, "NULL" );
-	}
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t string_handler
-    = { load_string,
-		add_string_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-        add_gvalue_string_to_slist };
-/* ----------------------------------------------------------------- */
-typedef gint (*IntAccessFunc)( const gpointer );
-typedef void (*IntSetterFunc)( const gpointer, gint );
-
-static void
-load_int( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    gint int_value;
-	IntSetterFunc i_setter;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        int_value = 0;
-    } else {
-        int_value = get_integer_value( val );
-    }
-    if( table_row->gobj_param_name != NULL ) {
-		g_object_set( pObject, table_row->gobj_param_name, int_value, NULL );
-    } else {
-		i_setter = (IntSetterFunc)setter;
-    	(*i_setter)( pObject, int_value );
-    }
-}
-
-static void
-add_int_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_INT, table_row->size ),
-				    0 );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_int_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    gint int_value;
-    IntAccessFunc i_getter;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	value = g_new0( GValue, 1 );
-
-    i_getter = (IntAccessFunc)gnc_sql_get_getter( obj_name, table_row );
-    int_value = (*i_getter)( pObject );
-    g_value_init( value, G_TYPE_INT );
-    g_value_set_int( value, int_value );
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t int_handler
-	= { load_int,
-		add_int_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_int_to_slist };
-/* ----------------------------------------------------------------- */
-typedef gboolean (*BooleanAccessFunc)( const gpointer );
-typedef void (*BooleanSetterFunc)( const gpointer, gboolean );
-
-static void
-load_boolean( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    gint int_value;
-	BooleanSetterFunc b_setter;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        int_value = 0;
-    } else {
-        int_value = g_value_get_int( val );
-    }
-    if( table_row->gobj_param_name != NULL ) {
-		g_object_set( pObject, table_row->gobj_param_name, int_value, NULL );
-    } else {
-		b_setter = (BooleanSetterFunc)setter;
-    	(*b_setter)( pObject, int_value ? TRUE : FALSE );
-    }
-}
-
-static void
-add_boolean_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_INT, table_row->size ),
-				    0 );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_boolean_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    gint int_value;
-    BooleanAccessFunc b_getter;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-    value = g_new0( GValue, 1 );
-
-    b_getter = (BooleanAccessFunc)gnc_sql_get_getter( obj_name, table_row );
-    int_value = ((*b_getter)( pObject )) ? 1 : 0;
-    g_value_init( value, G_TYPE_INT );
-    g_value_set_int( value, int_value );
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t boolean_handler
-	= { load_boolean,
-		add_boolean_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_boolean_to_slist };
-/* ----------------------------------------------------------------- */
-typedef gint64 (*Int64AccessFunc)( const gpointer );
-typedef void (*Int64SetterFunc)( const gpointer, gint64 );
-
-static void
-load_int64( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    gint64 i64_value = 0;
-	Int64SetterFunc i64_setter = (Int64SetterFunc)setter;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( setter != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val != NULL ) {
-        i64_value = get_integer_value( val );
-    }
-    (*i64_setter)( pObject, i64_value );
-}
-
-static void
-add_int64_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_INT64, table_row->size ),
-				    0 );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_int64_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-				const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    gint64 i64_value;
-    Int64AccessFunc getter;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-    value = g_new0( GValue, 1 );
-    getter = (Int64AccessFunc)gnc_sql_get_getter( obj_name, table_row );
-    i64_value = (*getter)( pObject );
-    g_value_init( value, G_TYPE_INT64 );
-    g_value_set_int64( value, i64_value );
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t int64_handler
-	= { load_int64,
-		add_int64_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_int64_to_slist };
-/* ----------------------------------------------------------------- */
-
-static void
-load_double( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    gdouble d_value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        (*setter)( pObject, (gpointer)NULL );
-    } else {
-		if( G_VALUE_HOLDS(val, G_TYPE_INT) ) {
-			d_value = g_value_get_int( val );
-		} else {
-			d_value = g_value_get_double( val );
-		}
-        (*setter)( pObject, (gpointer)&d_value );
-    }
-}
-
-static void
-add_double_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_DOUBLE, table_row->size ),
-				    0 );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_double_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-						const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    QofAccessFunc getter;
-    gdouble* pDouble;
-    gdouble d_value;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-	value = g_new0( GValue, 1 );
-    getter = gnc_sql_get_getter( obj_name, table_row );
-    pDouble = (*getter)( pObject, NULL );
-    if( pDouble != NULL ) {
-        d_value = *pDouble;
-        g_value_init( value, G_TYPE_DOUBLE );
-        g_value_set_double( value, d_value );
-    } else {
-        g_value_init( value, G_TYPE_STRING );
-		g_value_set_string( value, "NULL" );
-	}
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t double_handler
-	= { load_double,
-		add_double_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_double_to_slist };
-/* ----------------------------------------------------------------- */
-
-static void
-load_guid( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    GUID guid;
-    const GUID* pGuid;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        pGuid = NULL;
-    } else {
-        string_to_guid( g_value_get_string( val ), &guid );
-        pGuid = &guid;
-    }
-    if( table_row->gobj_param_name != NULL ) {
-		g_object_set( pObject, table_row->gobj_param_name, pGuid, NULL );
-    } else {
-		(*setter)( pObject, (const gpointer)pGuid );
-    }
-}
-
-static void
-add_guid_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row, "CHAR", GUID_ENCODING_LENGTH );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-					const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    QofAccessFunc getter;
-    const GUID* guid;
-    gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    value = g_new0( GValue, 1 );
-	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &guid, NULL );
-	} else {
-    	getter = gnc_sql_get_getter( obj_name, table_row );
-    	guid = (*getter)( pObject, NULL );
-	}
-    if( guid != NULL ) {
-        (void)guid_to_string_buff( guid, guid_buf );
-        g_value_init( value, G_TYPE_STRING );
-        g_value_set_string( value, guid_buf );
-    } else {
-        g_value_init( value, G_TYPE_STRING );
-		g_value_set_string( value, "NULL" );
-	}
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t guid_handler
-	= { load_guid,
-		add_guid_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-        add_gvalue_guid_to_slist };
-/* ----------------------------------------------------------------- */
-
-void
-gnc_sql_add_gvalue_objectref_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-						const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    QofAccessFunc getter;
-    const GUID* guid = NULL;
-    gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	QofInstance* inst;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-	value = g_new0( GValue, 1 );
-	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &inst, NULL );
-	} else {
-    	getter = gnc_sql_get_getter( obj_name, table_row );
-    	inst = (*getter)( pObject, NULL );
-	}
-	if( inst != NULL ) {
-		guid = qof_instance_get_guid( inst );
-	}
-    if( guid != NULL ) {
-        (void)guid_to_string_buff( guid, guid_buf );
-        g_value_init( value, G_TYPE_STRING );
-        g_value_set_string( value, guid_buf );
-    } else {
-        g_value_init( value, G_TYPE_STRING );
-		g_value_set_string( value, "NULL" );
-	}
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-void
-gnc_sql_add_objectref_guid_col_info_to_list( const GncSqlBackend* be,
-								const col_cvt_t* table_row,
-								GList** pList )
-{
-	add_guid_col_info_to_list( be, table_row, pList );
-}
-
-/* ----------------------------------------------------------------- */
-typedef Timespec (*TimespecAccessFunc)( const gpointer );
-typedef void (*TimespecSetterFunc)( const gpointer, Timespec );
-
-#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
-#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
-
-static void
-load_timespec( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    GDate* date;
-    Timespec ts = {0, 0};
-	TimespecSetterFunc ts_setter;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-	ts_setter = (TimespecSetterFunc)setter;
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-        (*ts_setter)( pObject, ts );
-    } else {
-		if( G_VALUE_HOLDS_STRING( val ) ) {
-			const gchar* s = g_value_get_string( val );
-			gchar* buf;
-			buf = g_strdup_printf( "%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
-									s[0], s[1], s[2], s[3],
-									s[4], s[5],
-									s[6], s[7],
-									s[9], s[10],
-									s[11], s[12],
-									s[13], s[14] );
-		    ts = gnc_iso8601_to_timespec_gmt( buf );
-			(*ts_setter)( pObject, ts );
-			g_free( buf );
-
-		} else {
-			PWARN( "Unknown timespec type: %s", G_VALUE_TYPE_NAME( val ) );
-        }
-    }
-}
-
-static void
-add_timespec_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					"CHAR", TIMESPEC_COL_SIZE );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_timespec_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-                const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    TimespecAccessFunc ts_getter;
-    Timespec ts;
-	gchar* datebuf;
-	time_t time;
-	struct tm tm;
-	gint year;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-    value = g_new0( GValue, 1 );
-    ts_getter = (TimespecAccessFunc)gnc_sql_get_getter( obj_name, table_row );
-    ts = (*ts_getter)( pObject );
-
-	time = timespecToTime_t( ts );
-	(void)gmtime_r( &time, &tm );	
-
-	if( tm.tm_year < 60 ) year = tm.tm_year + 2000;
-	else year = tm.tm_year + 1900;
-
-	datebuf = g_strdup_printf( TIMESPEC_STR_FORMAT,
-					year, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec );
-    g_value_init( value, G_TYPE_STRING );
-	g_value_take_string( value, datebuf );
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t timespec_handler
-	= { load_timespec,
-		add_timespec_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_timespec_to_slist };
-/* ----------------------------------------------------------------- */
-#define DATE_COL_SIZE 8
-
-static void
-load_date( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    GDate* date;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-    if( val == NULL ) {
-		date = g_date_new_dmy( 1, 1, 1970 );
-        (*setter)( pObject, date );
-		g_date_free( date );
-    } else {
-		if( G_VALUE_HOLDS_STRING( val ) ) {
-			// Format of date is YYYYMMDD
-			const gchar* s = g_value_get_string( val );
-			gchar buf[5];
-			guint year, month, day;
-
-			strncpy( buf, &s[0], 4 );
-			buf[4] = '\0';
-			year = atoi( buf );
-			strncpy( buf, &s[4], 2 );
-			buf[2] = '\0';
-			month = atoi( buf );
-			day = atoi( &s[6] );
-
-			if( year != 0 || month != 0 || day != 0 ) {
-				date = g_date_new_dmy( day, month, year );
-				(*setter)( pObject, date );
-				g_date_free( date );
-			}
-		} else {
-			PWARN( "Unknown date type: %s", G_VALUE_TYPE_NAME( val ) );
-        }
-    }
-}
-
-static void
-add_date_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	info = gnc_sql_create_column_info( table_row,
-					"CHAR", DATE_COL_SIZE );
-
-	*pList = g_list_append( *pList, info );
-}
-
-static void
-add_gvalue_date_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-				const gpointer pObject,
-                const col_cvt_t* table_row, GSList** pList )
-{
-    GDate* date;
-    QofAccessFunc getter;
-	gchar* buf;
-	GValue* value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    value = g_new0( GValue, 1 );
-    getter = gnc_sql_get_getter( obj_name, table_row );
-    date = (GDate*)(*getter)( pObject, NULL );
-	buf = g_strdup_printf( "%04d%02d%02d",
-					g_date_get_year( date ), g_date_get_month( date ), g_date_get_day( date ) );
-    g_value_init( value, G_TYPE_STRING );
-    g_value_take_string( value, buf );
-
-	(*pList) = g_slist_append( (*pList), value );
-}
-
-static col_type_handler_t date_handler
-	= { load_date,
-		add_date_col_info_to_list,
-		gnc_sql_add_colname_to_list,
-		add_gvalue_date_to_slist };
-/* ----------------------------------------------------------------- */
-typedef gnc_numeric (*NumericGetterFunc)( const gpointer );
-typedef void (*NumericSetterFunc)( gpointer, gnc_numeric );
-
-static const col_cvt_t numeric_col_table[] =
-{
-    { "num",    CT_INT64, 0, COL_NNUL, "guid" },
-    { "denom",  CT_INT64, 0, COL_NNUL, "guid" },
-	{ NULL }
-};
-
-static void
-load_numeric( const GncSqlBackend* be, GncSqlRow* row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table_row )
-{
-    const GValue* val;
-    gchar* buf;
-    gint64 num, denom;
-    gnc_numeric n;
-    gboolean isNull = FALSE;
-	NumericSetterFunc n_setter = (NumericSetterFunc)setter;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    buf = g_strdup_printf( "%s_num", table_row->col_name );
-    val = gnc_sql_row_get_value_at_col_name( row, buf );
-    g_free( buf );
-    if( val == NULL ) {
-        isNull = TRUE;
-        num = 0;
-    } else {
-        num = get_integer_value( val );
-    }
-    buf = g_strdup_printf( "%s_denom", table_row->col_name );
-    val = gnc_sql_row_get_value_at_col_name( row, buf );
-    g_free( buf );
-    if( val == NULL ) {
-        isNull = TRUE;
-        denom = 1;
-    } else {
-        denom = get_integer_value( val );
-    }
-    n = gnc_numeric_create( num, denom );
-    if( !isNull ) {
-        (*n_setter)( pObject, n );
-    }
-}
-
-static void
-add_numeric_col_info_to_list( const GncSqlBackend* be, const col_cvt_t* table_row,
-								GList** pList )
-{
-	GncSqlColumnInfo* info;
-    gchar* buf;
-	const col_cvt_t* subtable_row;
-	const gchar* type;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_row != NULL );
-	g_return_if_fail( pList != NULL );
-
-	for( subtable_row = numeric_col_table; subtable_row->col_name != NULL; subtable_row++ ) {
-    	buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
-		info = g_new0( GncSqlColumnInfo, 1 );
-		info->name = buf;
-		info->type_name = gnc_sql_connection_get_column_type_name( be->conn,
-											G_TYPE_INT64, table_row->size );
-		info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
-		info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
-		*pList = g_list_append( *pList, info );
-	}
-}
-
-static void
-add_numeric_colname_to_list( const col_cvt_t* table_row, GList** pList )
-{
-	gnc_sql_add_subtable_colnames_to_list( table_row, numeric_col_table, pList );
-}
-
-static void
-add_gvalue_numeric_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-					const gpointer pObject, const col_cvt_t* table_row, GSList** pList )
-{
-    NumericGetterFunc getter;
-    gnc_numeric n;
-    GValue* num_value;
-    GValue* denom_value;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( obj_name != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    getter = (NumericGetterFunc)gnc_sql_get_getter( obj_name, table_row );
-    n = (*getter)( pObject );
-
-    num_value = g_new0( GValue, 1 );
-    g_value_init( num_value, G_TYPE_INT64 );
-    g_value_set_int64( num_value, gnc_numeric_num( n ) );
-    denom_value = g_new0( GValue, 1 );
-    g_value_init( denom_value, G_TYPE_INT64 );
-    g_value_set_int64( denom_value, gnc_numeric_denom( n ) );
-
-	(*pList) = g_slist_append( (*pList), num_value );
-	(*pList) = g_slist_append( (*pList), denom_value );
-}
-
-static col_type_handler_t numeric_handler
-	= { load_numeric,
-		add_numeric_col_info_to_list,
-		add_numeric_colname_to_list,
-		add_gvalue_numeric_to_slist };
-/* ================================================================= */
-
-static GHashTable* g_columnTypeHash = NULL;
-
-void
-gnc_sql_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler )
-{
-	g_return_if_fail( colType != NULL );
-	g_return_if_fail( handler != NULL );
-
-	if( g_columnTypeHash == NULL ) {
-		g_columnTypeHash = g_hash_table_new( g_str_hash, g_str_equal );
-	}
-
-	g_hash_table_insert( g_columnTypeHash, (gpointer)colType, (gpointer)handler );
-	DEBUG( "Col type %s registered\n", colType );
-}
-
-static col_type_handler_t*
-get_handler( const col_cvt_t* table_row )
-{
-    col_type_handler_t* pHandler;
-
-	g_return_val_if_fail( table_row != NULL, NULL );
-	g_return_val_if_fail( table_row->col_type != NULL, NULL );
-
-	pHandler = g_hash_table_lookup( g_columnTypeHash, table_row->col_type );
-	if( pHandler == NULL ) {
-        g_assert( FALSE );
-    }
-
-    return pHandler;
-}
-
-void
-gnc_sql_register_standard_col_type_handlers( void )
-{
-	gnc_sql_register_col_type_handler( CT_STRING, &string_handler );
-    gnc_sql_register_col_type_handler( CT_BOOLEAN, &boolean_handler );
-    gnc_sql_register_col_type_handler( CT_INT, &int_handler );
-    gnc_sql_register_col_type_handler( CT_INT64, &int64_handler );
-    gnc_sql_register_col_type_handler( CT_DOUBLE, &double_handler );
-    gnc_sql_register_col_type_handler( CT_GUID, &guid_handler );
-    gnc_sql_register_col_type_handler( CT_TIMESPEC, &timespec_handler );
-    gnc_sql_register_col_type_handler( CT_GDATE, &date_handler );
-    gnc_sql_register_col_type_handler( CT_NUMERIC, &numeric_handler );
-}
-
-void 
-_retrieve_guid_( gpointer pObject, gpointer pValue )
-{
-    GUID* pGuid = (GUID*)pObject;
-    GUID* guid = (GUID*)pValue;
-
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( pValue != NULL );
-
-	memcpy( pGuid, guid, sizeof( GUID ) );
-}
-
-
-// Table to retrieve just the guid
-static col_cvt_t guid_table[] =
-{
-    { "guid", CT_GUID, 0, 0, NULL, NULL, NULL, _retrieve_guid_ },
-    { NULL }
-};
-
-const GUID*
-gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row )
-{
-	static GUID guid;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( row != NULL, NULL );
-
-    gnc_sql_load_object( be, row, NULL, &guid, guid_table );
-
-    return &guid;
-}
-
-// Table to retrieve just the guid
-static col_cvt_t tx_guid_table[] =
-{
-    { "tx_guid", CT_GUID, 0, 0, NULL, NULL, NULL, _retrieve_guid_ },
-    { NULL }
-};
-
-const GUID*
-gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row )
-{
-    static GUID guid;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( row != NULL, NULL );
-
-    gnc_sql_load_object( be, row, NULL, &guid, tx_guid_table );
-
-    return &guid;
-}
-
-void
-gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
-                    QofIdTypeConst obj_name, gpointer pObject,
-                    const col_cvt_t* table_row )
-{
-    int col;
-    QofSetterFunc setter;
-    col_type_handler_t* pHandler;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( row != NULL );
-	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( table_row != NULL );
-
-    for( col = 0; table_row[col].col_name != NULL; col++ ) {
-		if( (table_row[col].flags & COL_AUTOINC) != 0 ) {
-			setter = set_autoinc_id;
-        } else if( table_row[col].param_name != NULL ) {
-            setter = qof_class_get_parameter_setter( obj_name,
-                                                    table_row[col].param_name );
-        } else {
-            setter = table_row[col].setter;
-        }
-        pHandler = get_handler( &table_row[col] );
-        pHandler->load_fn( be, row, setter, pObject, &table_row[col] );
-    }
-}
-
-/* ================================================================= */
-GncSqlStatement*
-gnc_sql_create_select_statement( const GncSqlBackend* be, const gchar* table_name,
-							const col_cvt_t* table_row )
-{
-	gchar* sql;
-
-	sql = g_strdup_printf( "SELECT * FROM %s", table_name );
-	return gnc_sql_create_statement_from_sql( be, sql );
-}
-
-static GncSqlStatement*
-create_single_col_select_statement( const GncSqlBackend* be,
-							const gchar* table_name,
-							const col_cvt_t* table_row )
-{
-	gchar* sql;
-
-	sql = g_strdup_printf( "SELECT %s FROM %s", table_row->col_name, table_name );
-	return gnc_sql_create_statement_from_sql( be, sql );
-}
-
-/* ================================================================= */
-gint
-gnc_sql_execute_statement( GncSqlBackend* be, GncSqlStatement* stmt )
-{
-    GError* error = NULL;
-    gint numRows;
-
-	g_return_val_if_fail( be != NULL, -1 );
-	g_return_val_if_fail( stmt != NULL, -1 );
-
-	numRows = gnc_sql_connection_execute_nonselect_statement( be->conn, stmt );
-    if( error != NULL ) {
-        PERR( "SQL error: %s\n%s\n", gnc_sql_statement_to_sql( stmt ), error->message );
-		qof_backend_set_error( &be->be, ERR_BACKEND_SERVER_ERR );
-    }
-
-    return numRows;
-}
-
-GncSqlResult*
-gnc_sql_execute_select_statement( GncSqlBackend* be, GncSqlStatement* stmt )
-{
-    GError* error = NULL;
-    GncSqlResult* result;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( stmt != NULL, NULL );
-
-    result = gnc_sql_connection_execute_select_statement( be->conn, stmt );
-    if( error != NULL ) {
-        PERR( "SQL error: %s\n%s\n", gnc_sql_statement_to_sql( stmt ), error->message );
-		qof_backend_set_error( &be->be, ERR_BACKEND_SERVER_ERR );
-    }
-
-    return result;
-}
-
-GncSqlResult*
-gnc_sql_execute_sql_statement( GncSqlBackend* be, GncSqlStatement* sqlStmt )
-{
-	return gnc_sql_execute_select_statement( be, sqlStmt );
-}
-
-GncSqlStatement*
-gnc_sql_create_statement_from_sql( const GncSqlBackend* be, gchar* sql )
-{
-    GError* error = NULL;
-	GncSqlStatement* stmt;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( sql != NULL, NULL );
-
-	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql );
-    if( stmt == NULL ) {
-        PERR( "SQL error: %s\n%s\n", sql, error->message );
-    }
-
-	return stmt;
-}
-
-GncSqlResult*
-gnc_sql_execute_select_sql( const GncSqlBackend* be, gchar* sql )
-{
-	GncSqlStatement* stmt;
-    GError* error = NULL;
-	GncSqlResult* result = NULL;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( sql != NULL, NULL );
-
-	stmt = gnc_sql_create_statement_from_sql( be, sql );
-    if( stmt == NULL ) {
-		return NULL;
-    }
-	result = gnc_sql_connection_execute_select_statement( be->conn, stmt );
-    if( error != NULL ) {
-        PERR( "SQL error: %s\n%s\n", sql, error->message );
-    }
-
-	return result;
-}
-
-gint
-gnc_sql_execute_nonselect_sql( const GncSqlBackend* be, gchar* sql )
-{
-	GncSqlStatement* stmt;
-    GError* error = NULL;
-	gint result;
-
-	g_return_val_if_fail( be != NULL, 0 );
-	g_return_val_if_fail( sql != NULL, 0 );
-
-	stmt = gnc_sql_create_statement_from_sql( be, sql );
-    if( stmt == NULL ) {
-		return 0;
-    }
-	result = gnc_sql_connection_execute_nonselect_statement( be->conn, stmt );
-	gnc_sql_statement_dispose( stmt );
-    if( error != NULL ) {
-        PERR( "SQL error: %s\n%s\n", sql, error->message );
-    }
-	return result;
-}
-
-int
-gnc_sql_execute_select_get_count( const GncSqlBackend* be, gchar* sql )
-{
-    int count = 0;
-    GncSqlResult* result;
-
-	g_return_val_if_fail( be != NULL, 0 );
-	g_return_val_if_fail( sql != NULL, 0 );
-
-    result = gnc_sql_execute_select_sql( be, sql );
-    if( result != NULL ) {
-        count = gnc_sql_result_get_num_rows( result );
-		gnc_sql_result_dispose( result );
-    }
-
-    return count;
-}
-
-int
-gnc_sql_execute_statement_get_count( GncSqlBackend* be, GncSqlStatement* stmt )
-{
-    GncSqlResult* result;
-	int count = 0;
-
-	g_return_val_if_fail( be != NULL, 0 );
-	g_return_val_if_fail( stmt != NULL, 0 );
-
-    result = gnc_sql_execute_select_statement( be, stmt );
-    if( result != NULL ) {
-        count = gnc_sql_result_get_num_rows( result );
-		gnc_sql_result_dispose( result );
-    }
-
-    return count;
-}
-
-guint
-gnc_sql_append_guid_list_to_sql( GString* sql, GList* list, guint maxCount )
-{
-	gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	gboolean first_guid = TRUE;
-	guint count;
-
-	g_return_val_if_fail( sql != NULL, 0 );
-
-	if( list == NULL ) return 0;
-
-	for( count = 0; list != NULL && count < maxCount; list = list->next, count++ ) {
-		QofInstance* inst = QOF_INSTANCE(list->data);
-    	guid_to_string_buff( qof_instance_get_guid( inst ), guid_buf );
-
-		if( !first_guid ) {
-			g_string_append( sql, "," );
-		}
-		g_string_append( sql, "'" );
-		g_string_append( sql, guid_buf );
-		g_string_append( sql, "'" );
-		first_guid = FALSE;
-    }
-
-	return count;
-}
-/* ================================================================= */
-
-gboolean
-gnc_sql_object_is_it_in_db( GncSqlBackend* be, const gchar* table_name,
-                    QofIdTypeConst obj_name, gpointer pObject,
-                    const col_cvt_t* table )
-{
-    GncSqlStatement* sqlStmt;
-    int count;
-    col_type_handler_t* pHandler;
-	GSList* list = NULL;
-
-	g_return_val_if_fail( be != NULL, FALSE );
-	g_return_val_if_fail( table_name != NULL, FALSE );
-	g_return_val_if_fail( obj_name != NULL, FALSE );
-	g_return_val_if_fail( pObject != NULL, FALSE );
-	g_return_val_if_fail( table != NULL, FALSE );
-
-    /* SELECT * FROM */
-    sqlStmt = create_single_col_select_statement( be, table_name, table );
-
-    /* WHERE */
-    pHandler = get_handler( table );
-	pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table, &list );
-	gnc_sql_statement_add_where_cond( sqlStmt, obj_name, pObject, &table[0], (GValue*)(list->data) );
-
-    count = gnc_sql_execute_statement_get_count( be, sqlStmt );
-	gnc_sql_statement_dispose( sqlStmt );
-    if( count == 0 ) {
-        return FALSE;
-    } else {
-        return TRUE;
-    }
-}
-
-gboolean
-gnc_sql_do_db_operation( GncSqlBackend* be,
-                        E_DB_OPERATION op,
-                        const gchar* table_name,
-                        QofIdTypeConst obj_name, gpointer pObject,
-                        const col_cvt_t* table )
-{
-    GncSqlStatement* sqlStmt;
-
-	g_return_val_if_fail( be != NULL, FALSE );
-	g_return_val_if_fail( table_name != NULL, FALSE );
-	g_return_val_if_fail( obj_name != NULL, FALSE );
-	g_return_val_if_fail( pObject != NULL, FALSE );
-	g_return_val_if_fail( table != NULL, FALSE );
-
-    if( op == OP_DB_ADD_OR_UPDATE ) {
-        if( gnc_sql_object_is_it_in_db( be, table_name, obj_name, pObject, table ) ) {
-            sqlStmt = gnc_sql_build_update_statement( be, table_name, obj_name, pObject, table );
-        } else {
-            sqlStmt = gnc_sql_build_insert_statement( be, table_name, obj_name, pObject, table );
-        }
-    } else if( op == OP_DB_DELETE ) {
-        sqlStmt = gnc_sql_build_delete_statement( be, table_name, obj_name, pObject, table );
-    } else if( op == OP_DB_ADD ) {
-        sqlStmt = gnc_sql_build_insert_statement( be, table_name, obj_name, pObject, table );
-    } else {
-        g_assert( FALSE );
-    }
-    if( sqlStmt != NULL ) {
-        gnc_sql_execute_statement( be, sqlStmt );
-		gnc_sql_statement_dispose( sqlStmt );
-
-        return TRUE;
-    } else {
-        return FALSE;
-    }
-}
-
-static GSList*
-create_gslist_from_values( GncSqlBackend* be,
-                            QofIdTypeConst obj_name, gpointer pObject,
-                            const col_cvt_t* table )
-{
-	GSList* list = NULL;
-	col_type_handler_t* pHandler;
-	const col_cvt_t* table_row;
-
-    for( table_row = table; table_row->col_name != NULL; table_row++ ) {
-		if(( table_row->flags & COL_AUTOINC ) == 0 ) {
-    		pHandler = get_handler( table_row );
-			pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table_row, &list );
-		}
-    }
-
-	return list;
-}
-
-gchar*
-gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value )
-{
-	if( value != NULL && G_IS_VALUE( value ) ) {
-		if( G_VALUE_HOLDS_STRING(value) ) {
-			gchar *before_str;
-			gchar* after_str;
-			before_str = g_value_dup_string( value );
-			after_str = gnc_sql_connection_quote_string( conn, before_str );
-			g_free( before_str );
-			return after_str;
-		} else if( g_value_type_transformable( G_VALUE_TYPE(value), G_TYPE_STRING ) ) {
-			GValue *string;
-			gchar *str;
-			
-			string = g_value_init( g_new0( GValue, 1 ), G_TYPE_STRING );
-			g_value_transform( value, string );
-			str = g_value_dup_string( string );
-			g_value_unset( string );
-			g_free( string );
-			return str;
-		} else {
-			PWARN( "not transformable, gtype = '%s'\n", g_type_name( G_VALUE_TYPE(value) ) );
-			return "$$$";
-		}
-	} else {
-		PWARN( "value is NULL or not G_IS_VALUE()\n" );
-		return "";
-	}
-}
-
-GncSqlStatement*
-gnc_sql_build_insert_statement( GncSqlBackend* be,
-                            const gchar* table_name,
-                            QofIdTypeConst obj_name, gpointer pObject,
-                            const col_cvt_t* table )
-{
-	GncSqlStatement* stmt;
-	GString* sql;
-	GSList* values;
-	GSList* node;
-	gchar* sqlbuf;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( table_name != NULL, NULL );
-	g_return_val_if_fail( obj_name != NULL, NULL );
-	g_return_val_if_fail( pObject != NULL, NULL );
-	g_return_val_if_fail( table != NULL, NULL );
-
-	sqlbuf = g_strdup_printf( "INSERT INTO %s VALUES(", table_name );
-	sql = g_string_new( sqlbuf );
-	g_free( sqlbuf );
-	values = create_gslist_from_values( be, obj_name, pObject, table );
-	for( node = values; node != NULL; node = node->next ) {
-		GValue* value = (GValue*)node->data;
-		gchar* value_str;
-		if( node != values ) {
-			g_string_append( sql, "," );
-		}
-		value_str = gnc_sql_get_sql_value( be->conn, value );
-		g_string_append( sql, value_str );
-		g_free( value_str );
-		g_value_reset( value );
-		g_free( value );
-	}
-	g_slist_free( values );
-	g_string_append( sql, ")" );
-
-	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
-	return stmt;
-}
-
-GncSqlStatement*
-gnc_sql_build_update_statement( GncSqlBackend* be,
-                            const gchar* table_name,
-                            QofIdTypeConst obj_name, gpointer pObject,
-                            const col_cvt_t* table )
-{
-	GncSqlStatement* stmt;
-	GString* sql;
-	GSList* values;
-	GList* colnames = NULL;
-	GSList* value;
-	GList* colname;
-	gboolean firstCol;
-	const col_cvt_t* table_row = table;
-	gchar* sqlbuf;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( table_name != NULL, NULL );
-	g_return_val_if_fail( obj_name != NULL, NULL );
-	g_return_val_if_fail( pObject != NULL, NULL );
-	g_return_val_if_fail( table != NULL, NULL );
-
-    // Get all col names and all values
-	for( ; table_row->col_name != NULL; table_row++ ) {
-    	col_type_handler_t* pHandler;
-
-		// Add col names to the list
-		pHandler = get_handler( table_row );
-		pHandler->add_colname_to_list_fn( table_row, &colnames );
-	}
-	values = create_gslist_from_values( be, obj_name, pObject, table );
-
-	// Create the SQL statement
-	sqlbuf = g_strdup_printf( "UPDATE %s SET ", table_name );
-	sql = g_string_new( sqlbuf );
-	g_free( sqlbuf );
-
-	firstCol = TRUE;
-	for( colname = colnames->next, value = values->next;
-					colname != NULL && value != NULL;
-					colname = colname->next, value = value->next ) {
-		gchar* value_str;
-		if( !firstCol ) {
-			g_string_append( sql, "," );
-		}
-		g_string_append( sql, (gchar*)colname->data );
-		g_string_append( sql, "=" );
-		value_str = gnc_sql_get_sql_value( be->conn, (GValue*)(value->data) );
-		g_string_append( sql, value_str );
-		g_free( value_str );
-		firstCol = FALSE;
-	}
-	g_list_free( colnames );
-	if( value != NULL || colname != NULL ) {
-		PERR( "Mismatch in number of column names and values" );
-	}
-
-	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
-	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(values->data) );
-	g_slist_free( values );
-
-	return stmt;
-}
-
-GncSqlStatement*
-gnc_sql_build_delete_statement( GncSqlBackend* be,
-                            const gchar* table_name,
-                            QofIdTypeConst obj_name, gpointer pObject,
-                            const col_cvt_t* table )
-{
-	GncSqlStatement* stmt;
-	GString* sql;
-    col_type_handler_t* pHandler;
-	GSList* list = NULL;
-	gchar* sqlbuf;
-
-	g_return_val_if_fail( be != NULL, NULL );
-	g_return_val_if_fail( table_name != NULL, NULL );
-	g_return_val_if_fail( obj_name != NULL, NULL );
-	g_return_val_if_fail( pObject != NULL, NULL );
-	g_return_val_if_fail( table != NULL, NULL );
-
-	sqlbuf = g_strdup_printf( "DELETE FROM %s ", table_name );
-	sql = g_string_new( sqlbuf );
-	g_free( sqlbuf );
-	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
-
-    /* WHERE */
-    pHandler = get_handler( table );
-	pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table, &list );
-	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(list->data) );
-
-	return stmt;
-}
-
-/* ================================================================= */
-
-static gboolean
-create_table( const GncSqlBackend* be, const gchar* table_name,
-				const col_cvt_t* col_table, GError** pError )
-{
-	GList* col_info_list = NULL;
-    
-	g_return_val_if_fail( be != NULL, FALSE );
-	g_return_val_if_fail( table_name != NULL, FALSE );
-	g_return_val_if_fail( col_table != NULL, FALSE );
-	g_return_val_if_fail( pError != NULL, FALSE );
-    
-    for( ; col_table->col_name != NULL; col_table++ ) {
-        col_type_handler_t* pHandler;
-
-        pHandler = get_handler( col_table );
-        pHandler->add_col_info_to_list_fn( be, col_table, &col_info_list );
-    }
-	gnc_sql_connection_create_table( be->conn, table_name, col_info_list );
-	return TRUE;
-}
-
-gboolean
-gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
-					gint table_version, const col_cvt_t* col_table, GError** error )
-{
-	gboolean ok;
-
-	ok = create_table( be, table_name, col_table, error );
-	if( ok ) {
-		register_table_version( be, table_name, table_version );
-	}
-	return ok;
-}
-
-void
-gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
-					const gchar* table_name,
-                    const col_cvt_t* col_table )
-{
-    g_return_if_fail( be != NULL );
-	g_return_if_fail( index_name != NULL );
-	g_return_if_fail( table_name != NULL );
-	g_return_if_fail( col_table != NULL );
-    
-	gnc_sql_connection_create_index( be->conn, index_name, table_name,
-								col_table );
-}
-
-gint
-gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name )
-{
-	g_return_val_if_fail( be != NULL, 0 );
-	g_return_val_if_fail( table_name != NULL, 0 );
-
-	/* If the db is pristine because it's being saved, the table does not
-	 * exist.  This gets around a GDA-3 bug where deleting all tables and
-	 * updating the meta-data leaves the meta-data still thinking 1 table
-	 * exists.
-	 */
-	if( be->is_pristine_db ) {
-		return 0;
-	}
-
-	return get_table_version( be, table_name );
-	}
-
-/* ================================================================= */
-#define VERSION_TABLE_NAME "versions"
-#define MAX_TABLE_NAME_LEN 50
-#define TABLE_COL_NAME "table_name"
-#define VERSION_COL_NAME "table_version"
-
-static col_cvt_t version_table[] =
-{
-    { TABLE_COL_NAME,   CT_STRING, MAX_TABLE_NAME_LEN },
-	{ VERSION_COL_NAME, CT_INT },
-    { NULL }
-};
-
-/**
- * Sees if the version table exists, and if it does, loads the info into
- * the version hash table.  Otherwise, it creates an empty version table.
- *
- * @param be Backend struct
- */
-void
-gnc_sql_init_version_info( GncSqlBackend* be )
-{
-	g_return_if_fail( be != NULL );
-
-	be->versions = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );
-
-	if( gnc_sql_connection_does_table_exist( be->conn, VERSION_TABLE_NAME ) ) {
-		GncSqlResult* result;
-		gchar* sql;
-
-		sql = g_strdup_printf( "SELECT * FROM %s", VERSION_TABLE_NAME );
-		result = gnc_sql_execute_select_sql( be, sql );
-		if( result != NULL ) {
-			const GValue* name;
-			const GValue* version;
-			GncSqlRow* row;
-
-			row = gnc_sql_result_get_first_row( result );
-			while( row != NULL ) {
-    			name = gnc_sql_row_get_value_at_col_name( row, TABLE_COL_NAME );
-				version = gnc_sql_row_get_value_at_col_name( row, VERSION_COL_NAME );
-				g_hash_table_insert( be->versions,
-									g_strdup( g_value_get_string( name ) ),
-									GINT_TO_POINTER(g_value_get_int( version )) );
-				row = gnc_sql_result_get_next_row( result );
-			}
-			gnc_sql_result_dispose( result );
-		}
-	} else {
-		gboolean ok;
-		GError* error = NULL;
-
-		ok = create_table( be, VERSION_TABLE_NAME, version_table, &error );
-		if( error != NULL ) {
-			PERR( "Error creating versions table: %s\n", error->message );
-		}
-	}
-}
-
-/**
- * Resets the version table information by removing all version table info.
- * It also recreates the version table in the db.
- *
- * @param be Backend struct
- */
-void
-gnc_sql_reset_version_info( GncSqlBackend* be )
-{
-	gboolean ok;
-	GError* error = NULL;
-
-	g_return_if_fail( be != NULL );
-
-	ok = create_table( be, VERSION_TABLE_NAME, version_table, &error );
-	if( error != NULL ) {
-		PERR( "Error creating versions table: %s\n", error->message );
-	}
-	if( be->versions == NULL ) {
-		be->versions = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );
-	} else {
-		g_hash_table_remove_all( be->versions );
-	}
-}
-
-/**
- * Finalizes the version table info by destroying the hash table.
- *
- * @param be Backend struct
- */
-void
-gnc_sql_finalize_version_info( GncSqlBackend* be )
-{
-	g_return_if_fail( be != NULL );
-
-	g_hash_table_destroy( be->versions );
-}
-
-/**
- * Registers the version for a table.  Registering involves updating the
- * db version table and also the hash table.
- *
- * @param be Backend struct
- * @param table_name Table name
- * @param version Version number
- */
-static void
-register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version )
-{
-	gchar* sql;
-	gint cur_version;
-
-	g_return_if_fail( be != NULL );
-	g_return_if_fail( table_name != NULL );
-	g_return_if_fail( version > 0 );
-
-	cur_version = get_table_version( be, table_name );
-	if( cur_version != version ) {
-		if( cur_version == 0 ) {
-			sql = g_strdup_printf( "INSERT INTO %s VALUES('%s',%d)", VERSION_TABLE_NAME,
-								table_name, version );
-		} else {
-			sql = g_strdup_printf( "UPDATE %s SET %s=%d WHERE %s='%s'", VERSION_TABLE_NAME,
-								VERSION_COL_NAME, version,
-								TABLE_COL_NAME, table_name );
-		}
-		(void)gnc_sql_execute_nonselect_sql( be, sql );
-	}
-
-	g_hash_table_insert( be->versions, g_strdup( table_name ), GINT_TO_POINTER(version) );
-}
-
-/**
- * Returns the registered version number for a table.
- *
- * @param be Backend struct
- * @param table_name Table name
- * @return Version number
- */
-static gint
-get_table_version( const GncSqlBackend* be, const gchar* table_name )
-{
-	g_return_val_if_fail( be != NULL, 0 );
-	g_return_val_if_fail( table_name != NULL, 0 );
-
-	return GPOINTER_TO_INT(g_hash_table_lookup( be->versions, table_name ));
-}
-/* ========================== END OF FILE ===================== */

Deleted: gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-backend-util-sql.h	2008-06-14 02:01:58 UTC (rev 17231)
@@ -1,313 +0,0 @@
-/********************************************************************
- * gnc-backend-util-sql.h: load and save data to SQL                *
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-/** @file gnc-backend-sql.h
- *  @brief load and save data to SQL
- *  @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff at rogers.com>
- *
- * This file implements the top-level QofBackend API for saving/
- * restoring data to/from an SQL database
- */
-
-#ifndef GNC_BACKEND_SQL_UTIL_H_
-#define GNC_BACKEND_SQL_UTIL_H_
-
-#include "qof.h"
-#include <gmodule.h>
-
-#include "qofbackend-p.h"
-
-/**
- */
-typedef struct col_cvt col_cvt_t;
-typedef struct GncSqlStatement GncSqlStatement;
-typedef struct GncSqlResult GncSqlResult;
-typedef struct GncSqlConnection GncSqlConnection;
-typedef struct GncSqlRow GncSqlRow;
-
-/**
- *@struct GncSqlStatement
- */
-struct GncSqlStatement
-{
-	void (*dispose)( GncSqlStatement* );
-	gchar* (*toSql)( GncSqlStatement* );
-	void (*addWhereCond)( GncSqlStatement*, QofIdTypeConst, gpointer, const col_cvt_t*, GValue* );
-};
-#define gnc_sql_statement_dispose(STMT) \
-		(STMT)->dispose(STMT)
-#define gnc_sql_statement_to_sql(STMT) \
-		(STMT)->toSql(STMT)
-#define gnc_sql_statement_add_where_cond(STMT,TYPENAME,OBJ,COLDESC,VALUE) \
-		(STMT)->addWhereCond(STMT, TYPENAME, OBJ, COLDESC, VALUE)
-
-/**
- * @struct GncSqlColumnInfo
- */
-typedef struct {
-	const gchar* name;
-	const gchar* type_name;
-	gint size;
-	gboolean is_primary_key;
-	gboolean null_allowed;
-} GncSqlColumnInfo;
-
-/**
- * @struct GncSqlConnection
- */
-struct GncSqlConnection
-{
-	void (*dispose)( GncSqlConnection* );
-	GncSqlResult* (*executeSelectStatement)( GncSqlConnection*, GncSqlStatement* );
-	gint (*executeNonSelectStatement)( GncSqlConnection*, GncSqlStatement* );
-	GncSqlStatement* (*createStatementFromSql)( GncSqlConnection*, gchar* );
-	gboolean (*doesTableExist)( GncSqlConnection*, const gchar* );
-	void (*beginTransaction)( GncSqlConnection* );
-	void (*rollbackTransaction)( GncSqlConnection* );
-	void (*commitTransaction)( GncSqlConnection* );
-	const gchar* (*getColumnTypeName)( GncSqlConnection*, GType, gint size );
-	void (*createTable)( GncSqlConnection*, const gchar*, const GList* );
-	void (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const col_cvt_t* );
-	gchar* (*quoteString)( const GncSqlConnection*, gchar* );
-};
-#define gnc_sql_connection_dispose(CONN) (CONN)->dispose(CONN)
-#define gnc_sql_connection_execute_select_statement(CONN,STMT) \
-		(CONN)->executeSelectStatement(CONN,STMT)
-#define gnc_sql_connection_execute_nonselect_statement(CONN,STMT) \
-		(CONN)->executeNonSelectStatement(CONN,STMT)
-#define gnc_sql_connection_create_statement_from_sql(CONN,SQL) \
-		(CONN)->createStatementFromSql(CONN,SQL)
-#define gnc_sql_connection_does_table_exist(CONN,NAME) \
-		(CONN)->doesTableExist(CONN,NAME)
-#define gnc_sql_connection_begin_transaction(CONN) \
-		(CONN)->beginTransaction(CONN)
-#define gnc_sql_connection_rollback_transaction(CONN) \
-		(CONN)->rollbackTransaction(CONN)
-#define gnc_sql_connection_commit_transaction(CONN) \
-		(CONN)->commitTransaction(CONN)
-#define gnc_sql_connection_get_column_type_name(CONN,TYPE,SIZE) \
-		(CONN)->getColumnTypeName(CONN,TYPE,SIZE)
-#define gnc_sql_connection_create_table(CONN,NAME,COLLIST) \
-		(CONN)->createTable(CONN,NAME,COLLIST)
-#define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
-		(CONN)->createIndex(CONN,INDEXNAME,TABLENAME,COLTABLE)
-#define gnc_sql_connection_quote_string(CONN,STR) \
-		(CONN)->quoteString(CONN,STR)
-
-struct GncSqlRow
-{
-	const GValue* (*getValueAtColName)( GncSqlRow*, const gchar* );
-	void (*dispose)( GncSqlRow* );
-};
-#define gnc_sql_row_get_value_at_col_name(ROW,N) \
-		(ROW)->getValueAtColName(ROW,N)
-#define gnc_sql_row_dispose(ROW) \
-		(ROW)->dispose(ROW)
-
-struct GncSqlResult
-{
-	int (*getNumRows)( GncSqlResult* );
-    GncSqlRow* (*getFirstRow)( GncSqlResult* );
-	GncSqlRow* (*getNextRow)( GncSqlResult* );
-	void (*dispose)( GncSqlResult* );
-};
-#define gnc_sql_result_get_num_rows(RESULT) \
-		(RESULT)->getNumRows(RESULT)
-#define gnc_sql_result_get_first_row(RESULT) \
-		(RESULT)->getFirstRow(RESULT)
-#define gnc_sql_result_get_next_row(RESULT) \
-		(RESULT)->getNextRow(RESULT)
-#define gnc_sql_result_dispose(RESULT) \
-		(RESULT)->dispose(RESULT)
-
-struct GncSqlBackend_struct
-{
-  QofBackend be;
-
-  GncSqlConnection* conn;
-
-  QofBook *primary_book;	/* The primary, main open book */
-  gboolean	loading;		/* We are performing an initial load */
-  gboolean  in_query;
-  gboolean  supports_transactions;
-  gboolean  is_pristine_db;	// Are we saving to a new pristine db?
-
-  gint obj_total;			// Total # of objects (for percentage calculation)
-  gint operations_done;		// Number of operations (save/load) done
-  GHashTable* versions;		// Version number for each table
-};
-typedef struct GncSqlBackend_struct GncSqlBackend;
-
-/**
- * Struct used to pass in a new data type for GDA storage.  This contains
- * the set of callbacks to read and write GDA for new data objects..  New
- * types should register an instance of this object with the engine.
- *
- * commit()			- commit an object to the db
- * initial_load()	- load stuff when new db opened
- * create_tables()  - create any db tables
- * compile_query()  - compile a backend object query
- * run_query()      - run a compiled query
- * free_query()     - free a compiled query
- * write()          - write all objects
- */
-#define GNC_SQL_BACKEND             "gnc:sql:1"
-#define GNC_SQL_BACKEND_VERSION	1
-typedef struct
-{
-  int		version;	/* backend version number */
-  const gchar *	type_name;	/* The XML tag for this type */
-
-  void		(*commit)( QofInstance* inst, GncSqlBackend* be );
-  void		(*initial_load)( GncSqlBackend* pBackend );
-  void		(*create_tables)( GncSqlBackend* pBackend );
-  gpointer	(*compile_query)( GncSqlBackend* pBackend, QofQuery* pQuery );
-  void		(*run_query)( GncSqlBackend* pBackend, gpointer pQuery );
-  void		(*free_query)( GncSqlBackend* pBackend, gpointer pQuery );
-  void		(*write)( GncSqlBackend* pBackend );
-} GncSqlDataType_t;
-
-// Type for conversion of db row to object.
-#define CT_STRING "ct_string"
-#define CT_GUID "ct_guid"
-#define CT_INT "ct_int"
-#define CT_INT64 "ct_int64"
-#define CT_TIMESPEC "ct_timespec"
-#define CT_GDATE "ct_gdate"
-#define CT_NUMERIC "ct_numeric"
-#define CT_DOUBLE "ct_double"
-#define CT_BOOLEAN "ct_boolean"
-#define CT_ACCOUNTREF "ct_accountref"
-#define CT_COMMODITYREF "ct_commodityref"
-#define CT_TXREF "ct_txref"
-#define CT_LOTREF "ct_lotref"
-
-struct col_cvt {
-	const gchar* col_name;
-	const gchar* col_type;
-	gint size;
-#define COL_PKEY	0x01
-#define COL_NNUL	0x02
-#define COL_UNIQUE	0x04
-#define COL_AUTOINC	0x08
-	gint flags;
-	const gchar* gobj_param_name;	// If non-null, use g_object_get/g_object_set
-	const gchar* param_name;	// If non null, use qof getter/setter
-	QofAccessFunc getter;
-	QofSetterFunc setter;
-};
-
-typedef enum {
-	OP_DB_ADD,
-	OP_DB_ADD_OR_UPDATE,
-	OP_DB_DELETE
-} E_DB_OPERATION;
-
-typedef void (*GNC_SQL_LOAD_FN)( const GncSqlBackend* be,
-								GncSqlRow* row,
-                                QofSetterFunc setter, gpointer pObject,
-                                const col_cvt_t* table );
-typedef void (*GNC_SQL_ADD_COL_INFO_TO_LIST_FN)( const GncSqlBackend* be,
-                        						const col_cvt_t* table_row,
-												GList** pList );
-typedef void (*GNC_SQL_ADD_COLNAME_TO_LIST_FN)( const col_cvt_t* table_row, GList** pList );
-typedef void (*GNC_SQL_ADD_GVALUE_TO_SLIST_FN)( const GncSqlBackend* be,
-                QofIdTypeConst obj_name, const gpointer pObject,
-                const col_cvt_t* table_row, GSList** pList );
-
-typedef struct {
-    GNC_SQL_LOAD_FN                 load_fn;
-    GNC_SQL_ADD_COL_INFO_TO_LIST_FN add_col_info_to_list_fn;
-    GNC_SQL_ADD_COLNAME_TO_LIST_FN  add_colname_to_list_fn;
-	GNC_SQL_ADD_GVALUE_TO_SLIST_FN	add_gvalue_to_slist_fn;
-} col_type_handler_t;
-
-GncSqlColumnInfo* gnc_sql_create_column_info( const col_cvt_t* table_row, const gchar* type, gint size );
-QofAccessFunc gnc_sql_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row );
-
-void gnc_sql_add_colname_to_list( const col_cvt_t* table_row, GList** pList );
-
-gboolean gnc_sql_do_db_operation( GncSqlBackend* pBackend,
-									E_DB_OPERATION op,
-									const gchar* table_name,
-									QofIdTypeConst obj_name,
-									gpointer pObject,
-									const col_cvt_t* table );
-GncSqlStatement* gnc_sql_build_insert_statement( GncSqlBackend* pBackend,
-									const gchar* table_name,
-									QofIdTypeConst obj_name,
-									gpointer pObject,
-									const col_cvt_t* table );
-GncSqlStatement* gnc_sql_build_update_statement( GncSqlBackend* pBackend,
-									const gchar* table_name,
-									QofIdTypeConst obj_name,
-									gpointer pObject,
-									const col_cvt_t* table );
-GncSqlStatement* gnc_sql_build_delete_statement( GncSqlBackend* pBackend,
-									const gchar* table_name,
-									QofIdTypeConst obj_name,
-									gpointer pObject,
-									const col_cvt_t* table );
-gint gnc_sql_execute_statement( GncSqlBackend* pBackend, GncSqlStatement* statement );
-GncSqlResult* gnc_sql_execute_select_statement( GncSqlBackend* pBackend, GncSqlStatement* statement );
-GncSqlResult* gnc_sql_execute_sql_statement( GncSqlBackend* pBackend, GncSqlStatement* sqlStmt );
-GncSqlResult* gnc_sql_execute_select_sql( const GncSqlBackend* pBackend, gchar* sql );
-gint gnc_sql_execute_nonselect_sql( const GncSqlBackend* pBackend, gchar* sql );
-GncSqlStatement* gnc_sql_create_statement_from_sql( const GncSqlBackend* pBackend, gchar* sql );
-int gnc_sql_execute_select_get_count( const GncSqlBackend* pBackend, gchar* sql );
-int gnc_sql_execute_statement_get_count( GncSqlBackend* pBackend, GncSqlStatement* statement );
-void gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
-						QofIdTypeConst obj_name, gpointer pObject,
-						const col_cvt_t* table );
-gboolean gnc_sql_object_is_it_in_db( GncSqlBackend* be,
-									const gchar* table_name,
-									QofIdTypeConst obj_name, const gpointer pObject,
-									const col_cvt_t* table );
-gint gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name );
-gboolean gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
-								gint table_version, const col_cvt_t* col_table,
-						GError** error );
-void gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
-						const gchar* table_name, const col_cvt_t* col_table );
-const GUID* gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row );
-const GUID* gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row );
-GncSqlStatement* gnc_sql_create_select_statement( const GncSqlBackend* be, const gchar* table_name,
-										const col_cvt_t* col_table );
-void gnc_sql_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler );
-void gnc_sql_register_standard_col_type_handlers( void );
-
-void gnc_sql_add_gvalue_objectref_guid_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
-                const gpointer pObject, const col_cvt_t* table_row, GSList** pList );
-void gnc_sql_add_objectref_guid_col_info_to_list( const GncSqlBackend* be,
-	            const col_cvt_t* table_row, GList** pList );
-guint gnc_sql_append_guid_list_to_sql( GString* str, GList* list, guint maxCount );
-void gnc_sql_add_subtable_colnames_to_list( const col_cvt_t* table_row, const col_cvt_t* subtable,
-								GList** pList );
-gchar* gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value );
-
-void _retrieve_guid_( gpointer pObject, gpointer pValue );
-void gnc_sql_init_version_info( GncSqlBackend* be );
-void gnc_sql_reset_version_info( GncSqlBackend* be );
-void gnc_sql_finalize_version_info( GncSqlBackend* be );
-
-G_MODULE_EXPORT const gchar *
-g_module_check_init( GModule *module );
-
-#endif /* GNC_BACKEND_SQL_UTIL_H_ */

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-book-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-book-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-book-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -32,7 +32,7 @@
 
 #include "qof.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-book-sql.h"
 #include "gnc-slots-sql.h"
@@ -158,7 +158,7 @@
 	g_return_if_fail( be != NULL );
 
     stmt = gnc_sql_create_select_statement( be, BOOK_TABLE, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
 	if( result != NULL ) {
 		GncSqlRow* row = gnc_sql_result_get_first_row( result );

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-budget-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-budget-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-budget-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -32,7 +32,7 @@
 
 #include "qof.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "Recurrence.h"
 
@@ -98,7 +98,7 @@
 	g_return_if_fail( be != NULL );
 
     stmt = gnc_sql_create_select_statement( be, BUDGET_TABLE, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
 	if( result != NULL ) {
 		GncSqlRow* row = gnc_sql_result_get_first_row( result );

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-commodity-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-commodity-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-commodity-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -32,7 +32,7 @@
 
 #include "qof.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-commodity.h"
 
 #include "gnc-commodity-sql.h"
@@ -137,7 +137,7 @@
 
     pTable = gnc_commodity_table_get_table( be->primary_book );
     stmt = gnc_sql_create_select_statement( be, COMMODITIES_TABLE, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         int r;

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-lots-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-lots-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-lots-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -33,7 +33,7 @@
 #include "qof.h"
 #include "gnc-lot.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gnc-lots-sql.h"
@@ -123,7 +123,7 @@
 	g_return_if_fail( be != NULL );
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         int r;

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-price-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-price-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-price-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -33,7 +33,7 @@
 #include "qof.h"
 #include "gnc-pricedb.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-commodity-sql.h"
 #include "gnc-price-sql.h"
@@ -92,7 +92,7 @@
     pBook = be->primary_book;
     pPriceDB = gnc_book_get_pricedb( pBook );
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         int r;

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-recurrence-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-recurrence-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-recurrence-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include "gnc-engine.h"
 #include "Recurrence.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-recurrence-sql.h"
 

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-schedxaction-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-schedxaction-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-schedxaction-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -32,7 +32,7 @@
 
 #include "qof.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-schedxaction-sql.h"
 #include "gnc-slots-sql.h"
@@ -218,7 +218,7 @@
 	g_return_if_fail( be != NULL );
 
     stmt = gnc_sql_create_select_statement( be, SCHEDXACTION_TABLE, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
 		GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-slots-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-slots-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-slots-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -33,7 +33,7 @@
 #include "qof.h"
 #include "gnc-engine.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-slots-sql.h"
 

Modified: gnucash/branches/gda-dev2/src/backend/sql/gnc-transaction-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/sql/gnc-transaction-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/backend/sql/gnc-transaction-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -38,7 +38,7 @@
 #include "Transaction.h"
 #include "engine-helpers.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-transaction-sql.h"
 #include "gnc-commodity.h"
 #include "gnc-commodity-sql.h"

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/Makefile.am
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/Makefile.am	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/Makefile.am	2008-06-14 02:01:58 UTC (rev 17231)
@@ -44,7 +44,7 @@
 
 libgncmod_business_backend_sql_la_LIBADD = \
   ${top_builddir}/src/business/business-core/libgncmod-business-core.la \
-  ${top_builddir}/src/backend/sql/libgnc-backend-utils-sql.la \
+  ${top_builddir}/src/backend/sql/libgncmod-backend-sql.la \
   ${top_builddir}/src/engine/libgncmod-engine.la \
   ${top_builddir}/src/gnc-module/libgnc-module.la \
   ${QOF_LIBS} \

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-address-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-address-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-address-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -35,10 +35,10 @@
 #include <string.h>
 
 #include "gnc-engine.h"
+
+#include "gnc-backend-sql.h"
 #include "gnc-address-sql.h"
 
-#include "gnc-backend-util-sql.h"
-
 static QofLogModule log_module = G_LOG_DOMAIN;
 
 #define ADDRESS_MAX_NAME_LEN 1024

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-bill-term-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-bill-term-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-bill-term-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncBillTermP.h"
@@ -120,7 +120,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
 		GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-customer-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-customer-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-customer-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncBillTermP.h"
@@ -110,7 +110,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
 		GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-employee-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-employee-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-employee-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -36,7 +36,7 @@
 
 #include "gnc-commodity.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-commodity-sql.h"
 
@@ -44,8 +44,6 @@
 #include "gnc-employee-sql.h"
 #include "gnc-address-sql.h"
 
-#include "gnc-backend-util-sql.h"
-
 #define _GNC_MOD_NAME	GNC_ID_EMPLOYEE
 
 static QofLogModule log_module = G_LOG_DOMAIN;
@@ -109,7 +107,7 @@
     pTable = gnc_commodity_table_get_table( pBook );
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-entry-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-entry-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-entry-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncEntryP.h"
@@ -129,7 +129,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-invoice-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-invoice-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-invoice-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -36,7 +36,7 @@
 
 #include "gnc-commodity.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
 
@@ -114,7 +114,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-job-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-job-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-job-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncJobP.h"
@@ -97,7 +97,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-order-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-order-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-order-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncOrderP.h"
@@ -98,7 +98,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-owner-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-owner-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-owner-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-owner-sql.h"
 #include "gncCustomerP.h"

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-tax-table-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-tax-table-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-tax-table-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gncEntry.h"
@@ -233,7 +233,7 @@
 
     /* First time, create the query */
     stmt = gnc_sql_create_select_statement( be, TT_TABLE_NAME, tt_col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-vendor-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-vendor-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gnc-vendor-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -36,7 +36,7 @@
 
 #include "gnc-commodity.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
 
@@ -111,7 +111,7 @@
     pBook = be->primary_book;
 
     stmt = gnc_sql_create_select_statement( be, TABLE_NAME, col_table );
-    result = gnc_sql_execute_sql_statement( be, stmt );
+    result = gnc_sql_execute_select_statement( be, stmt );
 	gnc_sql_statement_dispose( stmt );
     if( result != NULL ) {
         GncSqlRow* row;

Modified: gnucash/branches/gda-dev2/src/business/business-core/sql/gncmod-business-backend-sql.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/sql/gncmod-business-backend-sql.c	2008-06-13 00:53:43 UTC (rev 17230)
+++ gnucash/branches/gda-dev2/src/business/business-core/sql/gncmod-business-backend-sql.c	2008-06-14 02:01:58 UTC (rev 17231)
@@ -36,7 +36,7 @@
 #include "gnc-module-api.h"
 #include "gnc-engine.h"
 
-#include "gnc-backend-util-sql.h"
+#include "gnc-backend-sql.h"
 
 #include "gnc-address-sql.h"
 #include "gnc-bill-term-sql.h"


Property changes on: gnucash/branches/gda-dev2/src/pixmaps
___________________________________________________________________
Name: svn:ignore
   - Makefile
Makefile.in
semantic.cache
16x16
32x32
48x48
scalable

   + Makefile
Makefile.in
semantic.cache
16x16
22x22
24x24
32x32
48x48
scalable




More information about the gnucash-changes mailing list