From ca915049e9bdcd252bcf3288ccf0a103620be731 Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Thu, 30 Nov 2006 02:28:22 +0000 Subject: [PATCH] 1) Remove unnecessary 2nd DELETE when saving slots 2) Start move toward GValues internally in GDA backend 3) Use GdaQuery for DELETE operations git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/gda-dev@15165 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/backend/gda/gnc-account-gda.c | 6 +- src/backend/gda/gnc-backend-gda.c | 233 +++++++++++++++++-------- src/backend/gda/gnc-budget-gda.c | 4 +- src/backend/gda/gnc-schedxaction-gda.c | 4 +- src/backend/gda/gnc-transaction-gda.c | 3 +- 5 files changed, 173 insertions(+), 77 deletions(-) diff --git a/src/backend/gda/gnc-account-gda.c b/src/backend/gda/gnc-account-gda.c index 97c10fd01a..66eba1536e 100644 --- a/src/backend/gda/gnc-account-gda.c +++ b/src/backend/gda/gnc-account-gda.c @@ -210,11 +210,11 @@ commit_account( GncGdaBackend* be, QofInstance* inst ) // 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 ); } } diff --git a/src/backend/gda/gnc-backend-gda.c b/src/backend/gda/gnc-backend-gda.c index 5925e14216..6af1c08d6c 100644 --- a/src/backend/gda/gnc-backend-gda.c +++ b/src/backend/gda/gnc-backend-gda.c @@ -99,11 +99,15 @@ typedef gchar* (*GNC_GDA_RENDER_FN)( GncGdaBackend* be, QofIdTypeConst obj_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, + 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 @@ load_string( GdaDataModel* pModel, gint row, (*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 @@ render_string( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ create_string_col( GdaServerProvider* server, GdaConnection* cnn, } 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 @@ load_int( GdaDataModel* pModel, gint row, (*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 @@ render_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, gchar* buf; const gchar* col_name = ""; const gchar* equals = ""; - gint int_value; - QofAccessFunc getter; GValue value; gchar* s; @@ -212,19 +244,14 @@ render_int( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ create_int_col( GdaServerProvider* server, GdaConnection* cnn, } 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 @@ load_int64( GdaDataModel* pModel, gint row, } } +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 @@ render_int64( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ create_int64_col( GdaServerProvider* server, GdaConnection* cnn, } 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 @@ load_double( GdaDataModel* pModel, gint row, } } +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 @@ render_double( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ create_double_col( GdaServerProvider* server, GdaConnection* cnn, } 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 @@ load_guid( GdaDataModel* pModel, gint row, (*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 @@ render_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ create_guid_col( GdaServerProvider* server, GdaConnection* cnn, } 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 @@ 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 ); @@ -874,6 +936,16 @@ render_col_value( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject, 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 @@ gnc_gda_build_delete_query( GncGdaBackend* be, 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 ); + + /* 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 ); - query = gda_query_new_from_sql( be->pDict, sql, &error ); - g_free( sql ); - if( query == NULL ) { - printf( "SQL error: %s\n", error->message ); - } return query; } diff --git a/src/backend/gda/gnc-budget-gda.c b/src/backend/gda/gnc-budget-gda.c index acb34c917f..b76e7b96b7 100644 --- a/src/backend/gda/gnc-budget-gda.c +++ b/src/backend/gda/gnc-budget-gda.c @@ -206,11 +206,11 @@ commit_budget( GncGdaBackend* be, QofInstance* inst ) // 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 ); } } diff --git a/src/backend/gda/gnc-schedxaction-gda.c b/src/backend/gda/gnc-schedxaction-gda.c index 5a74c13e1e..1d45cb493b 100644 --- a/src/backend/gda/gnc-schedxaction-gda.c +++ b/src/backend/gda/gnc-schedxaction-gda.c @@ -132,11 +132,11 @@ commit_sx( GncGdaBackend* be, QofInstance* inst ) // 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 } diff --git a/src/backend/gda/gnc-transaction-gda.c b/src/backend/gda/gnc-transaction-gda.c index 281e78403c..3dce48d13c 100644 --- a/src/backend/gda/gnc-transaction-gda.c +++ b/src/backend/gda/gnc-transaction-gda.c @@ -552,13 +552,14 @@ commit_transaction( GncGdaBackend* be, QofInstance* inst ) 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 ); } }