[Gnucash-changes] Slightly modified version of Herbert Toma's fix
to reduce load time with
David Hampton
hampton at cvs.gnucash.org
Sun Oct 30 17:05:31 EST 2005
Log Message:
-----------
Slightly modified version of Herbert Toma's fix to reduce load time
with a large database of stock prices.
Tags:
----
gnucash-gnome2-dev
Modified Files:
--------------
gnucash:
ChangeLog
gnucash/src/backend/file:
gnc-pricedb-xml-v2.c
gnucash/src/engine:
Period.c
gnc-pricedb-p.h
gnc-pricedb.c
gnc-pricedb.h
Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.362
retrieving revision 1.1487.2.363
diff -LChangeLog -LChangeLog -u -r1.1487.2.362 -r1.1487.2.363
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,12 @@
+2005-10-30 David Hampton <hampton at employees.org>
+
+ * src/backend/file/gnc-pricedb-xml-v2.c:
+ * src/engine/Period.c:
+ * src/engine/gnc-pricedb-p.h:
+ * src/engine/gnc-pricedb.[ch]: Slightly modified version of
+ Herbert Toma's fix to reduce load time with a large database of
+ stock prices.
+
2005-10-30 Joshua Sled <jsled at asynchronous.org>
Patches from Scott Oonk <scott.oonk at gmail.com>:
Index: gnc-pricedb-xml-v2.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/gnc-pricedb-xml-v2.c,v
retrieving revision 1.6.4.6
retrieving revision 1.6.4.7
diff -Lsrc/backend/file/gnc-pricedb-xml-v2.c -Lsrc/backend/file/gnc-pricedb-xml-v2.c -u -r1.6.4.6 -r1.6.4.7
--- src/backend/file/gnc-pricedb-xml-v2.c
+++ src/backend/file/gnc-pricedb-xml-v2.c
@@ -231,6 +231,7 @@
QofBook *book = gdata->bookdata;
GNCPriceDB *db = gnc_pricedb_create(book);
g_return_val_if_fail(db, FALSE);
+ gnc_pricedb_set_bulk_update(db, TRUE);
*result = db;
return(TRUE);
}
@@ -305,6 +306,8 @@
gdata->cb(tag, gdata->parsedata, db);
*result = NULL;
+ gnc_pricedb_set_bulk_update(db, FALSE);
+
return TRUE;
}
Index: gnc-pricedb-p.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb-p.h,v
retrieving revision 1.18.4.5
retrieving revision 1.18.4.6
diff -Lsrc/engine/gnc-pricedb-p.h -Lsrc/engine/gnc-pricedb-p.h -u -r1.18.4.5 -r1.18.4.6
--- src/engine/gnc-pricedb-p.h
+++ src/engine/gnc-pricedb-p.h
@@ -55,6 +55,7 @@
{
QofInstance inst; /* globally unique object identifier */
GHashTable *commodity_hash;
+ gboolean bulk_update; /* TRUE while reading XML file, etc. */
};
/* These structs define the kind of price lookup being done
Index: gnc-pricedb.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb.h,v
retrieving revision 1.27.4.6
retrieving revision 1.27.4.7
diff -Lsrc/engine/gnc-pricedb.h -Lsrc/engine/gnc-pricedb.h -u -r1.27.4.6 -r1.27.4.7
--- src/engine/gnc-pricedb.h
+++ src/engine/gnc-pricedb.h
@@ -216,7 +216,7 @@
/** gnc_price_list_insert - insert a price into the given list, calling
gnc_price_ref on it during the process. */
-gboolean gnc_price_list_insert(GList **prices, GNCPrice *p);
+gboolean gnc_price_list_insert(GList **prices, GNCPrice *p, gboolean check_dupl);
/** gnc_price_list_remove - remove the price, p, from the given list,
calling gnc_price_unref on it during the process. */
@@ -265,6 +265,11 @@
void gnc_pricedb_begin_edit (GNCPriceDB *);
void gnc_pricedb_commit_edit (GNCPriceDB *);
+/** Indicate whether or not the database is in the middle of a bulk
+ * update. Setting this flag will disable checks for duplicate
+ * entries. */
+void gnc_pricedb_set_bulk_update(GNCPriceDB *db, gboolean bulk_update);
+
/** gnc_pricedb_add_price - add a price to the pricedb, you may drop
your reference to the price (i.e. call unref) after this
succeeds, whenever you're finished with the price. */
Index: gnc-pricedb.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb.c,v
retrieving revision 1.48.4.13
retrieving revision 1.48.4.14
diff -Lsrc/engine/gnc-pricedb.c -Lsrc/engine/gnc-pricedb.c -u -r1.48.4.13 -r1.48.4.14
--- src/engine/gnc-pricedb.c
+++ src/engine/gnc-pricedb.c
@@ -455,7 +455,7 @@
}
gboolean
-gnc_price_list_insert(GList **prices, GNCPrice *p)
+gnc_price_list_insert(GList **prices, GNCPrice *p, gboolean check_dupl)
{
GList *result_list;
PriceListIsDuplStruct* pStruct;
@@ -464,15 +464,17 @@
if(!prices || !p) return FALSE;
gnc_price_ref(p);
- pStruct = g_new0( PriceListIsDuplStruct, 1 );
- pStruct->pPrice = p;
- pStruct->isDupl = FALSE;
- g_list_foreach( *prices, price_list_is_duplicate, pStruct );
- isDupl = pStruct->isDupl;
- g_free( pStruct );
+ if (check_dupl) {
+ pStruct = g_new0( PriceListIsDuplStruct, 1 );
+ pStruct->pPrice = p;
+ pStruct->isDupl = FALSE;
+ g_list_foreach( *prices, price_list_is_duplicate, pStruct );
+ isDupl = pStruct->isDupl;
+ g_free( pStruct );
- if( isDupl ) {
- return TRUE;
+ if( isDupl ) {
+ return TRUE;
+ }
}
result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
@@ -651,6 +653,12 @@
g_free(db);
}
+void
+gnc_pricedb_set_bulk_update(GNCPriceDB *db, gboolean bulk_update)
+{
+ db->bulk_update = bulk_update;
+}
+
/* ==================================================================== */
/* This is kind of weird, the way its done. Each collection of prices
* for a given commodity should get its own guid, be its own entity, etc.
@@ -816,7 +824,7 @@
}
price_list = g_hash_table_lookup(currency_hash, currency);
- if(!gnc_price_list_insert(&price_list, p))
+ if(!gnc_price_list_insert(&price_list, p, !db->bulk_update))
{
LEAVE ("gnc_price_list_insert failed");
return FALSE;
@@ -1053,7 +1061,7 @@
if(!price_list) return;
/* the latest price is the first in list */
- gnc_price_list_insert(return_list, price_list->data);
+ gnc_price_list_insert(return_list, price_list->data, FALSE);
}
GList *
@@ -1264,7 +1272,7 @@
GNCPrice *p = item->data;
Timespec price_time = timespecCanonicalDayTime(gnc_price_get_time(p));
if(timespec_equal(&price_time, &t)) {
- gnc_price_list_insert(return_list, item->data);
+ gnc_price_list_insert(return_list, item->data, FALSE);
}
item = item->next;
}
@@ -1379,7 +1387,7 @@
GNCPrice *p = item->data;
Timespec price_time = gnc_price_get_time(p);
if(timespec_equal(&price_time, &t)) {
- gnc_price_list_insert(return_list, item->data);
+ gnc_price_list_insert(return_list, item->data, FALSE);
}
item = item->next;
}
@@ -1557,7 +1565,7 @@
}
}
- gnc_price_list_insert(return_list, result);
+ gnc_price_list_insert(return_list, result, FALSE);
}
GList *
Index: Period.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Period.c,v
retrieving revision 1.27.4.5
retrieving revision 1.27.4.6
diff -Lsrc/engine/Period.c -Lsrc/engine/Period.c -u -r1.27.4.5 -r1.27.4.6
--- src/engine/Period.c
+++ src/engine/Period.c
@@ -505,6 +505,7 @@
gnc_pricedb_begin_edit (src_pdb);
gnc_pricedb_begin_edit (dest_pdb);
+ gnc_pricedb_set_bulk_update (dest_pdb, TRUE);
qof_query_set_book (query, src_book);
price_list = qof_query_run (query);
@@ -516,6 +517,7 @@
gnc_book_insert_price (dest_book, pr);
}
+ gnc_pricedb_set_bulk_update (dest_pdb, FALSE);
gnc_pricedb_commit_edit (dest_pdb);
gnc_pricedb_commit_edit (src_pdb);
More information about the gnucash-changes
mailing list