r15108 - gnucash/branches/gda-dev - Save/restore slots associated with accounts. Note that nested slot

Phil Longstaff plongstaff at cvs.gnucash.org
Sat Nov 11 16:15:11 EST 2006


Author: plongstaff
Date: 2006-11-11 16:15:09 -0500 (Sat, 11 Nov 2006)
New Revision: 15108
Trac: http://svn.gnucash.org/trac/changeset/15108

Modified:
   gnucash/branches/gda-dev/GDA_STATUS
   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-commodity-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c
Log:
Save/restore slots associated with accounts.  Note that nested slot
path names are not stored correctly so that on load, the structure will
be flattened.


Modified: gnucash/branches/gda-dev/GDA_STATUS
===================================================================
--- gnucash/branches/gda-dev/GDA_STATUS	2006-11-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/GDA_STATUS	2006-11-11 21:15:09 UTC (rev 15108)
@@ -40,7 +40,7 @@
 - Better representation for gnc_numeric - doesn't compare well
 - queries
 - SQLite if just a "file"
-- slots
+- handle construction of path name for nested slots
 - lots
 - transactions/splits
 - sched transactions

Modified: gnucash/branches/gda-dev/src/backend/gda/Makefile.am
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/Makefile.am	2006-11-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/Makefile.am	2006-11-11 21:15:09 UTC (rev 15108)
@@ -21,6 +21,7 @@
   gnc-budget-gda.c \
   gnc-commodity-gda.c \
   gnc-price-gda.c \
+  gnc-slots-gda.c \
   gnc-transaction-gda.c
 
 #noinst_HEADERS = \

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-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c	2006-11-11 21:15:09 UTC (rev 15108)
@@ -38,6 +38,7 @@
 #include "gnc-backend-gda.h"
 
 #include "gnc-account-gda.h"
+#include "gnc-slots-gda.h"
 
 static QofLogModule log_module = GNC_MOD_BACKEND;
 
@@ -50,21 +51,18 @@
 
 static col_cvt_t col_table[] =
 {
-	{ "guid",			CT_GUID,	  0, COL_NNUL|COL_PKEY,
+	{ "guid",			CT_GUID,	  0, COL_NNUL|COL_PKEY,	NULL,
 			(GNC_GDA_FN_GETTER)qof_entity_get_guid,
 			(GNC_GDA_FN_SETTER)xaccAccountSetGUID },
-	{ "name",			CT_STRING,	 50, COL_NNUL,
-			NULL, NULL, ACCOUNT_NAME_ },
-	{ "account_type",	CT_INT,		  0, COL_NNUL,
+	{ "name",			CT_STRING,	 50, COL_NNUL,	ACCOUNT_NAME_ },
+	{ "account_type",	CT_INT,		  0, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)xaccAccountGetType,
 			(GNC_GDA_FN_SETTER)xaccAccountSetType },
-	{ "commodity_guid",	CT_GUID,	  0, COL_NNUL,
+	{ "commodity_guid",	CT_GUID,	  0, COL_NNUL,	NULL,
 			get_commodity, set_commodity },
-	{ "parent_guid",	CT_GUID,	  0, 0,	get_parent, set_parent },
-	{ "code",			CT_STRING,	100, 0,
-			NULL, NULL, ACCOUNT_CODE_ },
-	{ "description",	CT_STRING,	500, 0,
-			NULL, NULL, ACCOUNT_DESCRIPTION_ },
+	{ "parent_guid",	CT_GUID,	  0, 0,	NULL, get_parent, set_parent },
+	{ "code",			CT_STRING,	100, 0, 		ACCOUNT_CODE_ },
+	{ "description",	CT_STRING,	500, 0, 		ACCOUNT_DESCRIPTION_ },
 	{ NULL }
 };
 
@@ -129,6 +127,8 @@
 
 	pAccount = xaccMallocAccount( be->primary_book );
 	gnc_gda_load_object( pModel, row, GNC_ID_ACCOUNT, pAccount, col_table );
+	gnc_gda_slots_load( be, xaccAccountGetGUID( pAccount ),
+							qof_instance_get_slots( (QofInstance*)pAccount ) );
 
 	return pAccount;
 }
@@ -144,7 +144,7 @@
 	gnc_commodity_table* pTable = gnc_commodity_table_get_table( pBook );
 
 	buf = g_strdup_printf( "SELECT * FROM %s", TABLE_NAME );
-	query = gda_query_new_from_sql( be->pDict, "SELECT * FROM accounts", &error );
+	query = gda_query_new_from_sql( be->pDict, buf, &error );
 	g_free( buf );
 	if( query == NULL ) {
 		printf( "SQL error: %s\n", error->message );
@@ -181,15 +181,7 @@
 static void
 create_account_tables( GncGdaBackend* be )
 {
-	GdaDictTable* table;
-	GError* error = NULL;
-	GdaDictDatabase* db;
-	
-	db = gda_dict_get_database( be->pDict );
-	table = gda_dict_database_get_table_by_name( db, TABLE_NAME );
-	if( !GDA_IS_DICT_TABLE(table) ) {
-		gnc_gda_create_table( be->pConnection, TABLE_NAME, col_table, &error );
-	}
+	gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
 /* ================================================================= */
@@ -203,6 +195,10 @@
 							TABLE_NAME,
 							GNC_ID_ACCOUNT, pAcc,
 							col_table );
+
+	// Now, commit any slots
+	gnc_gda_slots_save( be, qof_instance_get_guid( inst ),
+						qof_instance_get_slots( inst ) );
 }
 
 /* ================================================================= */

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-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-11-11 21:15:09 UTC (rev 15108)
@@ -59,6 +59,7 @@
 #include "gnc-budget-gda.h"
 #include "gnc-commodity-gda.h"
 #include "gnc-price-gda.h"
+#include "gnc-slots-gda.h"
 #include "gnc-transaction-gda.h"
 
 #ifndef HAVE_STRPTIME
@@ -178,7 +179,11 @@
 	gint int_value;
 
 	val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
-	int_value = g_value_get_int( val );
+	if( gda_value_is_null( val ) ) {
+		int_value = 0;
+	} else {
+		int_value = g_value_get_int( val );
+	}
 	(*setter)( pObject, (gpointer)int_value );
 }
 
