r15163 - gnucash/branches/gda-dev/src/backend/gda - 1) Initial framework for handling sched transactions

Phil Longstaff plongstaff at cvs.gnucash.org
Wed Nov 29 17:12:11 EST 2006


Author: plongstaff
Date: 2006-11-29 17:12:09 -0500 (Wed, 29 Nov 2006)
New Revision: 15163
Trac: http://svn.gnucash.org/trac/changeset/15163

Added:
   gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.h
Modified:
   gnucash/branches/gda-dev/src/backend/gda/Makefile.am
   gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h
   gnucash/branches/gda-dev/src/backend/gda/gnc-budget-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-commodity-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c
Log:
1) Initial framework for handling sched transactions
2) Use GdaQuery for initial load
3) Use GdaDataHandlers for rendering objects.  Good for everything
except dates which are rendered as 'DD-MM-YYYY' instead of 'YYYY-MM-DD'.


Modified: gnucash/branches/gda-dev/src/backend/gda/Makefile.am
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/Makefile.am	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/Makefile.am	2006-11-29 22:12:09 UTC (rev 15163)
@@ -22,6 +22,7 @@
   gnc-commodity-gda.c \
   gnc-lots-gda.c \
   gnc-price-gda.c \
+  gnc-schedxaction-gda.c \
   gnc-slots-gda.c \
   gnc-transaction-gda.c
 

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -49,7 +49,6 @@
 static void set_commodity( gpointer pObject, const gpointer pValue );
 static gpointer get_parent( gpointer pObject );
 static void set_parent( gpointer pObject, const gpointer pValue );
-static void retrieve_guid( gpointer pObject, const gpointer pValue );
 
 #define ACCOUNT_MAX_NAME_LEN 50
 #define ACCOUNT_MAX_TYPE_LEN 50
@@ -71,24 +70,7 @@
 	{ NULL }
 };
 
-// Table to retrieve just the guid
-static col_cvt_t guid_table[] =
-{
-	{ "guid", CT_GUID, 0, 0, NULL, NULL, retrieve_guid },
-	{ NULL }
-};
-
-
 /* ================================================================= */
