r15187 - gnucash/branches/gda-dev/src/backend/gda - Replace some remaining SQL with GdaQuery

Phil Longstaff plongstaff at cvs.gnucash.org
Tue Dec 5 22:36:59 EST 2006


Author: plongstaff
Date: 2006-12-05 22:36:58 -0500 (Tue, 05 Dec 2006)
New Revision: 15187
Trac: http://svn.gnucash.org/trac/changeset/15187

Modified:
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h
Log:
Replace some remaining SQL with GdaQuery


Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-12-06 03:16:18 UTC (rev 15186)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2006-12-06 03:36:58 UTC (rev 15187)
@@ -94,24 +94,70 @@
 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)( 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,
 						const col_cvt_t* table_row );
-typedef void (*GNC_GDA_GET_GVALUE_FN)( GncGdaBackend* be,
+typedef void (*GNC_GDA_GET_GVALUE_QUERY_FN)( GncGdaBackend* be,
 				QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, GValue* value );
+				const col_cvt_t* table_row, GdaQuery* query );
+typedef GdaQueryCondition* (*GNC_GDA_GET_GVALUE_COND_FN)( GncGdaBackend* be,
+				QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GdaQuery* query );
 
 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;
+	GNC_GDA_GET_GVALUE_QUERY_FN	get_gvalue_query_fn;
+	GNC_GDA_GET_GVALUE_COND_FN	get_gvalue_cond_fn;
 } col_type_handler_t;
 
 
 /* ================================================================= */
+static void
+add_field_to_query( GdaQuery* query, const gchar* col_name, const GValue* value )
+{
+	GdaQueryField* field;
+	GdaQueryField* field_value;
+
+	field = gda_query_field_field_new( query, col_name );
+	gda_query_field_set_visible( field, TRUE );
+
+	field_value = gda_query_field_value_new( query, G_VALUE_TYPE(value) );
+	gda_query_field_set_visible( field_value, TRUE );
+	gda_query_field_value_set_value( GDA_QUERY_FIELD_VALUE(field_value), value );
+	g_object_set( field, "value-provider", field_value, NULL );
+	g_object_unref( G_OBJECT(field_value) );
+
+	gda_entity_add_field( GDA_ENTITY(query), GDA_ENTITY_FIELD(field) );
+	g_object_unref( G_OBJECT(field) );
+}
+
+static GdaQueryCondition*
+create_cond_from_field( GdaQuery* query, const gchar* col_name, const GValue* value )
+{
+	GdaQueryCondition* cond;
+	GdaQueryField* key;
+	GdaQueryField* key_value;
+
+	cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_LEAF_EQUAL );
+
+	key = gda_query_field_field_new( query, 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_VALUE_TYPE(value) );
+	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) );
+
+	gda_query_field_value_set_value( GDA_QUERY_FIELD_VALUE(key_value), value );
+
+	return cond;
+}
 /* ----------------------------------------------------------------- */
 static void
 load_string( GdaDataModel* pModel, gint row,
@@ -131,14 +177,13 @@
 }
 
 static void
-get_gvalue_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, GValue* value )
+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 );
@@ -152,30 +197,24 @@
 	}
 }
 
-static gchar*
-render_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_string_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
-	gchar* s;
 	GValue value;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
 	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 );
-	} else {
-		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
-	}
+	add_field_to_query( query, table_row->col_name, &value );
+}
 
-	return buf;
+static GdaQueryCondition*
+get_gvalue_string_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_string( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
 }
 
 static void
@@ -191,7 +230,8 @@
 }
 
 static col_type_handler_t string_handler
-	= { load_string, render_string, create_string_col, get_gvalue_string };
+	= { load_string, create_string_col,
+		get_gvalue_string_for_query, get_gvalue_string_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -212,12 +252,14 @@
 }
 
 static void
-get_gvalue_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, GValue* value )
+get_gvalue_int( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GValue* value )
 {
 	gint int_value;
 	QofAccessFunc getter;
 
+	memset( value, 0, sizeof( GValue ) );
+
 	if( table_row->param_name != NULL ) {
 		getter = qof_class_get_parameter_getter( obj_name,
 												table_row->param_name );
@@ -225,35 +267,28 @@
 	} 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 )