@@ -218,6 +223,122 @@
 /* ----------------------------------------------------------------- */
 
 static void
+load_int64( GdaDataModel* pModel, gint row,
+			QofSetterFunc setter, gpointer pObject,
+			const col_cvt_t* table )
+{
+	const GValue* val;
+	gint64 i64_value;
+
+	val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	if( gda_value_is_null( val ) ) {
+		(*setter)( pObject, NULL );
+	} else {	
+		i64_value = g_value_get_int64( val );
+		(*setter)( pObject, (gpointer)&i64_value );
+	}
+}
+
+static gchar*
+render_int64( QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, gboolean include_name )
+{
+	gchar* buf;
+	const gchar* col_name = "";
+	const gchar* equals = "";
+	gint64* pInt64;
+	gint64 i64_value;
+
+	if( include_name ) {
+		col_name = table_row->col_name;
+		equals = "=";
+	}
+	pInt64 = (*table_row->getter)( pObject );
+	if( pInt64 != NULL ) {
+		i64_value = *pInt64;
+		buf = g_strdup_printf( "%s%s%lld", col_name, equals, i64_value );
+	} else {
+		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
+	}
+
+	return buf;
+}
+
+static void
+create_int64_col( GdaServerProvider* server, GdaConnection* cnn,
+			xmlNodePtr array_data, const col_cvt_t* table_row )
+{
+	const gchar* dbms_type;
+
+	dbms_type = gda_server_provider_get_default_dbms_type( server,
+														cnn, G_TYPE_INT64 );
+	add_table_column( server, cnn, array_data, table_row->col_name,
+					dbms_type, table_row->size, table_row->flags );
+}
+
+static col_type_handler_t int64_handler =
+		{ load_int64, render_int64, create_int64_col };
+/* ----------------------------------------------------------------- */
+
+static void
+load_double( GdaDataModel* pModel, gint row,
+			QofSetterFunc setter, gpointer pObject,
+			const col_cvt_t* table )
+{
+	const GValue* val;
+	gdouble d_value;
+
+	val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	if( gda_value_is_null( val ) ) {
+		(*setter)( pObject, (gpointer)NULL );
+	} else {
+		d_value = g_value_get_double( val );
+		(*setter)( pObject, (gpointer)&d_value );
+	}
+}
+
+static gchar*
+render_double( QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, gboolean include_name )
+{
+	gchar* buf;
+	const gchar* col_name = "";
+	const gchar* equals = "";
+	gdouble* pDouble;
+	gdouble d_value;
+
+	if( include_name ) {
+		col_name = table_row->col_name;
+		equals = "=";
+	}
+	pDouble = (*table_row->getter)( pObject );
+	if( pDouble != NULL ) {
+		d_value = *pDouble;
+		buf = g_strdup_printf( "%s%s%g", col_name, equals, d_value );
+	} else {
+		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
+	}
+
+	return buf;
+}
+
+static void
+create_double_col( GdaServerProvider* server, GdaConnection* cnn,
+			xmlNodePtr array_data, const col_cvt_t* table_row )
+{
+	const gchar* dbms_type;
+
+	dbms_type = gda_server_provider_get_default_dbms_type( server,
+														cnn, G_TYPE_INT64 );
+	add_table_column( server, cnn, array_data, table_row->col_name,
+					dbms_type, table_row->size, table_row->flags );
+}
+
+static col_type_handler_t double_handler =
+		{ load_double, render_double, create_double_col };
+/* ----------------------------------------------------------------- */
+
+static void
 load_guid( GdaDataModel* pModel, gint row,
 			QofSetterFunc setter, gpointer pObject,
 			const col_cvt_t* table )