-static void 
-retrieve_guid( gpointer pObject, const gpointer pValue )
-{
-	GUID** ppGuid = (GUID**)pObject;
-	GUID* guid = (GUID*)pValue;
-
-	*ppGuid = guid;
-}
-
 static gpointer
 get_commodity( gpointer pObject )
 {
@@ -149,7 +131,7 @@
 	const GUID* guid;
 	GUID acc_guid;
 
-	gnc_gda_load_object( pModel, row, GNC_ID_ACCOUNT, &guid, guid_table );
+	guid = gnc_gda_load_guid( pModel, row );
 	acc_guid = *guid;
 
 	if( pAccount == NULL ) {
@@ -170,14 +152,17 @@
 static void
 load_accounts( GncGdaBackend* be )
 {
-	gchar* buf;
+	static GdaQuery* query = NULL;
 	GdaObject* ret;
 	QofBook* pBook = be->primary_book;
 	gnc_commodity_table* pTable = gnc_commodity_table_get_table( pBook );
 
-	buf = g_strdup_printf( "SELECT * FROM %s", TABLE_NAME );
-	ret = gnc_gda_execute_sql( be, buf );
-	g_free( buf );
+	/* First time, create the query */
+	if( query == NULL ) {
+		query = gnc_gda_create_select_query( be, TABLE_NAME );
+	}
+
+	ret = gnc_gda_execute_query( be, query );
 	if( GDA_IS_DATA_MODEL( ret ) ) {
 		GdaDataModel* pModel = (GdaDataModel*)ret;
 		int numRows = gda_data_model_get_n_rows( pModel );

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -60,6 +60,7 @@
 #include "gnc-commodity-gda.h"
 #include "gnc-lots-gda.h"
 #include "gnc-price-gda.h"
+#include "gnc-schedxaction-gda.h"
 #include "gnc-slots-gda.h"
 #include "gnc-transaction-gda.h"
 
@@ -93,7 +94,7 @@
 typedef void (*GNC_GDA_LOAD_FN)( GdaDataModel* pModel, gint row,
 								QofSetterFunc setter, gpointer pObject,
 								const col_cvt_t* table );
-typedef gchar* (*GNC_GDA_RENDER_FN)( QofIdTypeConst obj_name, gpointer pObject,
+typedef gchar* (*GNC_GDA_RENDER_FN)( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name );
 typedef void (*GNC_GDA_CREATE_COL_FN)( GdaServerProvider* server,
 						GdaConnection* cnn, xmlNodePtr array_data,
@@ -126,7 +127,7 @@
 }
 
 static gchar*
-render_string( QofIdTypeConst obj_name, gpointer pObject,
+render_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -134,7 +135,6 @@
 	const gchar* equals = "";
 	QofAccessFunc getter;
 	gchar* s;
-	GdaDataHandler* pHandler = gda_handler_string_new();
 	GValue value;
 
 	memset( &value, 0, sizeof( value ) );
@@ -153,7 +153,7 @@
 	if( s ) {
 		g_value_init( &value, G_TYPE_STRING );
 		g_value_set_string( &value, s );
-		s = gda_data_handler_get_sql_from_value( pHandler, &value );
+		s = gda_data_handler_get_sql_from_value( be->pStrHandler, &value );
 		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
 		g_free( s );
 	} else {
@@ -197,7 +197,7 @@
 }
 
 static gchar*
-render_int( QofIdTypeConst obj_name, gpointer pObject,
+render_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -205,6 +205,8 @@
 	const gchar* equals = "";
 	gint int_value;
 	QofAccessFunc getter;
+	GValue value;
+	gchar* s;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
@@ -217,7 +219,12 @@
 	} else {
 		int_value = (gint)(*table_row->getter)( pObject );
 	}
-	buf = g_strdup_printf( "%s%s%d", col_name, equals, int_value );
+	memset( &value, 0, sizeof( value ) );
+	g_value_init( &value, G_TYPE_INT );
+	g_value_set_int( &value, int_value );
+	s = gda_data_handler_get_sql_from_value( be->pNumHandler, &value );
+	buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+	g_free( s );
 
 	return buf;
 }
@@ -256,7 +263,7 @@
 }
 
 static gchar*
-render_int64( QofIdTypeConst obj_name, gpointer pObject,
+render_int64( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -264,6 +271,7 @@
 	const gchar* equals = "";
 	gint64* pInt64;
 	gint64 i64_value;
+	GValue value;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
@@ -271,8 +279,15 @@
 	}
 	pInt64 = (*table_row->getter)( pObject );
 	if( pInt64 != NULL ) {
+		gchar* s;
+
 		i64_value = *pInt64;
-		buf = g_strdup_printf( "%s%s%lld", col_name, equals, i64_value );
+		memset( &value, 0, sizeof( value ) );
+		g_value_init( &value, G_TYPE_INT64 );
+		g_value_set_int64( &value, i64_value );
+		s = gda_data_handler_get_sql_from_value( be->pNumHandler, &value );
+		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+		g_free( s );
 	} else {
 		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
@@ -314,7 +329,7 @@
 }
 
 static gchar*
-render_double( QofIdTypeConst obj_name, gpointer pObject,
+render_double( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -322,6 +337,7 @@
 	const gchar* equals = "";
 	gdouble* pDouble;
 	gdouble d_value;
+	GValue value;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
@@ -329,8 +345,15 @@
 	}
 	pDouble = (*table_row->getter)( pObject );
 	if( pDouble != NULL ) {
+		gchar* s;
+
 		d_value = *pDouble;
-		buf = g_strdup_printf( "%s%s%g", col_name, equals, d_value );
+		memset( &value, 0, sizeof( value ) );
+		g_value_init( &value, G_TYPE_DOUBLE );
+		g_value_set_double( &value, d_value );
+		s = gda_data_handler_get_sql_from_value( be->pNumHandler, &value );
+		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+		g_free( s );
 	} else {
 		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
@@ -374,7 +397,7 @@
 }
 
 static gchar*
-render_guid( QofIdTypeConst obj_name, gpointer pObject,
+render_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -382,7 +405,8 @@
 	const gchar* equals = "";
 	const GUID* guid;
 	gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	const gchar* s;
+	gchar* s;
+	GValue value;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
@@ -395,7 +419,12 @@
 	}
 	if( guid != NULL ) {
 		(void)guid_to_string_buff( guid, guid_buf );
-		buf = g_strdup_printf( "%s%s'%s'", col_name, equals, guid_buf );
+		memset( &value, 0, sizeof( value ) );
+		g_value_init( &value, G_TYPE_STRING );
+		g_value_set_string( &value, guid_buf );
+		s = gda_data_handler_get_sql_from_value( be->pStrHandler, &value );
+		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+		g_free( s );
 	} else {
 		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
@@ -436,14 +465,13 @@
 }
 
 static gchar*
-render_timespec( QofIdTypeConst obj_name, gpointer pObject,
+render_timespec( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
 	const gchar* col_name = "";
 	const gchar* equals = "";
 	gchar iso8601_buf[33];
-	gchar date_buf[33];
 	Timespec* pTimespec;
 
 	if( include_name ) {
@@ -452,10 +480,30 @@
 	}
 	pTimespec = (Timespec*)(*table_row->getter)( pObject );
 	if( pTimespec != NULL ) {
+		GDate* date;
+		gchar* s;
+		gint y, m, d;
+		GValue value;
+
+		date = g_date_new();
 		(void)gnc_timespec_to_iso8601_buff( *pTimespec, iso8601_buf );
-		strncpy( date_buf, iso8601_buf, 4+1+2+1+2 );
-		date_buf[4+1+2+1+2] = '\0';
-		buf = g_strdup_printf( "%s%s'%s'", col_name, equals, date_buf );
+		sscanf( iso8601_buf, "%d-%d-%d", &y, &m, &d );
+		g_date_set_dmy( date, d, m, y );
+		memset( &value, 0, sizeof( value ) );
+		g_value_init( &value, G_TYPE_DATE );
+		g_value_set_boxed( &value, date );
+
+#if 0
+		s = gda_data_handler_get_sql_from_value( be->pDateHandler, &value );
+#else
+		s = g_strdup_printf( "'%d-%d-%d'",
+								g_date_get_year( date ),
+								g_date_get_month( date ),
+								g_date_get_day( date ) );
+#endif
+		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+		g_free( s );
+		g_date_free( date );
 	} else {
 		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
@@ -496,7 +544,7 @@
 }
 
 static gchar*
-render_date( QofIdTypeConst obj_name, gpointer pObject,
+render_date( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -510,10 +558,22 @@
 	}
 	date = (GDate*)(*table_row->getter)( pObject );
 	if( date != NULL ) {
-		buf = g_strdup_printf( "%s%s'%d-%d-%d'", col_name, equals,
-									g_date_get_year( date ),
-									g_date_get_month( date ),
-									g_date_get_day( date ) );
+		gchar* s;
+		GValue value;
+
+		memset( &value, 0, sizeof( value ) );
+		g_value_init( &value, G_TYPE_DATE );
+		g_value_set_boxed( &value, date );
+#if 0
+		s = gda_data_handler_get_sql_from_value( be->pDateHandler, &value );
+#else
+		s = g_strdup_printf( "'%d-%d-%d'",
+								g_date_get_year( date ),
+								g_date_get_month( date ),
+								g_date_get_day( date ) );
+#endif
+		buf = g_strdup_printf( "%s%s%s", col_name, equals, s );
+		g_free( s );
 	} else {
 		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
@@ -560,7 +620,7 @@
 }
 
 static gchar*
-render_numeric( QofIdTypeConst obj_name, gpointer pObject,
+render_numeric( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
@@ -569,15 +629,29 @@
 
 	pNumeric = (gnc_numeric*)(*table_row->getter) (pObject );
 	if( pNumeric != NULL ) {
+		gchar* s_num;
+		gchar* s_denom;
+		GValue value_num;
+		GValue value_denom;
+
 		v = *pNumeric;
+		memset( &value_num, 0, sizeof( value_num ) );
+		g_value_init( &value_num, G_TYPE_INT64 );
+		g_value_set_int64( &value_num, gnc_numeric_num( v ) );
+		memset( &value_denom, 0, sizeof( value_denom ) );
+		g_value_init( &value_denom, G_TYPE_INT64 );
+		g_value_set_int64( &value_denom, gnc_numeric_denom( v ) );
+		s_num = gda_data_handler_get_sql_from_value( be->pNumHandler, &value_num );
+		s_denom = gda_data_handler_get_sql_from_value( be->pNumHandler, &value_denom );
 		if( include_name ) {
-			buf = g_strdup_printf( "%s_num=%lld, %s_denom=%lld",
-							table_row->col_name, gnc_numeric_num( v ),
-							table_row->col_name, gnc_numeric_denom( v ) );
+			buf = g_strdup_printf( "%s_num=%s, %s_denom=%s",
+							table_row->col_name, s_num,
+							table_row->col_name, s_denom );
 		} else {
-			buf = g_strdup_printf( "%lld, %lld",
-								gnc_numeric_num( v ), gnc_numeric_denom( v ) );
+			buf = g_strdup_printf( "%s, %s", s_num, s_denom );
 		}
+		g_free( s_num );
+		g_free( s_denom );
 	} else {
 		if( include_name ) {
 			buf = g_strdup_printf( "%s_num=NULL, %s_denom=NULL",
@@ -658,6 +732,35 @@
 	return pHandler;
 }
 
+static void retrieve_guid( gpointer pObject, const gpointer pValue );
+
+static void 
+retrieve_guid( gpointer pObject, const gpointer pValue )
+{
+	GUID** ppGuid = (GUID**)pObject;
+	GUID* guid = (GUID*)pValue;
+
+	*ppGuid = guid;
+}
+
+
+// Table to retrieve just the guid
+static col_cvt_t guid_table[] =
+{
+	{ "guid", CT_GUID, 0, 0, NULL, NULL, retrieve_guid },
+	{ NULL }
+};
+
+const GUID*
+gnc_gda_load_guid( GdaDataModel* pModel, gint row )
+{
+	const GUID* guid;
+
+	gnc_gda_load_object( pModel, row, NULL, &guid, guid_table );
+
+	return guid;
+}
+
 void
 gnc_gda_load_object( GdaDataModel* pModel, gint row,
 					QofIdTypeConst obj_name, gpointer pObject,
@@ -680,6 +783,33 @@
 }
 
 /* ================================================================= */
+GdaQuery*
+gnc_gda_create_select_query( const GncGdaBackend* be, const gchar* table_name )
+{
+	GdaQuery* query;
+	GdaQueryTarget* target;
+	GdaQueryField* allFields;
+	GdaQueryField* key;
+
+	/* SELECT */
+	query = gda_query_new( be->pDict );
+	gda_query_set_query_type( query, GDA_QUERY_TYPE_SELECT );
+
+	/* FROM */
+	target = gda_query_target_new( query, table_name );
+	gda_query_add_target( query, target, NULL );
+	g_object_unref( G_OBJECT(target) );
+
+	/* all fields */
+	allFields = gda_query_field_all_new( query, table_name );
+	gda_query_field_set_visible( allFields, TRUE );
+	gda_entity_add_field( GDA_ENTITY(query), GDA_ENTITY_FIELD(allFields) );
+	g_object_unref( G_OBJECT(allFields) );
+
+	return query;
+}
+
+/* ================================================================= */
 GdaObject*
 gnc_gda_execute_query( GncGdaBackend* be, GdaQuery* query )
 {
@@ -733,14 +863,14 @@
 }
 /* ================================================================= */
 static gchar*
-render_col_value( QofIdTypeConst obj_name, gpointer pObject,
+render_col_value( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
 	col_type_handler_t* pHandler;
 	pHandler = get_handler( table_row->col_type );
 
-	buf = pHandler->render_fn( obj_name, pObject, table_row, include_name );
+	buf = pHandler->render_fn( be, obj_name, pObject, table_row, include_name );
 	return buf;
 }
 
@@ -753,7 +883,7 @@
 	int count;
 	gchar* key_value;
 
-	key_value = render_col_value( obj_name, pObject, table, TRUE );
+	key_value = render_col_value( be, obj_name, pObject, table, TRUE );
 
 	sql = g_strdup_printf( "SELECT * FROM %s WHERE %s;",
 							table_name, key_value );
@@ -819,7 +949,7 @@
 
 	for( col = 0; table[col].col_name != NULL; col++ ) {
 		if( col != 0 ) g_string_append( sql, "," );
-		col_value = render_col_value( obj_name, pObject, &table[col], FALSE );
+		col_value = render_col_value( be, obj_name, pObject, &table[col], FALSE );
 		g_string_append( sql, col_value );
 		g_free( col_value );
 	}
@@ -852,14 +982,14 @@
 	for( col = 1; table[col].col_name != NULL; col++ ) {
 		if( col != 1 ) g_string_append( sql, "," );
 
-		col_value = render_col_value( obj_name, pObject, &table[col], TRUE );
+		col_value = render_col_value( be, obj_name, pObject, &table[col], TRUE );
 		g_string_append( sql, col_value );
 		g_free( col_value );
 	}
 
 	g_string_append( sql, " WHERE " );
 
-	col_value = render_col_value( obj_name, pObject, &table[0], TRUE );
+	col_value = render_col_value( be, obj_name, pObject, &table[0], TRUE );
 	g_string_append( sql, col_value );
 	g_free( col_value );
 	g_string_append( sql, ";" );
@@ -883,7 +1013,7 @@
 	GdaQuery* query;
 	gchar* col_value;
 
-	col_value = render_col_value( obj_name, pObject, &table[0], TRUE );
+	col_value = render_col_value( be, obj_name, pObject, &table[0], TRUE );
 	sql = g_strdup_printf( "DELETE FROM %s WHERE %s;", table_name, col_value );
 	g_free( col_value );
 
@@ -1119,6 +1249,10 @@
 		printf( "gda_dict_update_dbms_meta_data() error: %s\n", error->message );
 	}
 
+	be->pStrHandler = gda_handler_string_new();
+	be->pNumHandler = gda_handler_numerical_new();
+	be->pDateHandler = gda_handler_time_new_no_locale();
+
     LEAVE (" ");
 }
 
@@ -1142,6 +1276,15 @@
 		g_object_unref( G_OBJECT(be->pClient ) );
 		be->pClient = NULL;
 	}
+	if( be->pStrHandler != NULL ) {
+		g_object_unref( G_OBJECT(be->pStrHandler) );
+	}
+	if( be->pNumHandler != NULL ) {
+		g_object_unref( G_OBJECT(be->pNumHandler) );
+	}
+	if( be->pDateHandler != NULL ) {
+		g_object_unref( G_OBJECT(be->pDateHandler) );
+	}
 
     LEAVE (" ");
 }
@@ -1532,6 +1675,7 @@
 	gnc_gda_init_price_handler();
 	gnc_gda_init_transaction_handler();
 	gnc_gda_init_slots_handler();
+	gnc_gda_init_schedxaction_handler();
 	gnc_gda_init_lot_handler();
 }
 

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h	2006-11-29 22:12:09 UTC (rev 15163)
@@ -41,6 +41,10 @@
   GdaConnection* pConnection;
   GdaDict* pDict;
 
+  GdaDataHandler* pStrHandler;
+  GdaDataHandler* pNumHandler;
+  GdaDataHandler* pDateHandler;
+
   QofBook *primary_book;	/* The primary, main open book */
   gboolean	loading;		/* We are performing an initial load */
 };
@@ -144,6 +148,8 @@
 						GError** error );
 void gnc_gda_create_table_if_needed( GncGdaBackend* be,
 						const gchar* table_name, col_cvt_t* col_table );
+const GUID* gnc_gda_load_guid( GdaDataModel* pModel, int row );
+GdaQuery* gnc_gda_create_select_query( const GncGdaBackend* be, const gchar* table_name );
 
 G_MODULE_EXPORT const gchar *
 g_module_check_init(GModule *module);

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-budget-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-budget-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-budget-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -32,7 +32,6 @@
 #include <libgda/libgda.h>
 
 #include "qof.h"
-#include "gnc-budget.h"
 
 #include "gnc-backend-gda.h"
 
@@ -46,7 +45,6 @@
 
 static QofLogModule log_module = GNC_MOD_BACKEND;
 
-static void retrieve_guid( gpointer pObject, const gpointer pValue );
 static gpointer get_recurrence_mult( gpointer pObject );
 static void set_recurrence_mult( gpointer pObject, const gpointer pValue );
 static gpointer get_recurrence_period_type( gpointer pObject );
@@ -75,24 +73,7 @@
 	{ NULL }
 };
 
-// Table to retrieve just the guid
-static col_cvt_t guid_table[] =
-{
-	{ "guid", CT_GUID, 0, 0, NULL, NULL, retrieve_guid },
-	{ NULL }
-};
-
-
 /* ================================================================= */
-static void 
-retrieve_guid( gpointer pObject, const gpointer pValue )
-{
-	GUID** ppGuid = (GUID**)pObject;
-	GUID* guid = (GUID*)pValue;
-
-	*ppGuid = guid;
-}
-
 static gpointer
 get_recurrence_mult( gpointer pObject )
 {
@@ -161,7 +142,7 @@
 	const GUID* guid;
 	GUID budget_guid;
 
-	gnc_gda_load_object( pModel, row, GNC_ID_BUDGET, &guid, guid_table );
+	guid = gnc_gda_load_guid( pModel, row );
 	budget_guid = *guid;
 
 	if( pBudget == NULL ) {
@@ -183,13 +164,14 @@
 static void
 load_budgets( GncGdaBackend* be )
 {
-	gchar* buf;
+	static GdaQuery* query;
 	GdaObject* ret;
 	QofBook* pBook = be->primary_book;
 
-	buf = g_strdup_printf( "SELECT * FROM %s", BUDGET_TABLE );
-	ret = gnc_gda_execute_sql( be, buf );
-	g_free( buf );
+	if( query == NULL ) {
+		query = gnc_gda_create_select_query( be, BUDGET_TABLE );
+	}
+	ret = gnc_gda_execute_query( be, query );
 	if( GDA_IS_DATA_MODEL( ret ) ) {
 		GdaDataModel* pModel = (GdaDataModel*)ret;
 		int numRows = gda_data_model_get_n_rows( pModel );

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-commodity-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-commodity-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-commodity-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -129,13 +129,14 @@
 static void
 load_commodities( GncGdaBackend* be )
 {
-	gchar* buf;
+	static GdaQuery* query;
 	GdaObject* ret;
 	gnc_commodity_table* pTable = gnc_commodity_table_get_table( be->primary_book );
 
-	buf = g_strdup_printf( "SELECT * FROM %s", COMMODITIES_TABLE );
-	ret = gnc_gda_execute_sql( be, buf );
-	g_free( buf );
+	if( query == NULL ) {
+		query = gnc_gda_create_select_query( be, COMMODITIES_TABLE );
+	}
+	ret = gnc_gda_execute_query( be, query );
 	if( GDA_IS_DATA_MODEL( ret ) ) {
 		GdaDataModel* pModel = (GdaDataModel*)ret;
 		int numRows = gda_data_model_get_n_rows( pModel );

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -170,14 +170,15 @@
 static void
 load_prices( GncGdaBackend* be )
 {
-	gchar* buf;
+	static GdaQuery* query;
 	GdaObject* ret;
 	QofBook* pBook = be->primary_book;
 	GNCPriceDB* pPriceDB = gnc_book_get_pricedb( pBook );
 
-	buf = g_strdup_printf( "SELECT * FROM %s", TABLE_NAME );
-	ret = gnc_gda_execute_sql( be, buf );
-	g_free( buf );
+	if( query == NULL ) {
+		query = gnc_gda_create_select_query( be, TABLE_NAME );
+	}
+	ret = gnc_gda_execute_query( be, query );
 	if( GDA_IS_DATA_MODEL( ret ) ) {
 		GdaDataModel* pModel = (GdaDataModel*)ret;
 		int numRows = gda_data_model_get_n_rows( pModel );

Added: gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -0,0 +1,161 @@
+/********************************************************************
+ * gnc-schedxaction-gda.c: load and save data to SQL via libgda     *
+ *                                                                  *
+ * 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-schedxaction-gda.c
+ *  @brief load and save data to SQL 
+ *  @author Copyright (c) 2006 Phil Longstaff <plongstaff at rogers.com>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an SQL db using libgda
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <libgda/libgda.h>
+
+#include "qof.h"
+
+#include "gnc-backend-gda.h"
+
+#include "gnc-schedxaction-gda.h"
+#include "gnc-slots-gda.h"
+
+#include "SchedXaction.h"
+
+#define SCHEDXACTION_TABLE "schedxactions"
+
+static QofLogModule log_module = GNC_MOD_BACKEND;
+
+static col_cvt_t col_table[] =
+{
+	{ "guid",			CT_GUID,	0, COL_NNUL|COL_PKEY,	NULL,
+			(GNC_GDA_FN_GETTER)qof_entity_get_guid,
+			(GNC_GDA_FN_SETTER)qof_entity_set_guid },
+	{ NULL }
+};
+
+/* ================================================================= */
+
+/* ================================================================= */
+static SchedXaction*
+load_sx( GncGdaBackend* be, GdaDataModel* pModel, int row,
+			SchedXaction* pSx )
+{
+#if 0
+	const GUID* guid;
+	GUID budget_guid;
+
+	gnc_gda_load_object( pModel, row, GNC_ID_BUDGET, &guid, guid_table );
+	budget_guid = *guid;
+
+	if( pBudget == NULL ) {
+		pBudget = gnc_budget_lookup( &budget_guid, be->primary_book );
+		if( pBudget == NULL ) {
+			pBudget = gnc_budget_new( be->primary_book );
+		}
+	}
+
+	gnc_gda_load_object( pModel, row, GNC_ID_BUDGET, pBudget, col_table );
+	gnc_gda_slots_load( be, gnc_budget_get_guid( pBudget ),
+							qof_instance_get_slots( (QofInstance*)pBudget ) );
+
+	qof_instance_mark_clean( (QofInstance*)pBudget );
+
+#endif
+	return pSx;
+}
+
+static void
+load_sxes( GncGdaBackend* be )
+{
+#if 0
+	gchar* buf;
+	GdaObject* ret;
+	QofBook* pBook = be->primary_book;
+
+	buf = g_strdup_printf( "SELECT * FROM %s", BUDGET_TABLE );
+	ret = gnc_gda_execute_sql( be, buf );
+	g_free( buf );
+	if( GDA_IS_DATA_MODEL( ret ) ) {
+		GdaDataModel* pModel = (GdaDataModel*)ret;
+		int numRows = gda_data_model_get_n_rows( pModel );
+		int r;
+
+		for( r = 0; r < numRows; r++ ) {
+			(void)load_budget( be, pModel, r, NULL );
+		}
+	}
+#endif
+}
+
+/* ================================================================= */
+static void
+create_sx_tables( GncGdaBackend* be )
+{
+#if 0
+	gnc_gda_create_table_if_needed( be, BUDGET_TABLE, col_table );
+#endif
+}
+
+/* ================================================================= */
+static void
+commit_sx( GncGdaBackend* be, QofInstance* inst )
+{
+#if 0
+	GncBudget* pBudget = (GncBudget*)inst;
+	const GUID* guid;
+
+	(void)gnc_gda_do_db_operation( be,
+							(inst->do_free ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
+							BUDGET_TABLE,
+							GNC_ID_BUDGET, pBudget,
+							col_table );
+
+	// Delete old slot info
+	guid = qof_instance_get_guid( inst );
+
+	gnc_gda_slots_delete( be, guid );
+
+	// Now, commit any slots
+	if( !inst->do_free ) {
+		gnc_gda_slots_save( be, guid, qof_instance_get_slots( inst ) );
+	}
+#endif
+}
+
+/* ================================================================= */
+void
+gnc_gda_init_schedxaction_handler( void )
+{
+#if 0
+	static GncGdaDataType_t be_data =
+	{
+		GNC_GDA_BACKEND_VERSION,
+		GNC_ID_BUDGET,
+		commit_budget,				/* commit */
+		load_budgets,				/* initial_load */
+		create_budget_tables		/* create_tables */
+	};
+
+	qof_object_register_backend( GNC_ID_BUDGET, GNC_GDA_BACKEND, &be_data );
+#endif
+}
+/* ========================== END OF FILE ===================== */

Added: gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.h
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.h	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.h	2006-11-29 22:12:09 UTC (rev 15163)
@@ -0,0 +1,37 @@
+/********************************************************************
+ * gnc-schedxaction-gda.h: load and save data to SQL via libgda     *
+ *                                                                  *
+ * 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-gda.h
+ *  @brief load and save data to SQL via libgda
+ *  @author Copyright (c) 2006 Phil Longstaff <plongstaff at rogers.com>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an SQL database via libgda
+ */
+
+#ifndef GNC_SCHEDXACTION_GDA_H_
+#define GNC_SCHEDXACTION_GDA_H_
+
+#include "qof.h"
+#include <gmodule.h>
+
+void gnc_gda_init_schedxaction_handler( void );
+
+#endif /* GNC_SCHEDXACTION_GDA_H_ */

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c	2006-11-29 19:46:34 UTC (rev 15162)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c	2006-11-29 22:12:09 UTC (rev 15163)
@@ -58,7 +58,6 @@
 
 static gpointer get_guid( gpointer pObject );
 static void set_guid( gpointer pObject, const gpointer pValue );
-static void retrieve_guid( gpointer pObject, const gpointer pValue );
 static gpointer get_tx_currency( gpointer pObject );
 static void set_tx_currency( gpointer pObject, const gpointer pValue );
 static gpointer get_tx_num( gpointer pObject );
@@ -89,13 +88,6 @@
 	{ NULL }
 };
 
-// Table to retrieve just the guid
-static col_cvt_t guid_table[] =
-{
-	{ "guid", CT_GUID, 0, 0, NULL, NULL, retrieve_guid },
-	{ NULL }
-};
-
 static gpointer get_split_tx_guid( gpointer pObject );
 static void set_split_tx_guid( gpointer pObject, const gpointer pValue );
 static gpointer get_split_reconcile_state( gpointer pObject );
@@ -155,15 +147,6 @@
 	qof_entity_set_guid( pEntity, guid );
 }
 
-static void 
-retrieve_guid( gpointer pObject, const gpointer pValue )
-{
-	GUID** ppGuid = (GUID**)pObject;
-	GUID* guid = (GUID*)pValue;
-
-	*ppGuid = guid;
-}
-
 static gpointer
 get_tx_currency( gpointer pObject )
 {
@@ -365,7 +348,7 @@
 	const GUID* guid;
 	GUID split_guid;
 
-	gnc_gda_load_object( pModel, row, GNC_ID_SPLIT, &guid, guid_table );
+	guid = gnc_gda_load_guid( pModel, row );
 	split_guid = *guid;
 
 	if( pSplit == NULL ) {
@@ -413,7 +396,7 @@
 	const GUID* guid;
 	GUID tx_guid;
 
-	gnc_gda_load_object( pModel, row, GNC_ID_TRANS, &guid, guid_table );
+	guid = gnc_gda_load_guid( pModel, row );
 	tx_guid = *guid;
 
 	if( pTx == NULL ) {



More information about the gnucash-changes mailing list