r16926 - gnucash/branches/gda-dev2/src/backend/gda - 1) All core objects now load slots with 1 SQL request rather than 1 per

Phil Longstaff plongstaff at cvs.gnucash.org
Sun Feb 3 17:57:07 EST 2008


Author: plongstaff
Date: 2008-02-03 17:57:07 -0500 (Sun, 03 Feb 2008)
New Revision: 16926
Trac: http://svn.gnucash.org/trac/changeset/16926

Modified:
   gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c
Log:
1) All core objects now load slots with 1 SQL request rather than 1 per
object.
2) Fix some CRIT problems which were using g_return_if_fail() in error



Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -154,7 +154,7 @@
 }
 
 static void
-load_single_account( GncGdaBackend* be, GdaDataModel* pModel, int row,
+load_single_account( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList,
 				GList** l_accounts_needing_parents )
 {
     const GUID* guid;
@@ -174,7 +174,8 @@
         pAccount = xaccMallocAccount( be->primary_book );
     }
     gnc_gda_load_object( be, pModel, row, GNC_ID_ACCOUNT, pAccount, col_table );
-    gnc_gda_slots_load( be, QOF_INSTANCE(pAccount) );
+	*pList = g_list_append( *pList, pAccount );
+//    gnc_gda_slots_load( be, QOF_INSTANCE(pAccount) );
     load_balances( be, pAccount );
 
     qof_instance_mark_clean( QOF_INSTANCE(pAccount) );
@@ -214,11 +215,16 @@
         int r;
         Account* parent;
 		GList* l_accounts_needing_parents = NULL;
+		GList* list = NULL;
 
         for( r = 0; r < numRows; r++ ) {
-            load_single_account( be, pModel, r, &l_accounts_needing_parents );
+            load_single_account( be, pModel, r, &list, &l_accounts_needing_parents );
         }
 
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
+
 		/* While there are items on the list of accounts needing parents,
 		   try to see if the parent has now been loaded.  Theory says that if
 		   items are removed from the front and added to the back if the

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -633,7 +633,7 @@
 
     /* If this has already been handled, or is not the correct handler, return */
     if( strcmp( pData->type_name, be_data->inst->e_type ) != 0 ) return;
-    g_return_if_fail( !be_data->ok );
+    if( be_data->ok ) return;
 
     if( pData->commit != NULL ) {
         (pData->commit)( be_data->inst, be_data->be );
@@ -966,7 +966,7 @@
 
     g_return_if_fail( type != NULL && pData != NULL && be_data != NULL );
     g_return_if_fail( pData->version == GNC_GDA_BACKEND_VERSION );
-    g_return_if_fail( !be_data->ok );
+    if( be_data->ok ) return;
 
 	// Is this the right item?
     if( strcmp( type, be_data->pQueryInfo->searchObj ) != 0 ) return;

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -61,7 +61,7 @@
 
 /* ================================================================= */
 static void
-load_single_budget( GncGdaBackend* be, GdaDataModel* pModel, int row )
+load_single_budget( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList )
 {
     const GUID* guid;
     GUID budget_guid;
@@ -83,7 +83,8 @@
     gnc_gda_load_object( be, pModel, row, GNC_ID_BUDGET, pBudget, col_table );
 	r = g_new0( Recurrence, 1 );
 	gnc_gda_recurrence_load( be, gnc_budget_get_guid( pBudget ), r );
-    gnc_gda_slots_load( be, QOF_INSTANCE(pBudget) );
+//    gnc_gda_slots_load( be, QOF_INSTANCE(pBudget) );
+	*pList = g_list_append( *pList, pBudget );
 
     qof_instance_mark_clean( QOF_INSTANCE(pBudget) );
 }
@@ -104,10 +105,15 @@
         GdaDataModel* pModel = GDA_DATA_MODEL(ret);
         int numRows = gda_data_model_get_n_rows( pModel );
         int r;
+		GList* list = NULL;
 
         for( r = 0; r < numRows; r++ ) {
-            load_single_budget( be, pModel, r );
+            load_single_budget( be, pModel, r, &list );
         }
+
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
     }
 }
 

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -107,14 +107,15 @@
 
 	g_return_if_fail( pObject != NULL );
 	g_return_if_fail( GNC_IS_COMMODITY(pObject) );
-	g_return_if_fail( pValue != NULL );
 
+	if( pValue == NULL ) return;
+
     quote_source = gnc_quote_source_lookup_by_internal( quote_source_name );
     gnc_commodity_set_quote_source( pCommodity, quote_source );
 }
 
 static gnc_commodity*