@@ -287,11 +408,15 @@
 	Timespec ts;
 
 	val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
-	date = (GDate*)g_value_get_boxed( val );
-	ts = gnc_dmy2timespec( g_date_get_day( date ),
-							g_date_get_month( date ),
-							g_date_get_year( date ) );
-	(*setter)( pObject, &ts );
+	if( gda_value_is_null( val ) ) {
+		(*setter)( pObject, NULL );
+	} else {
+		date = (GDate*)g_value_get_boxed( val );
+		ts = gnc_dmy2timespec( g_date_get_day( date ),
+								g_date_get_month( date ),
+								g_date_get_year( date ) );
+		(*setter)( pObject, &ts );
+	}
 }
 
 static gchar*
@@ -303,16 +428,20 @@
 	const gchar* equals = "";
 	gchar iso8601_buf[33];
 	gchar date_buf[33];
+	Timespec* pTimespec;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	(void)gnc_timespec_to_iso8601_buff(
-								*(Timespec*)(*table_row->getter)( pObject ),
-								iso8601_buf );
-	strncpy( date_buf, iso8601_buf, 4+1+2+1+2 );
-	buf = g_strdup_printf( "%s%s'%s'", col_name, equals, date_buf );
+	pTimespec = (Timespec*)(*table_row->getter)( pObject );
+	if( pTimespec != NULL ) {
+		(void)gnc_timespec_to_iso8601_buff( *pTimespec, iso8601_buf );
+		strncpy( date_buf, iso8601_buf, 4+1+2+1+2 );
+		buf = g_strdup_printf( "%s%s'%s'", col_name, equals, date_buf );
+	} else {
+		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
+	}
 
 	return buf;
 }
@@ -341,17 +470,30 @@
 	gchar* buf;
 	gint64 num, denom;
 	gnc_numeric n;
+	gboolean isNull = FALSE;
 
 	buf = g_strdup_printf( "%s_num", table->col_name );
 	val = gda_data_model_get_value_at_col_name( pModel, buf, row );
 	g_free( buf );
-	num = g_value_get_int64( val );
+	if( gda_value_is_null( val ) ) {
+		isNull = TRUE;
+	} else {
+		num = g_value_get_int64( val );
+	}
 	buf = g_strdup_printf( "%s_denom", table->col_name );
 	val = gda_data_model_get_value_at_col_name( pModel, buf, row );
 	g_free( buf );
-	denom = g_value_get_int64( val );
+	if( gda_value_is_null( val ) ) {
+		isNull = TRUE;
+	} else {
+		denom = g_value_get_int64( val );
+	}
 	n = gnc_numeric_create( num, denom );
-	(*setter)( pObject, &n );
+	if( isNull ) {
+		(*setter)( pObject, NULL );
+	} else {
+		(*setter)( pObject, &n );
+	}
 }
 
 static gchar*