+static void
+get_gvalue_int_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
 	GValue value;
-	gchar* s;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
 	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 {
-		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
-	}
+	add_field_to_query( query, table_row->col_name, &value );
+}
 
-	return buf;
+static GdaQueryCondition*
+get_gvalue_int_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_int( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
 }
 
 static void
@@ -269,7 +304,8 @@
 }
 
 static col_type_handler_t int_handler =
-		{ load_int, render_int, create_int_col, get_gvalue_int };
+		{ load_int, create_int_col,
+			get_gvalue_int_for_query, get_gvalue_int_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -307,31 +343,24 @@
 	}
 }
 
-static gchar*
-render_int64( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_int64_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
 	GValue value;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
 	get_gvalue_int64( be, obj_name, pObject, table_row, &value );
-	if( G_VALUE_TYPE(&value) == G_TYPE_INT64 ) {
-		gchar* s;
+	add_field_to_query( query, table_row->col_name, &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 );
-	}
+static GdaQueryCondition*
+get_gvalue_int64_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
 
-	return buf;
+	get_gvalue_int64( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
 }
 
 static void
@@ -347,7 +376,8 @@
 }
 
 static col_type_handler_t int64_handler =
-		{ load_int64, render_int64, create_int64_col, get_gvalue_int64 };
+		{ load_int64, create_int64_col,
+			get_gvalue_int64_for_query, get_gvalue_int64_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -384,31 +414,24 @@
 	}
 }
 
-static gchar*
-render_double( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_double_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
 	GValue value;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
 	get_gvalue_double( be, obj_name, pObject, table_row, &value );
-	if( G_VALUE_TYPE(&value) == G_TYPE_DOUBLE ) {
-		gchar* s;
+	add_field_to_query( query, table_row->col_name, &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 );
-	}
+static GdaQueryCondition*
+get_gvalue_double_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
 
-	return buf;
+	get_gvalue_double( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
 }
 
 static void
@@ -424,7 +447,8 @@
 }
 
 static col_type_handler_t double_handler =
-		{ load_double, render_double, create_double_col, get_gvalue_double };
+		{ load_double, create_double_col,
+			get_gvalue_double_for_query, get_gvalue_double_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -467,32 +491,24 @@
 	}
 }
 
-static gchar*
-render_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
-	const GUID* guid;
-	gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	gchar* s;
 	GValue value;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
 	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 );
-	} else {
-		buf = g_strdup_printf( "%s%sNULL", col_name, equals );
-	}
+	add_field_to_query( query, table_row->col_name, &value );
+}
 
-	return buf;
+static GdaQueryCondition*
+get_gvalue_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_guid( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
 }
 
 static void
@@ -504,7 +520,8 @@
 }
 
 static col_type_handler_t guid_handler =
-		{ load_guid, render_guid, create_guid_col, get_gvalue_guid };
+		{ load_guid, create_guid_col,
+			get_gvalue_guid_for_query, get_gvalue_guid_cond };
 /* ----------------------------------------------------------------- */
 static void
 load_timespec( GdaDataModel* pModel, gint row,
@@ -527,53 +544,50 @@
 	}
 }
 
-static gchar*
-render_timespec( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_timespec( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GValue* value )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
-	gchar iso8601_buf[33];
 	Timespec* pTimespec;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
+	memset( value, 0, sizeof( GValue ) );
+
 	pTimespec = (Timespec*)(*table_row->getter)( pObject );
 	if( pTimespec != NULL ) {
 		GDate* date;
 		gchar* s;
 		gint y, m, d;
-		GValue value;
+		gchar iso8601_buf[33];
 
 		date = g_date_new();
 		(void)gnc_timespec_to_iso8601_buff( *pTimespec, iso8601_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 );
+		g_value_init( value, G_TYPE_DATE );
+		g_value_set_boxed( value, date );
 	}
+}
 
-	return buf;
+static void
+get_gvalue_timespec_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_timespec( be, obj_name, pObject, table_row, &value );
+	add_field_to_query( query, table_row->col_name, &value );
 }
 