-load_single_commodity( GncGdaBackend* be, GdaDataModel* pModel, int row )
+load_single_commodity( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList )
 {
     QofBook* pBook = be->primary_book;
     int col;
@@ -124,7 +125,8 @@
     pCommodity = gnc_commodity_new( pBook, NULL, NULL, NULL, NULL, 100 );
 
     gnc_gda_load_object( be, pModel, row, GNC_ID_COMMODITY, pCommodity, col_table );
-    gnc_gda_slots_load( be, QOF_INSTANCE(pCommodity) );
+//    gnc_gda_slots_load( be, QOF_INSTANCE(pCommodity) );
+	*pList = g_list_append( *pList, pCommodity );
 
     qof_instance_mark_clean( QOF_INSTANCE(pCommodity) );
 
@@ -147,11 +149,12 @@
         int numRows = gda_data_model_get_n_rows( pModel );
         int r;
         gnc_commodity* pCommodity;
+		GList* list = NULL;
 
         for( r = 0; r < numRows; r++ ) {
             gnc_commodity* c;
 
-            pCommodity = load_single_commodity( be, pModel, r );
+            pCommodity = load_single_commodity( be, pModel, r, &list );
 
             if( pCommodity != NULL ) {
                 GUID guid;
@@ -161,6 +164,10 @@
                 qof_instance_set_guid( QOF_INSTANCE(pCommodity), &guid );
             }
         }
+
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
     }
 }
 /* ================================================================= */

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -99,7 +99,7 @@
 }
 
 static void
-load_single_lot( GncGdaBackend* be, GdaDataModel* pModel, int row )
+load_single_lot( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList )
 {
 	GNCLot* lot;
 
@@ -110,7 +110,8 @@
     lot = gnc_lot_new( be->primary_book );
 
     gnc_gda_load_object( be, pModel, row, GNC_ID_LOT, lot, col_table );
-    gnc_gda_slots_load( be, QOF_INSTANCE(lot) );
+//    gnc_gda_slots_load( be, QOF_INSTANCE(lot) );
+	*pList = g_list_append( *pList, lot );
 
     qof_instance_mark_clean( QOF_INSTANCE(lot) );
 }
@@ -131,10 +132,15 @@
         GdaDataModel* pModel = GDA_DATA_MODEL(ret);
         int numRows = gda_data_model_get_n_rows( pModel );
         int r;
+		GList* list = NULL;
 
         for( r = 0; r < numRows; r++ ) {
-            load_single_lot( be, pModel, r );
+            load_single_lot( be, pModel, r, &list );
         }
+
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
     }
 }
 

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -38,6 +38,7 @@
 
 #include "gnc-commodity-gda.h"
 #include "gnc-price-gda.h"
+#include "gnc-slots-gda.h"
 
 static QofLogModule log_module = G_LOG_DOMAIN;
 
@@ -61,7 +62,7 @@
 /* ================================================================= */
 
 static GNCPrice*
-load_single_price( GncGdaBackend* be, GdaDataModel* pModel, int row )
+load_single_price( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList )
 {
 	GNCPrice* pPrice;
 
@@ -72,6 +73,7 @@
     pPrice = gnc_price_create( be->primary_book );
 
     gnc_gda_load_object( be, pModel, row, GNC_ID_PRICE, pPrice, col_table );
+	*pList = g_list_append( *pList, pPrice );
 
     qof_instance_mark_clean( QOF_INSTANCE(pPrice) );
 
@@ -99,14 +101,19 @@
         int numRows = gda_data_model_get_n_rows( pModel );
         int r;
         GNCPrice* pPrice;
+		GList* list = NULL;
 
         for( r = 0; r < numRows; r++ ) {
-            pPrice = load_single_price( be, pModel, r );
+            pPrice = load_single_price( be, pModel, r, &list );
 
             if( pPrice != NULL ) {
                 gnc_pricedb_add_price( pPriceDB, pPrice );
             }
         }
+
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
     }
 }
 

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -167,7 +167,7 @@
 
 /* ================================================================= */
 static SchedXaction*
