From 7dfcf80fc5e9894fe48a71f1639864005edb2a12 Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Sun, 30 Sep 2007 19:00:49 +0000 Subject: [PATCH] Ensure account/split balances are set git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/gda-dev@16546 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/backend/gda/gnc-account-gda.c | 10 +++-- src/backend/gda/gnc-backend-util-gda.c | 30 +++++++++++++-- src/backend/gda/gnc-transaction-gda.c | 51 +++++++++++++++----------- 3 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/backend/gda/gnc-account-gda.c b/src/backend/gda/gnc-account-gda.c index 9d1a3510c0..023ddb08ab 100644 --- a/src/backend/gda/gnc-account-gda.c +++ b/src/backend/gda/gnc-account-gda.c @@ -128,14 +128,16 @@ set_parent( gpointer pObject, gpointer pValue ) static void load_balances( GncGdaBackend* be, Account* pAccount ) { - gnc_numeric start_balance, cleared_balance, reconciled_balance; + gnc_numeric start_balance; + gnc_numeric cleared_balance; + gnc_numeric reconciled_balance; gnc_gda_get_account_balances( be, pAccount, &start_balance, &cleared_balance, &reconciled_balance ); g_object_set( pAccount, - "start-balance", &start_balance, - "start-cleared-balance", &cleared_balance, - "start-reconciled-balance", &reconciled_balance, + "end-balance", &start_balance, + "end-cleared-balance", &cleared_balance, + "end-reconciled-balance", &reconciled_balance, NULL); } diff --git a/src/backend/gda/gnc-backend-util-gda.c b/src/backend/gda/gnc-backend-util-gda.c index 64f84ccaf5..90619a0910 100644 --- a/src/backend/gda/gnc-backend-util-gda.c +++ b/src/backend/gda/gnc-backend-util-gda.c @@ -22,8 +22,8 @@ * @brief load and save data to SQL - utility functions * @author Copyright (c) 2006 Phil Longstaff * - * This file implements the top-level QofBackend API for saving/ - * restoring data to/from an SQL db using libgda + * This file contains utility routines to support saving/restoring + * data to/from an SQL db using libgda */ #include "config.h" @@ -651,6 +651,28 @@ static col_type_handler_t date_handler = { load_date, create_timespec_col, get_gvalue_date_for_query, get_gvalue_date_cond }; /* ----------------------------------------------------------------- */ +static gint64 +get_integer_value( const GValue* value ) +{ + if( G_VALUE_HOLDS_INT(value) ) { + return g_value_get_int( value ); + } else if( G_VALUE_HOLDS_UINT(value) ) { + return g_value_get_uint( value ); + } else if( G_VALUE_HOLDS_LONG(value) ) { + return g_value_get_long( value ); + } else if( G_VALUE_HOLDS_ULONG(value) ) { + return g_value_get_ulong( value ); + } else if( G_VALUE_HOLDS_INT64(value) ) { + return g_value_get_int64( value ); + } else if( G_VALUE_HOLDS_UINT64(value) ) { + return g_value_get_uint64( value ); + } else { + g_warning( "Unknown type: %s", G_VALUE_TYPE_NAME( value ) ); + } + + return 0; +} + static void load_numeric( GdaDataModel* pModel, gint row, QofSetterFunc setter, gpointer pObject, @@ -669,7 +691,7 @@ load_numeric( GdaDataModel* pModel, gint row, isNull = TRUE; num = 0; } else { - num = g_value_get_int64( val ); + num = get_integer_value( val ); } buf = g_strdup_printf( "%s_denom", table->col_name ); val = gda_data_model_get_value_at_col_name( pModel, buf, row ); @@ -678,7 +700,7 @@ load_numeric( GdaDataModel* pModel, gint row, isNull = TRUE; denom = 1; } else { - denom = g_value_get_int64( val ); + denom = get_integer_value( val ); } n = gnc_numeric_create( num, denom ); if( isNull ) { diff --git a/src/backend/gda/gnc-transaction-gda.c b/src/backend/gda/gnc-transaction-gda.c index 232319f054..546b92786c 100644 --- a/src/backend/gda/gnc-transaction-gda.c +++ b/src/backend/gda/gnc-transaction-gda.c @@ -72,17 +72,17 @@ static void set_tx_enter_date( gpointer pObject, gpointer pValue ); static col_cvt_t tx_col_table[] = { - { "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, NULL, NULL, + { "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, NULL, NULL, get_guid, set_guid }, - { "currency_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, + { "currency_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, get_tx_currency_guid, set_tx_currency_guid }, - { "num", CT_STRING, TX_MAX_NUM_LEN, COL_NNUL, NULL, NULL, + { "num", CT_STRING, TX_MAX_NUM_LEN, COL_NNUL, NULL, NULL, get_tx_num, set_tx_num }, - { "post_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, + { "post_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, get_tx_post_date, set_tx_post_date }, - { "enter_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, + { "enter_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, get_tx_enter_date, set_tx_enter_date }, - { "description", CT_STRING, TX_MAX_DESCRIPTION_LEN, 0, NULL, NULL, + { "description", CT_STRING, TX_MAX_DESCRIPTION_LEN, 0, NULL, NULL, (QofAccessFunc)xaccTransGetDescription, (QofSetterFunc)xaccTransSetDescription }, { NULL } @@ -108,20 +108,20 @@ static col_cvt_t split_col_table[] = { { "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, NULL, NULL, get_guid, set_guid }, - { "tx_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, + { "tx_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, get_split_tx_guid, set_split_tx_guid }, + { "account_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, + get_split_account_guid, set_split_account_guid }, { "memo", CT_STRING, SPLIT_MAX_MEMO_LEN, COL_NNUL, NULL, SPLIT_MEMO }, { "action", CT_STRING, SPLIT_MAX_ACTION_LEN, COL_NNUL, NULL, SPLIT_ACTION }, { "reconcile_state", CT_STRING, 1, COL_NNUL, NULL, NULL, get_split_reconcile_state, set_split_reconcile_state }, - { "reconcile_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, + { "reconcile_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL, get_split_reconcile_date, set_split_reconcile_date }, { "value", CT_NUMERIC, 0, COL_NNUL, NULL, NULL, get_split_value, set_split_value }, { "quantity", CT_NUMERIC, 0, COL_NNUL, NULL, NULL, get_split_quantity, set_split_quantity }, - { "account_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, - get_split_account_guid, set_split_account_guid }, { NULL } }; @@ -440,8 +440,8 @@ gnc_gda_get_account_balances( GncGdaBackend* be, Account* pAccount, * This just requires a modification to the query */ - //sql = g_strdup_printf( "SELECT SUM(QUANTITY_NUM),QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf ); - sql = g_strdup_printf( "SELECT QUANTITY_NUM,QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf ); + //sql = g_strdup_printf( "SELECT SUM(QUANTITY_NUM),QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='%c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf, CREC ); + sql = g_strdup_printf( "SELECT QUANTITY_NUM,QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='%c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf, CREC ); query = gnc_gda_create_query_from_sql( be, sql ); *cleared_balance = get_account_balance_from_query( be, query ); @@ -457,8 +457,8 @@ gnc_gda_get_account_balances( GncGdaBackend* be, Account* pAccount, * This just requires a small modification to the cleared balance query */ - //sql = g_strdup_printf( "SELECT SUM(QUANTITY_NUM),QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='y' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf ); - sql = g_strdup_printf( "SELECT QUANTITY_NUM,QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='y' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf ); + //sql = g_strdup_printf( "SELECT SUM(QUANTITY_NUM),QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='%c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf, YREC ); + sql = g_strdup_printf( "SELECT QUANTITY_NUM,QUANTITY_DENOM FROM %s WHERE ACCOUNT_GUID='%s' AND RECONCILE_STATE='%c' GROUP BY QUANTITY_DENOM", SPLIT_TABLE, guid_buf, YREC ); query = gnc_gda_create_query_from_sql( be, sql ); *reconciled_balance = get_account_balance_from_query( be, query ); @@ -488,18 +488,19 @@ load_single_split( GncGdaBackend* be, GdaDataModel* pModel, int row, Split* pSpl } gnc_gda_load_object( pModel, row, GNC_ID_SPLIT, pSplit, split_col_table ); + gnc_gda_slots_load( be, qof_instance_get_guid( QOF_INSTANCE(pSplit) ), qof_instance_get_slots( QOF_INSTANCE(pSplit) ) ); g_assert( pSplit == xaccSplitLookup( &split_guid, be->primary_book ) ); - qof_instance_mark_clean( QOF_INSTANCE(pSplit) ); + //qof_instance_mark_clean( QOF_INSTANCE(pSplit) ); return pSplit; } static void -load_all_splits( GncGdaBackend* be, const GUID* guid ) +load_all_splits( GncGdaBackend* be, const GUID* tx_guid ) { GdaObject* ret; gchar guid_buf[GUID_ENCODING_LENGTH+1]; @@ -507,7 +508,7 @@ load_all_splits( GncGdaBackend* be, const GUID* guid ) GdaQueryCondition* cond; GValue value; - guid_to_string_buff( guid, guid_buf ); + guid_to_string_buff( tx_guid, guid_buf ); memset( &value, 0, sizeof( GValue ) ); g_value_init( &value, G_TYPE_STRING ); g_value_set_string( &value, guid_buf ); @@ -736,12 +737,17 @@ compile_split_query( GncGdaBackend* be, QofQuery* pQuery ) buf = g_strdup_printf( "SELECT DISTINCT tx_guid FROM %s WHERE account_guid='%s'", SPLIT_TABLE, guid_buf ); results = gnc_gda_execute_sql( be, buf ); g_free( buf ); - buf = g_strdup_printf( "SELECT * FROM %s WHERE guid IN (", TRANSACTION_TABLE ); if( GDA_IS_DATA_MODEL( results ) ) { GdaDataModel* pModel = GDA_DATA_MODEL(results); int numRows = gda_data_model_get_n_rows( pModel ); int r; + if( numRows != 1 ) { + buf = g_strdup_printf( "SELECT * FROM %s WHERE guid IN (", TRANSACTION_TABLE ); + } else { + buf = g_strdup_printf( "SELECT * FROM %s WHERE guid =", TRANSACTION_TABLE ); + } + for( r = 0; r < numRows; r++ ) { const GUID* guid; @@ -755,10 +761,13 @@ compile_split_query( GncGdaBackend* be, QofQuery* pQuery ) g_free( buf ); buf = s; } + + if( numRows != 1 ) { + s = g_strconcat( buf, ")", NULL ); + g_free( buf ); + buf = s; + } } - s = g_strconcat( buf, ")", NULL ); - g_free( buf ); - buf = s; return buf; #else