+static GdaQueryCondition*
+get_gvalue_timespec_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_timespec( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
+}
+
 static void
 create_timespec_col( GdaServerProvider* server, GdaConnection* cnn,
 			xmlNodePtr array_data, const col_cvt_t* table_row )
@@ -587,7 +601,8 @@
 }
 
 static col_type_handler_t timespec_handler =
-		{ load_timespec, render_timespec, create_timespec_col };
+		{ load_timespec, create_timespec_col,
+			get_gvalue_timespec_for_query, get_gvalue_timespec_cond };
 /* ----------------------------------------------------------------- */
 static void
 load_date( GdaDataModel* pModel, gint row,
@@ -606,46 +621,44 @@
 	}
 }
 
-static gchar*
-render_date( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_gvalue_date( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
 {
-	gchar* buf;
-	const gchar* col_name = "";
-	const gchar* equals = "";
 	GDate* date;
 
-	if( include_name ) {
-		col_name = table_row->col_name;
-		equals = "=";
-	}
+	memset( value, 0, sizeof( GValue ) );
+
 	date = (GDate*)(*table_row->getter)( pObject );
 	if( date != NULL ) {
-		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 );
+		g_value_init( value, G_TYPE_DATE );
+		g_value_set_boxed( value, date );
 	}
+}
 
-	return buf;
+static void
+get_gvalue_date_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_date( be, obj_name, pObject, table_row, &value );
+	add_field_to_query( query, table_row->col_name, &value );
 }
 
+static GdaQueryCondition*
+get_gvalue_date_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+
+	get_gvalue_date( be, obj_name, pObject, table_row, &value );
+	return create_cond_from_field( query, table_row->col_name, &value );
+}
+
 static col_type_handler_t date_handler =
-		{ load_date, render_date, create_timespec_col };
+		{ load_date, create_timespec_col,
+			get_gvalue_date_for_query, get_gvalue_date_cond };
 /* ----------------------------------------------------------------- */
 static void
 load_numeric( GdaDataModel* pModel, gint row,
@@ -682,6 +695,94 @@
 	}
 }
 
+static void
+get_gvalue_numeric( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+				const col_cvt_t* table_row, GValue* value )
+{
+	gnc_numeric* n;
+
+	memset( value, 0, sizeof( GValue ) );
+
+	n = (gnc_numeric*)(*table_row->getter)( pObject );
+	if( n != NULL ) {
+		g_value_init( value, gnc_numeric_get_type() );
+		g_value_set_boxed( value, n );
+	}
+}
+
+static void
+get_gvalue_numeric_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+	GValue num_value;
+	GValue denom_value;
+	gnc_numeric* n;
+	gchar* s;
+
+	memset( &value, 0, sizeof( GValue ) );
+	memset( &num_value, 0, sizeof( GValue ) );
+	memset( &denom_value, 0, sizeof( GValue ) );
+
+	get_gvalue_numeric( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) != 0 ) {
+		n = g_value_get_boxed( &value );
+		g_value_init( &num_value, G_TYPE_INT64 );
+		g_value_set_int64( &num_value, gnc_numeric_num( *n ) );
+		g_value_init( &denom_value, G_TYPE_INT64 );
+		g_value_set_int64( &denom_value, gnc_numeric_denom( *n ) );
+	}
+
+	s = g_strdup_printf( "%s_num", table_row->col_name );
+	add_field_to_query( query, s, &num_value );
+	g_free( s );
+	s = g_strdup_printf( "%s_denom", table_row->col_name );
+	add_field_to_query( query, s, &denom_value );
+	g_free( s );
+}
+
+static GdaQueryCondition*
+get_gvalue_numeric_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+				gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+	GValue value;
+	GValue num_value;
+	GValue denom_value;
+	gnc_numeric* n;
+	gint64 num;
+	gint64 denom;
+	gchar* s;
+	GdaQueryCondition* num_cond;
+	GdaQueryCondition* denom_cond;
+	GdaQueryCondition* cond;
+
+	memset( &value, 0, sizeof( GValue ) );
+	memset( &num_value, 0, sizeof( GValue ) );
+	memset( &denom_value, 0, sizeof( GValue ) );
+
+	get_gvalue_numeric( be, obj_name, pObject, table_row, &value );
+	if( G_VALUE_TYPE(&value) != 0 ) {
+		n = g_value_get_boxed( &value );
+		g_value_init( &num_value, G_TYPE_INT64 );
+		g_value_set_int64( &num_value, gnc_numeric_num( *n ) );
+		g_value_init( &denom_value, G_TYPE_INT64 );
+		g_value_set_int64( &denom_value, gnc_numeric_denom( *n ) );
+	}
+
+	s = g_strdup_printf( "%s_num", table_row->col_name );
+	num_cond = create_cond_from_field( query, table_row->col_name, &value );
+	g_free( s );
+	s = g_strdup_printf( "%s_denom", table_row->col_name );
+	denom_cond = create_cond_from_field( query, table_row->col_name, &value );
+	g_free( s );
+
+	cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_NODE_AND );
+	gda_query_condition_node_add_child( cond, num_cond, NULL );
+	gda_query_condition_node_add_child( cond, denom_cond, NULL );
+
+	return cond;
+}
+
 static gchar*
 render_numeric( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
 				const col_cvt_t* table_row, gboolean include_name )
