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