-load_single_sx( GncGdaBackend* be, GdaDataModel* pModel, int row )
+load_single_sx( GncGdaBackend* be, GdaDataModel* pModel, int row, GList** pList )
 {
     const GUID* guid;
     GUID sx_guid;
@@ -186,7 +186,8 @@
     gnc_gda_load_object( be, pModel, row, /*GNC_ID_SCHEDXACTION*/GNC_SX_ID, pSx, col_table );
 	gnc_gda_recurrence_load_list( be, guid, &schedule );
 	gnc_sx_set_schedule( pSx, schedule );
-    gnc_gda_slots_load( be, QOF_INSTANCE(pSx) );
+//    gnc_gda_slots_load( be, QOF_INSTANCE(pSx) );
+	*pList = g_list_append( *pList, pSx );
 
     qof_instance_mark_clean( QOF_INSTANCE(pSx) );
 
@@ -210,16 +211,21 @@
         int numRows = gda_data_model_get_n_rows( pModel );
         int r;
      	SchedXactions *sxes;
+		GList* list = NULL;
      	sxes = gnc_book_get_schedxactions( be->primary_book );
 
         for( r = 0; r < numRows; r++ ) {
             SchedXaction* sx;
 			
-			sx = load_single_sx( be, pModel, r );
+			sx = load_single_sx( be, pModel, r, &list );
 			if( sx != NULL ) {
 		    	gnc_sxes_add_sx(sxes, sx);
 			}
         }
+
+		if( list != NULL ) {
+			gnc_gda_slots_load_for_list( be, list );
+		}
     }
 }
 

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c	2008-02-03 21:18:13 UTC (rev 16925)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c	2008-02-03 22:57:07 UTC (rev 16926)
@@ -180,9 +180,8 @@
     slot_info_t* pInfo = (slot_info_t*)pObject;
 
 	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( pValue != NULL );
 
-    if( pInfo->value_type == KVP_TYPE_GINT64 ) {
+    if( pInfo->value_type == KVP_TYPE_GINT64 && pValue != NULL ) {
         kvp_frame_set_gint64( pInfo->pKvpFrame, pInfo->path->str, *(gint64*)pValue );
     }
 }
@@ -207,9 +206,8 @@
     slot_info_t* pInfo = (slot_info_t*)pObject;
 
 	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( pValue != NULL );
 
-    if( pInfo->value_type == KVP_TYPE_STRING ) {
+    if( pInfo->value_type == KVP_TYPE_STRING && pValue != NULL ) {
         kvp_frame_set_string( pInfo->pKvpFrame, pInfo->path->str, (const gchar*)pValue );
     }
 }
@@ -236,9 +234,8 @@
     slot_info_t* pInfo = (slot_info_t*)pObject;
 
 	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( pValue != NULL );
 
-    if( pInfo->value_type == KVP_TYPE_DOUBLE ) {
+    if( pInfo->value_type == KVP_TYPE_DOUBLE && pValue != NULL ) {
         kvp_frame_set_double( pInfo->pKvpFrame, pInfo->path->str, *(double*)pValue );
     }
 }
@@ -286,9 +283,8 @@
     slot_info_t* pInfo = (slot_info_t*)pObject;
 
 	g_return_if_fail( pObject != NULL );
-	g_return_if_fail( pValue != NULL );
 
-    if( pInfo->value_type == KVP_TYPE_GUID ) {
+    if( pInfo->value_type == KVP_TYPE_GUID && pValue != NULL ) {
         kvp_frame_set_guid( pInfo->pKvpFrame, pInfo->path->str, (GUID*)pValue );
     }
 }
@@ -524,6 +520,7 @@
     gchar guid_buf[GUID_ENCODING_LENGTH+1];
 	gboolean first_guid = TRUE;
 	GdaObject* ret;
+	gboolean single_item;
 
 	g_return_if_fail( be != NULL );
 
@@ -532,7 +529,14 @@
 
 	// Create the query for all slots for all items on the list
 	sql = g_string_sized_new( 40+(GUID_ENCODING_LENGTH+3)*g_list_length( list ) );
-	g_string_append_printf( sql, "SELECT * FROM %s WHERE %s IN (", TABLE_NAME, obj_guid_col_table[0].col_name );
+	g_string_append_printf( sql, "SELECT * FROM %s WHERE %s ", TABLE_NAME, obj_guid_col_table[0].col_name );
+	if( g_list_length( list ) != 1 ) {
+		g_string_append( sql, "IN (" );
+		single_item = FALSE;
+	} else {
+		g_string_append( sql, "= " );
+		single_item = TRUE;
+	}
 	for( ; list != NULL; list = list->next ) {
 		QofInstance* inst = QOF_INSTANCE(list->data);
 		coll = qof_instance_get_collection( inst );
@@ -546,7 +550,9 @@
 		g_string_append( sql, "'" );
 		first_guid = FALSE;
     }
-	g_string_append( sql, ")" );
+	if( !single_item ) {
+		g_string_append( sql, ")" );
+	}
 
 	// Execute the query and load the slots
 	query = gnc_gda_create_query_from_sql( be, sql->str );



More information about the gnucash-changes mailing list