r15165 - gnucash/branches/gda-dev/src/backend/gda - 1) Remove unnecessary 2nd DELETE when saving slots

Phil Longstaff plongstaff at cvs.gnucash.org
Wed Nov 29 21:28:23 EST 2006


Author: plongstaff
Date: 2006-11-29 21:28:22 -0500 (Wed, 29 Nov 2006)
New Revision: 15165
Trac: http://svn.gnucash.org/trac/changeset/15165

Modified:
   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-budget-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c
Log:
1) Remove unnecessary 2nd DELETE when saving slots
2) Start move toward GValues internally in GDA backend
3) Use GdaQuery for DELETE operations



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-30 01:16:47 UTC (rev 15164)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-account-gda.c	2006-11-30 02:28:22 UTC (rev 15165)
@@ -210,11 +210,11 @@
 	// Delete old slot info
 	guid = qof_instance_get_guid( inst );
 
-	gnc_gda_slots_delete( be, guid );
-
-	// Now, commit any slots
+	// Now, commit or delete any slots
 	if( !inst->do_free ) {
 		gnc_gda_slots_save( be, guid, qof_instance_get_slots( inst ) );
+	} else {
+		gnc_gda_slots_delete( be, guid );
 	}
 }
 

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-30 01:16:47 UTC (rev 15164)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-11-30 02:28:22 UTC (rev 15165)
@@ -99,11 +99,15 @@
 typedef void (*GNC_GDA_CREATE_COL_FN)( GdaServerProvider* server,
 						GdaConnection* cnn, xmlNodePtr array_data,
 						const col_cvt_t* table_row );
+typedef void (*GNC_GDA_GET_GVALUE_FN)( GncGdaBackend* be,
+				QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value );
 
 typedef struct {
 	GNC_GDA_LOAD_FN			load_fn;
 	GNC_GDA_RENDER_FN		render_fn;
 	GNC_GDA_CREATE_COL_FN	create_col_fn;
+	GNC_GDA_GET_GVALUE_FN	get_gvalue_fn;
 } col_type_handler_t;
 
 
@@ -126,6 +130,28 @@
 	(*setter)( pObject, (const gpointer)s );
 }
 
+static void
+get_gvalue_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	QofAccessFunc getter;
+	gchar* s;
+
+	memset( value, 0, sizeof( GValue ) );
+
+	if( table_row->param_name != NULL ) {
+		getter = qof_class_get_parameter_getter( obj_name,
+												table_row->param_name );
+		s = (gchar*)(*getter)( pObject, NULL );
+	} else {
+		s = (gchar*)(*table_row->getter)( pObject );
+	}
+	if( s ) {
+		g_value_init( value, G_TYPE_STRING );
+		g_value_set_string( value, s );
+	}
+}
+
 static gchar*
 render_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -133,26 +159,15 @@
 	gchar* buf;
 	const gchar* col_name = "";
 	const gchar* equals = "";
-	QofAccessFunc getter;
 	gchar* s;
 	GValue value;
 
-	memset( &value, 0, sizeof( value ) );
-
 	if( include_name ) {
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	if( table_row->param_name != NULL ) {
-		getter = qof_class_get_parameter_getter( obj_name,
-												table_row->param_name );
-		s = (gchar*)(*getter)( pObject, NULL );
-	} else {
-		s = (gchar*)(*table_row->getter)( pObject );
-	}
-	if( s ) {
-		g_value_init( &value, G_TYPE_STRING );
-		g_value_set_string( &value, s );
+	get_gvalue_string( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) == G_TYPE_STRING ) {
 		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 );
@@ -176,7 +191,7 @@
 }
 
 static col_type_handler_t string_handler
-	= { load_string, render_string, create_string_col };
+	= { load_string, render_string, create_string_col, get_gvalue_string };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -196,6 +211,25 @@
 	(*setter)( pObject, (gpointer)int_value );
 }
 
+static void
+get_gvalue_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	gint int_value;
+	QofAccessFunc getter;
+
+	if( table_row->param_name != NULL ) {
+		getter = qof_class_get_parameter_getter( obj_name,
+												table_row->param_name );
+		int_value = (gint)(*getter)( pObject, NULL );
+	} else {
+		int_value = (gint)(*table_row->getter)( pObject );
+	}
+	memset( value, 0, sizeof( GValue ) );
+	g_value_init( value, G_TYPE_INT );
+	g_value_set_int( value, int_value );
+}
+
 static gchar*
 render_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -203,8 +237,6 @@
 	gchar* buf;
 	const gchar* col_name = "";
 	const gchar* equals = "";
