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