@@ -359,16 +501,27 @@
 				const col_cvt_t* table_row, gboolean include_name )
 {
 	gchar* buf;
+	gnc_numeric* pNumeric;
 	gnc_numeric v;
 
-	v = *(gnc_numeric*)(*table_row->getter) (pObject );
-	if( !include_name ) {
-		buf = g_strdup_printf( "%lld, %lld",
+	pNumeric = (gnc_numeric*)(*table_row->getter) (pObject );
+	if( pNumeric != NULL ) {
+		v = *pNumeric;
+		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 ) );
+		} else {
+			buf = g_strdup_printf( "%lld, %lld",
 								gnc_numeric_num( v ), gnc_numeric_denom( v ) );
+		}
 	} else {
-		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 ) );
+		if( include_name ) {
+			buf = g_strdup_printf( "%s_num=NULL, %s_denom=NULL",
+							table_row->col_name, table_row->col_name );
+		} else {
+			buf = g_strdup( "NULL" );
+		}
 	}
 
 	return buf;
@@ -411,11 +564,19 @@
 			pHandler = &int_handler;
 			break;
 
+		case CT_INT64:
+			pHandler = &int64_handler;
+			break;
+
+		case CT_DOUBLE:
+			pHandler = &double_handler;
+			break;
+
 		case CT_GUID:
 			pHandler = &guid_handler;
 			break;
 				
-		case CT_DATE:
+		case CT_TIMESPEC:
 			pHandler = &date_handler;
 			break;
 
@@ -557,6 +718,8 @@
 		}
 	} else if( op == OP_DB_DELETE ) {
 		pQuery = gnc_gda_build_delete_query( be, table_name, obj_name, pObject, table );
+	} else if( op == OP_DB_ADD ) {
+		pQuery = gnc_gda_build_insert_query( be, table_name, obj_name, pObject, table );
 	} else {
 		g_assert( FALSE );
 	}
@@ -570,30 +733,34 @@
 	}
 }
 
+#define INITIAL_SQL_BUF_LEN 500
+
 GdaQuery*
 gnc_gda_build_insert_query( GncGdaBackend* be,
 							const gchar* table_name,
 							QofIdTypeConst obj_name, gpointer pObject,
 							const col_cvt_t* table )
 {
-	char sql[1000];
+	GString* sql;
 	GError* error = NULL;
 	GdaQuery* query;
 	int col;
 	gchar* col_value;
 
-	sprintf( sql, "INSERT INTO %s VALUES(", table_name );
+	sql = g_string_sized_new( INITIAL_SQL_BUF_LEN );
+	g_string_printf( sql, "INSERT INTO %s VALUES(", table_name );
 
 	for( col = 0; table[col].col_name != NULL; col++ ) {
-		if( col != 0 ) strcat( sql, "," );
+		if( col != 0 ) g_string_append( sql, "," );
 		col_value = render_col_value( obj_name, pObject, &table[col], FALSE );
-		strcat( sql, col_value );
+		g_string_append( sql, col_value );
 		g_free( col_value );
 	}
 
-	strcat( sql, ");" );
+	g_string_append( sql, ");" );
 
-	query = gda_query_new_from_sql( be->pDict, sql, &error );
+	query = gda_query_new_from_sql( be->pDict, sql->str, &error );
+	g_string_free( sql, TRUE );
 	if( query == NULL ) {
 		printf( "SQL error: %s\n", error->message );
 	}
@@ -606,30 +773,32 @@
 							QofIdTypeConst obj_name, gpointer pObject,
 							const col_cvt_t* table )
 {
-	char sql[1000];
+	GString* sql;
 	GError* error = NULL;
 	GdaQuery* query;
 	int col;
 	gchar* col_value;
 
-	sprintf( sql, "UPDATE %s SET ", table_name );
+	sql = g_string_sized_new( INITIAL_SQL_BUF_LEN );
+	g_string_printf( sql, "UPDATE %s SET ", table_name );
 
 	for( col = 1; table[col].col_name != NULL; col++ ) {
-		if( col != 1 ) strcat( sql, "," );
+		if( col != 1 ) g_string_append( sql, "," );
 
 		col_value = render_col_value( obj_name, pObject, &table[col], TRUE );
-		strcat( sql, col_value );
+		g_string_append( sql, col_value );
 		g_free( col_value );
 	}
 
-	strcat( sql, " WHERE " );
+	g_string_append( sql, " WHERE " );
 
 	col_value = render_col_value( obj_name, pObject, &table[0], TRUE );
-	strcat( sql, col_value );
+	g_string_append( sql, col_value );
 	g_free( col_value );
-	strcat( sql, ";" );
+	g_string_append( sql, ";" );
 
-	query = gda_query_new_from_sql( be->pDict, sql, &error );
+	query = gda_query_new_from_sql( be->pDict, sql->str, &error );
+	g_string_free( sql, TRUE );
 	if( query == NULL ) {
 		printf( "SQL error: %s\n", error->message );
 	}
@@ -783,6 +952,22 @@
 	return TRUE;
 }
 