-	gint int_value;
-	QofAccessFunc getter;
 	GValue value;
 	gchar* s;
 
@@ -212,19 +244,14 @@
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	if( table_row->param_name != NULL ) {
-		getter = qof_class_get_parameter_getter( obj_name,
-												table_row->param_name );
-		int_value = (gint)(*getter)( pObject, NULL );
+	get_gvalue_int( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) == G_TYPE_INT ) {
+		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 {
-		int_value = (gint)(*table_row->getter)( pObject );
+		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
 	}
-	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;
 }
@@ -242,7 +269,7 @@
 }
 
 static col_type_handler_t int_handler =
-		{ load_int, render_int, create_int_col };
+		{ load_int, render_int, create_int_col, get_gvalue_int };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -262,6 +289,24 @@
 	}
 }
 
+static void
+get_gvalue_int64( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	gint64* pInt64;
+	gint64 i64_value;
+
+	memset( value, 0, sizeof( GValue ) );
+	pInt64 = (*table_row->getter)( pObject );
+	if( pInt64 != NULL ) {
+		gchar* s;
+
+		i64_value = *pInt64;
+		g_value_init( value, G_TYPE_INT64 );
+		g_value_set_int64( value, i64_value );
+	}
+}
+
 static gchar*
 render_int64( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -269,22 +314,16 @@
 	gchar* buf;
 	const gchar* col_name = "";
 	const gchar* equals = "";
-	gint64* pInt64;
-	gint64 i64_value;
 	GValue value;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	pInt64 = (*table_row->getter)( pObject );
-	if( pInt64 != NULL ) {
+	get_gvalue_int64( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) == G_TYPE_INT64 ) {
 		gchar* s;
 
-		i64_value = *pInt64;
-		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 );
@@ -308,7 +347,7 @@
 }
 
 static col_type_handler_t int64_handler =
-		{ load_int64, render_int64, create_int64_col };
+		{ load_int64, render_int64, create_int64_col, get_gvalue_int64 };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -328,6 +367,23 @@
 	}
 }
 
+static void
+get_gvalue_double( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	gdouble* pDouble;
+	gdouble d_value;
+
+	memset( value, 0, sizeof( GValue ) );
+
+	pDouble = (*table_row->getter)( pObject );
+	if( pDouble != NULL ) {
+		d_value = *pDouble;
+		g_value_init( value, G_TYPE_DOUBLE );
+		g_value_set_double( value, d_value );
+	}
+}
+
 static gchar*
 render_double( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -335,22 +391,16 @@
 	gchar* buf;
 	const gchar* col_name = "";
 	const gchar* equals = "";
-	gdouble* pDouble;
-	gdouble d_value;
 	GValue value;
 
 	if( include_name ) {
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	pDouble = (*table_row->getter)( pObject );
-	if( pDouble != NULL ) {
+	get_gvalue_double( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) == G_TYPE_DOUBLE ) {
 		gchar* s;
 
-		d_value = *pDouble;
-		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 );
@@ -374,7 +424,7 @@
 }
 
 static col_type_handler_t double_handler =
-		{ load_double, render_double, create_double_col };
+		{ load_double, render_double, create_double_col, get_gvalue_double };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -396,6 +446,27 @@
 	(*setter)( pObject, (gpointer)pGuid );
 }
 
+static void
+get_gvalue_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	const GUID* guid;
+	gchar guid_buf[GUID_ENCODING_LENGTH+1];
+
+	memset( value, 0, sizeof( GValue ) );
+
+	if( table_row->getter != NULL ) {
+		guid = (*table_row->getter)( pObject );
+	} else {
+		guid = 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 );
+	}
+}
+
 static gchar*
 render_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -412,16 +483,8 @@
 		col_name = table_row->col_name;
 		equals = "=";
 	}
-	if( table_row->getter != NULL ) {
-		guid = (*table_row->getter)( pObject );
-	} else {
-		guid = NULL;
-	}
-	if( guid != NULL ) {
-		(void)guid_to_string_buff( guid, guid_buf );
-		memset( &value, 0, sizeof( value ) );
-		g_value_init( &value, G_TYPE_STRING );
-		g_value_set_string( &value, guid_buf );
+	get_gvalue_guid( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) == G_TYPE_STRING ) {
 		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 );
@@ -441,7 +504,7 @@
 }
 
 static col_type_handler_t guid_handler =
