r16912 - gnucash/branches/gda-dev2/src/backend/gda - Improve save performance when saving to a new db. If the db is empty,
Phil Longstaff
plongstaff at cvs.gnucash.org
Sat Feb 2 18:27:04 EST 2008
Author: plongstaff
Date: 2008-02-02 18:27:04 -0500 (Sat, 02 Feb 2008)
New Revision: 16912
Trac: http://svn.gnucash.org/trac/changeset/16912
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-backend-util-gda.h
gnucash/branches/gda-dev2/src/backend/gda/gnc-book-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
gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c
Log:
Improve save performance when saving to a new db. If the db is empty,
we don't need to a) delete old slots before saving new ones, b) delete
old splits for a tx before saving new ones, c) check to see if the
object already exists to know whether to use INSERT or UPDATE.
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -283,15 +283,21 @@
// into the register and an account window will be opened. The account info is not complete yet,
// but the name has been set, triggering this commit
if( xaccAccountGetCommodity( pAcc ) != NULL ) {
+ gint op;
+
// Ensure the commodity is in the db
gnc_gda_save_commodity( be, xaccAccountGetCommodity( pAcc ) );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- TABLE_NAME,
- GNC_ID_ACCOUNT, pAcc,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc, col_table );
+
// Now, commit or delete any slots
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -124,6 +124,8 @@
be->pClient = gda_client_new();
be->pConnection = NULL;
+ // FIXME: better username/password handling
+
/* Split book_id into provider and connection string. If there's no
provider, use "file" */
book_info = g_strdup( book_id );
@@ -583,10 +585,13 @@
/* Save all contents */
be->primary_book = book;
+ be->is_pristine_db = TRUE;
be->obj_total = 0;
be->obj_total += 1 + gnc_account_n_descendants( gnc_book_get_root_account( book ) );
be->obj_total += gnc_book_count_transactions( book );
be->operations_done = 0;
+
+ // FIXME: should write the set of commodities that are used
//write_commodities( be, book );
gnc_gda_save_book( QOF_INSTANCE(book), be );
write_accounts( be );
@@ -594,6 +599,7 @@
write_template_transactions( be );
write_schedXactions( be );
qof_object_foreach_backend( GNC_GDA_BACKEND, write_cb, be );
+ be->is_pristine_db = FALSE;
LEAVE( "book=%p", book );
}
Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h 2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h 2008-02-02 23:27:04 UTC (rev 16912)
@@ -45,6 +45,7 @@
gboolean loading; /* We are performing an initial load */
gboolean in_query;
gboolean supports_transactions;
+ gboolean is_pristine_db; // Are we saving to a new pristine db?
gint obj_total; // Total # of objects (for percentage calculation)
gint operations_done; // Number of operations (save/load) done
Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c 2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -191,16 +191,20 @@
gnc_gda_save_book( QofInstance* inst, GncGdaBackend* be )
{
const GUID* guid;
+ gint op;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( QOF_IS_BOOK(inst) );
- (void)gnc_gda_do_db_operation( be,
- qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE,
- BOOK_TABLE,
- GNC_ID_BOOK, inst,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, BOOK_TABLE, GNC_ID_BOOK, inst, col_table );
// Delete old slot info
guid = qof_instance_get_guid( inst );
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -127,16 +127,20 @@
{
GncBudget* pBudget = GNC_BUDGET(inst);
const GUID* guid;
+ gint op;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_BUDGET(inst) );
- (void)gnc_gda_do_db_operation( be,
- qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE,
- BUDGET_TABLE,
- GNC_ID_BUDGET, pBudget,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget, col_table );
// Now, commit any slots and recurrence
guid = qof_instance_get_guid( inst );
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -178,16 +178,20 @@
commit_commodity( QofInstance* inst, GncGdaBackend* be )
{
const GUID* guid;
+ gint op;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_COMMODITY(inst) );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- COMMODITIES_TABLE,
- GNC_ID_COMMODITY, inst,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, COMMODITIES_TABLE, GNC_ID_COMMODITY, inst, col_table );
// Delete old slot info
guid = qof_instance_get_guid( inst );
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -153,15 +153,20 @@
static void
commit_lot( QofInstance* inst, GncGdaBackend* be )
{
+ gint op;
+
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_LOT(inst) );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- TABLE_NAME,
- GNC_ID_LOT, inst,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_LOT, inst, col_table );
// Now, commit any slots
gnc_gda_slots_save( be, qof_instance_get_guid( inst ),
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -125,6 +125,7 @@
save_price( QofInstance* inst, GncGdaBackend* be )
{
GNCPrice* pPrice = GNC_PRICE(inst);
+ gint op;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
@@ -134,11 +135,14 @@
gnc_gda_save_commodity( be, gnc_price_get_commodity( pPrice ) );
gnc_gda_save_commodity( be, gnc_price_get_currency( pPrice ) );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- TABLE_NAME,
- GNC_ID_PRICE, pPrice,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_PRICE, pPrice, col_table );
}
static gboolean
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -239,16 +239,20 @@
{
SchedXaction* pSx = GNC_SX(inst);
const GUID* guid;
+ gint op;
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_SX(inst) );
g_return_if_fail( be != NULL );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- SCHEDXACTION_TABLE,
- /*GNC_ID_SCHEDXACTION*/GNC_SX_ID, pSx,
- col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, SCHEDXACTION_TABLE, /*GNC_ID_SCHEDXACTION*/GNC_SX_ID, pSx, col_table );
gnc_gda_recurrence_save_list( be, guid, gnc_sx_get_schedule( pSx ) );
// Now, commit any slots
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-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -356,8 +356,10 @@
g_return_if_fail( guid != NULL );
g_return_if_fail( pFrame != NULL );
- /* First, delete the old slots for this object */
- gnc_gda_slots_delete( be, guid );
+ // If this is not saving into a new db, clear out the old saved slots first
+ if( !be->is_pristine_db ) {
+ gnc_gda_slots_delete( be, guid );
+ }
slot_info.be = be;
slot_info.guid = guid;
Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c 2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c 2008-02-02 23:27:04 UTC (rev 16912)
@@ -453,14 +453,19 @@
static void
commit_split( QofInstance* inst, GncGdaBackend* be )
{
+ gint op;
+
g_return_if_fail( inst != NULL );
g_return_if_fail( be != NULL );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- SPLIT_TABLE,
- GNC_ID_SPLIT, inst,
- split_col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, SPLIT_TABLE, GNC_ID_SPLIT, inst, split_col_table );
gnc_gda_slots_save( be,
qof_instance_get_guid( inst ),
qof_instance_get_slots( inst ) );
@@ -498,6 +503,7 @@
{
Transaction* pTx = GNC_TRANS(inst);
const GUID* guid;
+ gint op;
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_TRANS(inst) );
@@ -506,16 +512,22 @@
// Ensure the commodity is in the db
gnc_gda_save_commodity( be, xaccTransGetCurrency( pTx ) );
- (void)gnc_gda_do_db_operation( be,
- (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
- TRANSACTION_TABLE,
- GNC_ID_TRANS, pTx,
- tx_col_table );
+ if( qof_instance_get_destroying( inst ) ) {
+ op = OP_DB_DELETE;
+ } else if( be->is_pristine_db ) {
+ op = OP_DB_ADD;
+ } else {
+ op = OP_DB_ADD_OR_UPDATE;
+ }
+ (void)gnc_gda_do_db_operation( be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx, tx_col_table );
+
guid = qof_instance_get_guid( inst );
// Delete any old slots and splits for this transaction
- delete_splits( be, pTx );
+ if( !be->is_pristine_db ) {
+ delete_splits( be, pTx );
+ }
if( !qof_instance_get_destroying(inst) ) {
SplitList* splits;
More information about the gnucash-changes
mailing list