+void gnc_gda_create_table_if_needed( GncGdaBackend* be,
+						const gchar* table_name, col_cvt_t* col_table )
+{
+	GdaDictTable* table;
+	GError* error = NULL;
+	GdaDictDatabase* db;
+	
+	db = gda_dict_get_database( be->pDict );
+	table = gda_dict_database_get_table_by_name( db, table_name );
+	if( !GDA_IS_DICT_TABLE(table) ) {
+		gnc_gda_create_table( be->pConnection, table_name, col_table, &error );
+		if( error != NULL ) {
+			printf( "Error creating table: %s\n", error->message );
+		}
+	}
+}
 /* ================================================================= */
 
 static void
@@ -1172,6 +1357,7 @@
 	gnc_gda_init_budget_handler();
 	gnc_gda_init_price_handler();
 	gnc_gda_init_transaction_handler();
+	gnc_gda_init_slots_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-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h	2006-11-11 21:15:09 UTC (rev 15108)
@@ -73,21 +73,35 @@
 typedef gpointer (*GNC_GDA_FN_GETTER)( gpointer pObject );
 typedef void (*GNC_GDA_FN_SETTER)( gpointer pObject, gpointer pValue );
 
+typedef enum {
+	CT_STRING,
+	CT_GUID,
+	CT_INT,
+	CT_INT64,
+	CT_TIMESPEC,
+	CT_NUMERIC,
+	CT_DOUBLE
+} E_COL_TYPE;
+
 typedef struct {
 	const gchar* col_name;
-	enum { CT_STRING, CT_GUID, CT_INT, CT_DATE, CT_NUMERIC } col_type;
+	E_COL_TYPE col_type;
 	gint size;
 #define COL_PKEY	0x01
 #define COL_NNUL	0x02
 #define COL_UNIQUE	0x04
 #define COL_AUTOINC	0x08
 	gint flags;
+	const char* param_name;		// If non null, use qof getter/setter
 	GNC_GDA_FN_GETTER getter;
 	GNC_GDA_FN_SETTER setter;
-	const char* param_name;
 } col_cvt_t;
 