@@ -747,7 +848,8 @@
 }
 
 static col_type_handler_t numeric_handler =
-		{ load_numeric, render_numeric, create_numeric_col };
+		{ load_numeric, create_numeric_col,
+			get_gvalue_numeric_for_query, get_gvalue_numeric_cond };
 /* ================================================================= */
 
 static col_type_handler_t*
@@ -923,27 +1025,49 @@
 
 	return count;
 }
+
+int
+gnc_gda_execute_query_get_count( GncGdaBackend* be, GdaQuery* query )
+{
+	int count = 0;
+
+	GdaObject* ret;
+
+	ret = gnc_gda_execute_query( be, query );
+	if( GDA_IS_DATA_MODEL(ret) ) {
+		GdaDataModel* pModel = (GdaDataModel*)ret;
+		count = gda_data_model_get_n_rows( pModel );
+	}
+
+	return count;
+}
 /* ================================================================= */
-static gchar*
-render_col_value( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, gboolean include_name )
+static void
+get_col_gvalue_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+						gpointer pObject, const col_cvt_t* table_row,
+						GdaQuery* query )
 {
-	gchar* buf;
+	GValue value;
 	col_type_handler_t* pHandler;
+
 	pHandler = get_handler( table_row->col_type );
-
-	buf = pHandler->render_fn( be, obj_name, pObject, table_row, include_name );
-	return buf;
+	pHandler->get_gvalue_query_fn( be, obj_name, pObject, table_row, query );
 }
 
 static void
-get_col_gvalue( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-				const col_cvt_t* table_row, GValue* value )
+get_col_gvalue_for_condition( GncGdaBackend* be, QofIdTypeConst obj_name,
+						gpointer pObject, const col_cvt_t* table_row,
+						GdaQuery* query )
 {
+	GValue value;
 	col_type_handler_t* pHandler;
+	GdaQueryCondition* cond;
+
 	pHandler = get_handler( table_row->col_type );
+	cond = pHandler->get_gvalue_cond_fn( be, obj_name, pObject, table_row, query );
 
-	pHandler->get_gvalue_fn( be, obj_name, pObject, table_row, value );
+	gda_query_set_condition( query, cond );
+	g_object_unref( G_OBJECT(cond) );
 }
 
 gboolean
