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, ×pec_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, ×pec_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