-typedef enum { OP_DB_ADD_OR_UPDATE, OP_DB_DELETE } E_DB_OPERATION;
+typedef enum {
+	OP_DB_ADD,
+	OP_DB_ADD_OR_UPDATE,
+	OP_DB_DELETE
+} E_DB_OPERATION;
 
 gboolean gnc_gda_do_db_operation( GncGdaBackend* pBackend,
 									E_DB_OPERATION op,
@@ -119,6 +133,8 @@
 gboolean gnc_gda_create_table( GdaConnection* pConnection,
 						const gchar* table_name, col_cvt_t* col_table,
 						GError** error );
+void gnc_gda_create_table_if_needed( GncGdaBackend* be,
+						const gchar* table_name, col_cvt_t* col_table );
 
 G_MODULE_EXPORT const gchar *
 g_module_check_init(GModule *module);

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-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-commodity-gda.c	2006-11-11 21:15:09 UTC (rev 15108)
@@ -49,30 +49,30 @@
 #define TABLE_NAME "commodities"
 
 static col_cvt_t col_table[] = {
-	{ "guid",			CT_GUID,	  0, COL_NNUL|COL_PKEY,
+	{ "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 },
-	{ "namespace",		CT_STRING,	 40, COL_NNUL,
+	{ "namespace",		CT_STRING,	 40, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_namespace,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_namespace },
-	{ "mnemonic",		CT_STRING,	 40, COL_NNUL,
+	{ "mnemonic",		CT_STRING,	 40, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_mnemonic,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_mnemonic },
-	{ "fullname",		CT_STRING,	100, COL_NNUL,
+	{ "fullname",		CT_STRING,	100, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_fullname,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_fullname },
-	{ "cusip",			CT_STRING,	 50, COL_NNUL,
+	{ "cusip",			CT_STRING,	 50, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_cusip,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_cusip },
-	{ "fraction",		CT_INT,		  0, COL_NNUL,
+	{ "fraction",		CT_INT,		  0, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_fraction,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_fraction },
-	{ "quote_flag",		CT_INT,		  0, COL_NNUL,
+	{ "quote_flag",		CT_INT,		  0, COL_NNUL,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_quote_flag,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_quote_flag },
-	{ "quote_source",	CT_STRING,	 50, 0,
+	{ "quote_source",	CT_STRING,	 50, 0,	NULL,
 			get_quote_source_name, set_quote_source_name },
-	{ "quote_tz",		CT_STRING,	 50, 0,
+	{ "quote_tz",		CT_STRING,	 50, 0,	NULL,
 			(GNC_GDA_FN_GETTER)gnc_commodity_get_quote_tz,
 			(GNC_GDA_FN_SETTER)gnc_commodity_set_quote_tz },
 	{ NULL }
@@ -163,15 +163,7 @@
 static void
 create_commodities_tables( GncGdaBackend* be )
 {
-	GdaDictTable* table;
-	GError* error = NULL;
-	GdaDictDatabase* db;
-	
-	db = gda_dict_get_database( be->pDict );
-	table = gda_dict_database_get_table_by_name( db, TABLE_NAME );
-	if( !GDA_IS_DICT_TABLE(table) ) {
-		gnc_gda_create_table( be->pConnection, TABLE_NAME, col_table, &error );
-	}
+	gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
 /* ================================================================= */

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-10 22:16:57 UTC (rev 15107)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-price-gda.c	2006-11-11 21:15:09 UTC (rev 15108)
@@ -53,17 +53,18 @@
 
 static col_cvt_t col_table[] =
 {
-	{ "guid",			CT_GUID,	0, COL_NNUL|COL_PKEY,
+	{ "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 },
-	{ "commodity_guid",	CT_GUID,	0, COL_NNUL, get_commodity, set_commodity },
-	{ "currency_guid",	CT_GUID,	0, COL_NNUL, get_currency, set_currency },
-	{ "date",			CT_DATE,	0, COL_NNUL, get_date, set_date },
-	{ "source",			CT_STRING,	50, 0,
-			NULL, NULL, PRICE_SOURCE },
-	{ "type",			CT_STRING,	50, 0,
-			NULL, NULL, PRICE_TYPE },
-	{ "value",			CT_NUMERIC,	COL_NNUL, 0, get_value, set_value },
+	{ "commodity_guid",	CT_GUID,	0, COL_NNUL, NULL,
+			get_commodity, set_commodity },
+	{ "currency_guid",	CT_GUID,	0, COL_NNUL, NULL,
+			get_currency, set_currency },
+	{ "date",			CT_TIMESPEC,	0, COL_NNUL, NULL,
+			get_date, set_date },
+	{ "source",			CT_STRING,	50, 0, PRICE_SOURCE },
+	{ "type",			CT_STRING,	50, 0, PRICE_TYPE },
+	{ "value",			CT_NUMERIC,	COL_NNUL, 0, NULL, get_value, set_value },
 	{ NULL }
 };
 
@@ -204,34 +205,11 @@
 static void
 create_prices_tables( GncGdaBackend* be )
 {
-	GdaDictTable* table;
-	GError* error = NULL;
-	GdaDictDatabase* db;
-	
-	db = gda_dict_get_database( be->pDict );
-	table = gda_dict_database_get_table_by_name( db, TABLE_NAME );
-	if( !GDA_IS_DICT_TABLE(table) ) {
-		gnc_gda_create_table( be->pConnection, TABLE_NAME, col_table, &error );
-	}
+	gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
 /* ================================================================= */
-static gboolean
-price_exists_in_db( GncGdaBackend* be, const gchar* guid )
-{
-	gchar* cmdbuf;
-	int count;
 
-	cmdbuf = g_strdup_printf( "SELECT * FROM prices WHERE guid='%s';", guid );
-	count = gnc_gda_execute_select_get_count( be, cmdbuf );
-	g_free( cmdbuf );
-	if( count == 0 ) {
-		return FALSE;
-	} else {
-		return TRUE;
-	}
-}
-
 static void
 commit_price( GncGdaBackend* be, QofInstance* inst )
 {



More information about the gnucash-changes mailing list