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