-		{ load_guid, render_guid, create_guid_col };
+		{ load_guid, render_guid, create_guid_col, get_gvalue_guid };
 /* ----------------------------------------------------------------- */
 static void
 load_timespec( GdaDataModel* pModel, gint row,
@@ -789,7 +852,6 @@
 	GdaQuery* query;
 	GdaQueryTarget* target;
 	GdaQueryField* allFields;
-	GdaQueryField* key;
 
 	/* SELECT */
 	query = gda_query_new( be->pDict );
@@ -874,6 +936,16 @@
 	return buf;
 }
 
+static void
+get_col_gvalue( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	col_type_handler_t* pHandler;
+	pHandler = get_handler( table_row->col_type );
+
+	pHandler->get_gvalue_fn( be, obj_name, pObject, table_row, value );
+}
+
 gboolean
 gnc_gda_object_is_it_in_db( GncGdaBackend* be, const gchar* table_name,
 					QofIdTypeConst obj_name, gpointer pObject,
@@ -1008,20 +1080,43 @@
 							QofIdTypeConst obj_name, gpointer pObject,
 							const col_cvt_t* table )
 {
-	gchar* sql;
-	GError* error = NULL;
 	GdaQuery* query;
-	gchar* col_value;
+	GdaQueryTarget* target;
+	GdaQueryCondition* cond;
+	GdaQueryField* key;
+	GdaQueryField* key_value;
+	GValue value;
 
-	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 );
+	/* DELETE */
+	query = gda_query_new( be->pDict );
+	gda_query_set_query_type( query, GDA_QUERY_TYPE_DELETE );
 
-	query = gda_query_new_from_sql( be->pDict, sql, &error );
-	g_free( sql );
-	if( query == NULL ) {
-		printf( "SQL error: %s\n", error->message );
-	}
+	/* FROM */
+	target = gda_query_target_new( query, table_name );
+	gda_query_add_target( query, target, NULL );
+	g_object_unref( G_OBJECT(target) );
+
+	/* WHERE */
+	cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_LEAF_EQUAL );
+	gda_query_set_condition( query, cond );
+	g_object_unref( G_OBJECT(cond) );
+
+	key = gda_query_field_field_new( query, table[0].col_name );
+	gda_query_field_set_visible( key, TRUE );
+	gda_query_condition_leaf_set_operator( cond,
+											GDA_QUERY_CONDITION_OP_LEFT,
+											GDA_QUERY_FIELD(key) );
+	g_object_unref( G_OBJECT(key) );
+
+	key_value = gda_query_field_value_new( query, G_TYPE_STRING );
+	gda_query_field_set_visible( key_value, TRUE );
+	gda_query_condition_leaf_set_operator( cond, GDA_QUERY_CONDITION_OP_RIGHT,
+												GDA_QUERY_FIELD(key_value) );
+	g_object_unref( G_OBJECT(key_value) );
+
+	get_col_gvalue( be, obj_name, pObject, &table[0], &value );
+	gda_query_field_value_set_value( GDA_QUERY_FIELD_VALUE(key_value), &value );
+
 	return query;
 }
 

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-30 01:16:47 UTC (rev 15164)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-budget-gda.c	2006-11-30 02:28:22 UTC (rev 15165)
@@ -206,11 +206,11 @@
 	// 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 ) );
+	} else {
+		gnc_gda_slots_delete( be, guid );
 	}
 }
 

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c	2006-11-30 01:16:47 UTC (rev 15164)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-schedxaction-gda.c	2006-11-30 02:28:22 UTC (rev 15165)
@@ -132,11 +132,11 @@
 	// 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 ) );
+	} else {
+		gnc_gda_slots_delete( be, guid );
 	}
 #endif
 }

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-30 01:16:47 UTC (rev 15164)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-transaction-gda.c	2006-11-30 02:28:22 UTC (rev 15165)
@@ -552,13 +552,14 @@
 	guid = qof_instance_get_guid( inst );
 
 	// Delete any old slots and splits for this transaction
-	gnc_gda_slots_delete( be, guid );
 	delete_splits( be, pTx );
 
 	if( !inst->do_free ) {
 		// Now, commit any slots and splits
 		gnc_gda_slots_save( be, guid, qof_instance_get_slots( inst ) );
 		save_splits( be, guid, xaccTransGetSplitList( pTx ) );
+	} else {
+		gnc_gda_slots_delete( be, guid );
 	}
 }
 



More information about the gnucash-changes mailing list