@@ -951,18 +1075,17 @@
 					QofIdTypeConst obj_name, gpointer pObject,
 					const col_cvt_t* table )
 {
-	gchar* sql;
+	GdaQuery* query;
+	GValue value;
 	int count;
-	gchar* key_value;
 
-	key_value = render_col_value( be, obj_name, pObject, table, TRUE );
+	/* SELECT * FROM */
+	query = gnc_gda_create_select_query( be, table_name );
 
-	sql = g_strdup_printf( "SELECT * FROM %s WHERE %s;",
-							table_name, key_value );
-	g_free( key_value );
+	/* WHERE */
+	get_col_gvalue_for_condition( be, obj_name, pObject, &table[0], query );
 
-	count = gnc_gda_execute_select_get_count( be, sql );
-	g_free( sql );
+	count = gnc_gda_execute_query_get_count( be, query );
 	if( count == 0 ) {
 		return FALSE;
 	} else {
@@ -1010,10 +1133,12 @@
 							QofIdTypeConst obj_name, gpointer pObject,
 							const col_cvt_t* table )
 {
+	GdaQuery* query;
+	int col;
+
+#if 0
 	GString* sql;
 	GError* error = NULL;
-	GdaQuery* query;
-	int col;
 	gchar* col_value;
 
 	sql = g_string_sized_new( INITIAL_SQL_BUF_LEN );
@@ -1033,6 +1158,23 @@
 	if( query == NULL ) {
 		printf( "SQL error: %s\n", error->message );
 	}
+#else
+	GdaQueryTarget* target;
+
+	/* INSERT */
+	query = gda_query_new( be->pDict );
+	gda_query_set_query_type( query, GDA_QUERY_TYPE_INSERT );
+
+	/* INTO */
+	target = gda_query_target_new( query, table_name );
+	gda_query_add_target( query, target, NULL );
+
+	/* VALUES */
+	for( col = 0; table[col].col_name != NULL; col++ ) {
+		get_col_gvalue_for_query( be, obj_name, pObject, &table[col], query );
+	}
+#endif
+
 	return query;
 }
 
@@ -1042,35 +1184,25 @@
 							QofIdTypeConst obj_name, gpointer pObject,
 							const col_cvt_t* table )
 {
-	GString* sql;
-	GError* error = NULL;
 	GdaQuery* query;
 	int col;
-	gchar* col_value;
 
-	sql = g_string_sized_new( INITIAL_SQL_BUF_LEN );
-	g_string_printf( sql, "UPDATE %s SET ", table_name );
+	GdaQueryTarget* target;
 
+	/* UPDATE */
+	query = gda_query_new( be->pDict );
+	gda_query_set_query_type( query, GDA_QUERY_TYPE_UPDATE );
+	target = gda_query_target_new( query, table_name );
+	gda_query_add_target( query, target, NULL );
+
+	/* SET */
 	for( col = 1; table[col].col_name != NULL; col++ ) {
-		if( col != 1 ) g_string_append( sql, "," );
-
-		col_value = render_col_value( be, obj_name, pObject, &table[col], TRUE );
-		g_string_append( sql, col_value );
-		g_free( col_value );
+		get_col_gvalue_for_query( be, obj_name, pObject, &table[col], query );
 	}
 
-	g_string_append( sql, " WHERE " );
+	/* WHERE */
+	get_col_gvalue_for_condition( be, obj_name, pObject, &table[0], query );
 
-	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, ";" );
-
-	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 );
-	}
 	return query;
 }
 
@@ -1082,10 +1214,8 @@
 {
 	GdaQuery* query;
 	GdaQueryTarget* target;
-	GdaQueryCondition* cond;
 	GdaQueryField* key;
 	GdaQueryField* key_value;
-	GValue value;
 
 	/* DELETE */
 	query = gda_query_new( be->pDict );
@@ -1097,26 +1227,8 @@
 	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) );
+	get_col_gvalue_for_condition( be, obj_name, pObject, &table[0], query );
 
-	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-backend-gda.h
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h	2006-12-06 03:16:18 UTC (rev 15186)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.h	2006-12-06 03:36:58 UTC (rev 15187)
@@ -136,6 +136,7 @@
 GdaObject* gnc_gda_execute_query( GncGdaBackend* pBackend, GdaQuery* pQuery );
 GdaObject* gnc_gda_execute_sql( GncGdaBackend* pBackend, const gchar* sql );
 int gnc_gda_execute_select_get_count( GncGdaBackend* pBackend, const gchar* sql );
+int gnc_gda_execute_query_get_count( GncGdaBackend* pBackend, GdaQuery* query );
 void gnc_gda_load_object( GdaDataModel* pModel, int row,
 						QofIdTypeConst obj_name, gpointer pObject,
 						const col_cvt_t* table );



More information about the gnucash-changes mailing list