r18307 - gnucash/trunk/src/backend/sql - If an object is being loaded that has a reference to a transaction, and the transaction
Phil Longstaff
plongstaff at code.gnucash.org
Thu Sep 10 22:08:10 EDT 2009
Author: plongstaff
Date: 2009-09-10 22:08:09 -0400 (Thu, 10 Sep 2009)
New Revision: 18307
Trac: http://svn.gnucash.org/trac/changeset/18307
Modified:
gnucash/trunk/src/backend/sql/gnc-account-sql.c
gnucash/trunk/src/backend/sql/gnc-budget-sql.c
gnucash/trunk/src/backend/sql/gnc-commodity-sql.c
gnucash/trunk/src/backend/sql/gnc-lots-sql.c
gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
Log:
If an object is being loaded that has a reference to a transaction, and the transaction
hasn't been loaded yet, load it.
If an object has a reference to an account, commodity, budget or lot that hasn't been loaded
yet, print a warning message in the trace file. The difference in handling is that these
object types are always loaded at init time, whereas transactions are not.
Modified: gnucash/trunk/src/backend/sql/gnc-account-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-account-sql.c 2009-09-10 01:52:42 UTC (rev 18306)
+++ gnucash/trunk/src/backend/sql/gnc-account-sql.c 2009-09-11 02:08:09 UTC (rev 18307)
@@ -358,7 +358,6 @@
{
const GValue* val;
GUID guid;
- const GUID* pGuid;
Account* account = NULL;
g_return_if_fail( be != NULL );
@@ -367,23 +366,20 @@
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
- if( val == NULL ) {
- pGuid = NULL;
- } else {
+ if( val != NULL && G_VALUE_HOLDS_STRING( val ) && g_value_get_string( val ) != NULL ) {
(void)string_to_guid( g_value_get_string( val ), &guid );
- pGuid = &guid;
- }
- if( pGuid != NULL ) {
- account = xaccAccountLookup( pGuid, be->primary_book );
+ account = xaccAccountLookup( &guid, be->primary_book );
+ if( account != NULL ) {
+ if( table_row->gobj_param_name != NULL ) {
+ g_object_set( pObject, table_row->gobj_param_name, account, NULL );
+ } else {
+ g_return_if_fail( setter != NULL );
+ (*setter)( pObject, (const gpointer)account );
+ }
+ } else {
+ PWARN( "Account ref '%s' not found", g_value_get_string( val ) );
+ }
}
- if( account != NULL ) {
- if( table_row->gobj_param_name != NULL ) {
- g_object_set( pObject, table_row->gobj_param_name, account, NULL );
- } else {
- g_return_if_fail( setter != NULL );
- (*setter)( pObject, (const gpointer)account );
- }
- }
}
static GncSqlColumnTypeHandler account_guid_handler
Modified: gnucash/trunk/src/backend/sql/gnc-budget-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-budget-sql.c 2009-09-10 01:52:42 UTC (rev 18306)
+++ gnucash/trunk/src/backend/sql/gnc-budget-sql.c 2009-09-11 02:08:09 UTC (rev 18307)
@@ -446,7 +446,6 @@
{
const GValue* val;
GUID guid;
- const GUID* pGuid;
GncBudget* budget = NULL;
g_return_if_fail( be != NULL );
@@ -455,23 +454,20 @@
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
- if( val == NULL ) {
- pGuid = NULL;
- } else {
+ if( val != NULL && G_VALUE_HOLDS_STRING( val ) && g_value_get_string( val ) != NULL ) {
(void)string_to_guid( g_value_get_string( val ), &guid );
- pGuid = &guid;
- }
- if( pGuid != NULL ) {
- budget = gnc_budget_lookup( pGuid, be->primary_book );
+ budget = gnc_budget_lookup( &guid, be->primary_book );
+ if( budget != NULL ) {
+ if( table_row->gobj_param_name != NULL ) {
+ g_object_set( pObject, table_row->gobj_param_name, budget, NULL );
+ } else {
+ g_return_if_fail( setter != NULL );
+ (*setter)( pObject, (const gpointer)budget );
+ }
+ } else {
+ PWARN( "Budget ref '%s' not found", g_value_get_string( val ) );
+ }
}
- if( budget != NULL ) {
- if( table_row->gobj_param_name != NULL ) {
- g_object_set( pObject, table_row->gobj_param_name, budget, NULL );
- } else {
- g_return_if_fail( setter != NULL );
- (*setter)( pObject, (const gpointer)budget );
- }
- }
}
static GncSqlColumnTypeHandler budget_guid_handler
Modified: gnucash/trunk/src/backend/sql/gnc-commodity-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-commodity-sql.c 2009-09-10 01:52:42 UTC (rev 18306)
+++ gnucash/trunk/src/backend/sql/gnc-commodity-sql.c 2009-09-11 02:08:09 UTC (rev 18307)
@@ -256,16 +256,19 @@
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
- g_assert( val != NULL );
- (void)string_to_guid( g_value_get_string( val ), &guid );
- commodity = gnc_commodity_find_commodity_by_guid( &guid, be->primary_book );
- if( commodity != NULL ) {
- if( table_row->gobj_param_name != NULL ) {
- g_object_set( pObject, table_row->gobj_param_name, commodity, NULL );
- } else if( setter != NULL ) {
- (*setter)( pObject, (const gpointer)commodity );
+ if( val != NULL && G_VALUE_HOLDS_STRING( val ) && g_value_get_string( val ) != NULL ) {
+ (void)string_to_guid( g_value_get_string( val ), &guid );
+ commodity = gnc_commodity_find_commodity_by_guid( &guid, be->primary_book );
+ if( commodity != NULL ) {
+ if( table_row->gobj_param_name != NULL ) {
+ g_object_set( pObject, table_row->gobj_param_name, commodity, NULL );
+ } else if( setter != NULL ) {
+ (*setter)( pObject, (const gpointer)commodity );
+ }
+ } else {
+ PWARN( "Commodity ref '%s' not found", g_value_get_string( val ) );
}
- }
+ }
}
static GncSqlColumnTypeHandler commodity_guid_handler
Modified: gnucash/trunk/src/backend/sql/gnc-lots-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-lots-sql.c 2009-09-10 01:52:42 UTC (rev 18306)
+++ gnucash/trunk/src/backend/sql/gnc-lots-sql.c 2009-09-11 02:08:09 UTC (rev 18307)
@@ -233,17 +233,20 @@
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
-
- g_return_if_fail( val != NULL );
-
- (void)string_to_guid( g_value_get_string( val ), &guid );
- lot = gnc_lot_lookup( &guid, be->primary_book );
- if( table_row->gobj_param_name != NULL ) {
- g_object_set( pObject, table_row->gobj_param_name, lot, NULL );
- } else {
- g_return_if_fail( setter != NULL );
- (*setter)( pObject, (const gpointer)lot );
- }
+ if( val != NULL && G_VALUE_HOLDS_STRING( val ) && g_value_get_string( val ) != NULL ) {
+ (void)string_to_guid( g_value_get_string( val ), &guid );
+ lot = gnc_lot_lookup( &guid, be->primary_book );
+ if( lot != NULL ) {
+ if( table_row->gobj_param_name != NULL ) {
+ g_object_set( pObject, table_row->gobj_param_name, lot, NULL );
+ } else {
+ g_return_if_fail( setter != NULL );
+ (*setter)( pObject, (const gpointer)lot );
+ }
+ } else {
+ PWARN( "Lot ref '%s' not found", g_value_get_string( val ) );
+ }
+ }
}
static GncSqlColumnTypeHandler lot_guid_handler
Modified: gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-transaction-sql.c 2009-09-10 01:52:42 UTC (rev 18306)
+++ gnucash/trunk/src/backend/sql/gnc-transaction-sql.c 2009-09-11 02:08:09 UTC (rev 18307)
@@ -1266,11 +1266,27 @@
g_assert( val != NULL );
(void)string_to_guid( g_value_get_string( val ), &guid );
tx = xaccTransLookup( &guid, be->primary_book );
- if( table_row->gobj_param_name != NULL ) {
- g_object_set( pObject, table_row->gobj_param_name, tx, NULL );
- } else {
- g_return_if_fail( setter != NULL );
- (*setter)( pObject, (const gpointer)tx );
+
+ // If the transaction is not found, try loading it
+ if( tx == NULL ) {
+ gchar* buf;
+ GncSqlStatement* stmt;
+
+ buf = g_strdup_printf( "SELECT * FROM %s WHERE guid='%s'",
+ TRANSACTION_TABLE, g_value_get_string( val ) );
+ stmt = gnc_sql_create_statement_from_sql( (GncSqlBackend*)be, buf );
+ g_free( buf );
+ query_transactions( (GncSqlBackend*)be, stmt );
+ tx = xaccTransLookup( &guid, be->primary_book );
+ }
+
+ if( tx != NULL ) {
+ if( table_row->gobj_param_name != NULL ) {
+ g_object_set( pObject, table_row->gobj_param_name, tx, NULL );
+ } else {
+ g_return_if_fail( setter != NULL );
+ (*setter)( pObject, (const gpointer)tx );
+ }
}
}
More information about the gnucash-changes
mailing list