gnucash master: Multiple changes pushed

Mike Alexander mta at code.gnucash.org
Tue Nov 3 18:15:32 EST 2015


Updated	 via  https://github.com/Gnucash/gnucash/commit/3a0ec89c (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f2fa80bf (commit)
	 via  https://github.com/Gnucash/gnucash/commit/60ae86d1 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c7f87f25 (commit)
	from  https://github.com/Gnucash/gnucash/commit/d0fee729 (commit)



commit 3a0ec89c06c79db3489f760ab248d0240638732a
Author: Mike Alexander <mta at umich.edu>
Date:   Mon Nov 2 21:16:09 2015 -0500

    Optimize pricedb so it works better with really big price lists.
    
    Opening my accounts file took over 10 minutes before this change, most of
    it spent populating the account balances in account tree, and most of that
    spent in g_sort_list.  Expanding or collapsing subtrees in the account tree
    also took several seconds.  This change reduces the use of g_sort_list and
    reduces the length of lists sorted when it is used.  Opening the file is
    now only a few seconds slower than before the PriceDB changes.

diff --git a/src/engine/gnc-pricedb.c b/src/engine/gnc-pricedb.c
index dd48bbd..2cd79b8 100644
--- a/src/engine/gnc-pricedb.c
+++ b/src/engine/gnc-pricedb.c
@@ -1435,6 +1435,40 @@ price_list_from_hashtable (GHashTable *hash, const gnc_commodity *currency)
     return result;
 }
 
+static PriceList *
+pricedb_price_list_merge (PriceList *a, PriceList *b)
+{
+    PriceList *merged_list = NULL;
+    GList *next_a = a;
+    GList *next_b = b;
+    
+    while (next_a || next_b)
+    {
+        if (next_a == NULL)
+        {
+            merged_list = g_list_prepend (merged_list, next_b->data);
+            next_b = next_b->next;
+        }
+        else if (next_b == NULL)
+        {
+            merged_list = g_list_prepend (merged_list, next_a->data);
+            next_a = next_a->next;
+        }
+        /* We're building the list in reverse order so reverse the comparison. */
+        else if (compare_prices_by_date (next_a->data, next_b->data) < 0)
+        {
+            merged_list = g_list_prepend (merged_list, next_a->data);
+            next_a = next_a->next;
+        }
+        else
+        {
+            merged_list = g_list_prepend (merged_list, next_b->data);
+            next_b = next_b->next;
+        }
+    }
+    return g_list_reverse (merged_list);
+}
+
 static PriceList*
 pricedb_get_prices_internal(GNCPriceDB *db, const gnc_commodity *commodity,
                             const gnc_commodity *currency, gboolean bidi)
@@ -1459,14 +1493,24 @@ pricedb_get_prices_internal(GNCPriceDB *db, const gnc_commodity *commodity,
         if (reverse_list)
         {
             if (forward_list)
-                forward_list = g_list_concat (forward_list, reverse_list);
+            {
+                /* Since we have a currency both lists came directly from a 
+                   currency hash table we know they are both sorted already. */
+                PriceList *merged_list;
+                merged_list = pricedb_price_list_merge (forward_list, reverse_list);
+                g_list_free (forward_list);
+                g_list_free (reverse_list);
+                forward_list = merged_list;
+            }
             else
             {
                 forward_list = reverse_list;
             }
         }
     }
-    if (forward_list)
+    if (forward_list && !currency)
+        /* Multiple currencies, reverse_list doesn't exist and 
+           forward_list must be sorted */
         forward_list = g_list_sort (forward_list, compare_prices_by_date);
     return forward_list;
 }
@@ -1513,20 +1557,107 @@ typedef struct
 {
     GList **list;
     const gnc_commodity *com;
+    GNCPrice *previous_price;
+    gboolean have_good_price;
+    Timespec t;
+    gboolean before;
 } UsesCommodity;
 
 static gboolean
-price_uses_commodity(GNCPrice *price, gpointer data)
+price_list_scan_any_currency(GNCPrice *price, gpointer data)
 {
     UsesCommodity *helper = (UsesCommodity*)data;
     gnc_commodity *com = gnc_price_get_commodity(price);
     gnc_commodity *cur = gnc_price_get_currency(price);
+    Timespec time = gnc_price_get_time(price);
+    gnc_commodity *previous_com = NULL;
+    gnc_commodity *previous_cur = NULL;
+    Timespec previous_time;
+    gboolean same_price_list = FALSE;
+    
+    if (helper->previous_price)
+    {
+        previous_com = gnc_price_get_commodity(helper->previous_price);
+        previous_cur = gnc_price_get_currency(helper->previous_price);
+        previous_time = gnc_price_get_time(helper->previous_price);
+        if (previous_com == com && previous_cur == cur)
+            same_price_list = TRUE;
+    }
+    if (helper->have_good_price && same_price_list)
+    {
+        helper->previous_price = price;
+        /* Tell scanner to skip rest of price list */
+        return FALSE;
+    }
+    
+    /* If we're changing commodity or currency finish up the previous one
+       before starting the new one */
+    if (!same_price_list && !helper->have_good_price && helper->previous_price && 
+        (previous_com == helper->com || previous_cur == helper->com))
+    {
+        /* Use the last price from the previous group of prices */
+        if (! (helper->before && 
+               timespec_cmp(&previous_time, &helper->t) > 0))
+        {
+            gnc_price_ref(helper->previous_price);
+            *helper->list = g_list_prepend(*helper->list, helper->previous_price);
+        }
+    }
+    
+    if (!same_price_list)
+        helper->have_good_price = FALSE;
+    
     if (helper->com == com || helper->com == cur)
     {
-        gnc_price_ref(price);
-        *helper->list = g_list_prepend(*helper->list, price);
+        if (timespec_cmp(&time, &helper->t) < 0)
+        {
+            /* This price is before given time */
+            if (helper->before)
+            {
+                /* We want the first price before the given time */
+                gnc_price_ref(price);
+                *helper->list = g_list_prepend(*helper->list, price);
+            }
+            else
+            {
+                /* Previous price (if any) is after and this price is before,
+                   use the closest one */
+                if (same_price_list)
+                {
+                    Timespec diff_prev = timespec_diff(&previous_time, &helper->t);
+                    Timespec diff_next = timespec_diff(&time, &helper->t);
+                    diff_prev = timespec_abs(&diff_prev);
+                    diff_next = timespec_abs(&diff_next);
+                    if (timespec_cmp(&diff_prev, &diff_next) < 0)
+                    {
+                        gnc_price_ref(helper->previous_price);
+                        *helper->list = g_list_prepend(*helper->list, helper->previous_price);
+                    }
+                    else
+                    {
+                        gnc_price_ref(price);
+                        *helper->list = g_list_prepend(*helper->list, price);
+                    }
+                }
+                else
+                {
+                    /* First price for this commodity/currency is before the
+                       given time, it's the closest */
+                    gnc_price_ref(price);
+                    *helper->list = g_list_prepend(*helper->list, price);
+                }
+            }
+            helper->have_good_price = TRUE;
+        }
     }
-    return TRUE;
+    else
+    {
+        /* Don't care about this commodity/currency, skip it */
+        helper->have_good_price = TRUE;
+    }
+    helper->previous_price = price;
+    /* Done with this price list if we have a good price from it. */
+    return !helper->have_good_price;
 }
 
 static gboolean
@@ -1669,13 +1800,13 @@ gnc_pricedb_lookup_latest_any_currency(GNCPriceDB *db,
                                        const gnc_commodity *commodity)
 {
     GList *prices = NULL, *result;
-    UsesCommodity helper = {&prices, commodity};
+    UsesCommodity helper = {&prices, commodity, NULL, FALSE, timespec_now(), TRUE};
     result = NULL;
 
     if (!db || !commodity) return NULL;
     ENTER ("db=%p commodity=%p", db, commodity);
 
-    gnc_pricedb_foreach_price(db, price_uses_commodity,
+    gnc_pricedb_foreach_price(db, price_list_scan_any_currency,
                                        &helper, FALSE);
     prices = g_list_sort(prices, compare_prices_by_date);
     result = latest_before(prices, commodity, timespec_now());
@@ -1690,13 +1821,13 @@ gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
                                                 Timespec t)
 {
     GList *prices = NULL, *result;
-    UsesCommodity helper = {&prices, commodity};
+    UsesCommodity helper = {&prices, commodity, NULL, FALSE, t, FALSE};
     result = NULL;
 
     if (!db || !commodity) return NULL;
     ENTER ("db=%p commodity=%p", db, commodity);
 
-    gnc_pricedb_foreach_price(db, price_uses_commodity,
+    gnc_pricedb_foreach_price(db, price_list_scan_any_currency,
                                        &helper, FALSE);
     prices = g_list_sort(prices, compare_prices_by_date);
     result = nearest_to(prices, commodity, t);
@@ -1711,13 +1842,13 @@ gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,
                                               Timespec t)
 {
     GList *prices = NULL, *result;
-    UsesCommodity helper = {&prices, commodity};
+    UsesCommodity helper = {&prices, commodity, NULL, FALSE, t, TRUE};
     result = NULL;
 
     if (!db || !commodity) return NULL;
     ENTER ("db=%p commodity=%p", db, commodity);
 
-    gnc_pricedb_foreach_price(db, price_uses_commodity,
+    gnc_pricedb_foreach_price(db, price_list_scan_any_currency,
                                        &helper, FALSE);
     prices = g_list_sort(prices, compare_prices_by_date);
     result = latest_before(prices, commodity, t);

commit f2fa80bffbf0a1121913b7135febbf0dc33c86f0
Author: Mike Alexander <mta at umich.edu>
Date:   Mon Nov 2 16:04:04 2015 -0500

    Update XCode project for C++ file name changes.

diff --git a/gnucash.xcodeproj/project.pbxproj b/gnucash.xcodeproj/project.pbxproj
index 085ab57..16d865c 100644
--- a/gnucash.xcodeproj/project.pbxproj
+++ b/gnucash.xcodeproj/project.pbxproj
@@ -8,6 +8,35 @@
 
 /* Begin PBXFileReference section */
 		6E056BF416C0F1E100B5E1F2 /* qof-string-cache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "qof-string-cache.h"; path = "src/libqof/qof/qof-string-cache.h"; sourceTree = "<group>"; };
+		6E0A56DF1BE6D5CB00F028BB /* dummy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dummy.cpp; path = src/engine/test/dummy.cpp; sourceTree = "<group>"; };
+		6E0A56E01BE6D5CB00F028BB /* gtest-import-map.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-import-map.cpp"; path = "src/engine/test/gtest-import-map.cpp"; sourceTree = "<group>"; };
+		6E0A56E11BE6D5CB00F028BB /* test-account-object.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-account-object.cpp"; path = "src/engine/test/test-account-object.cpp"; sourceTree = "<group>"; };
+		6E0A56E21BE6D5CB00F028BB /* test-address.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-address.c"; path = "src/engine/test/test-address.c"; sourceTree = "<group>"; };
+		6E0A56E31BE6D5CB00F028BB /* test-business.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-business.c"; path = "src/engine/test/test-business.c"; sourceTree = "<group>"; };
+		6E0A56E41BE6D5CB00F028BB /* test-commodities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-commodities.cpp"; path = "src/engine/test/test-commodities.cpp"; sourceTree = "<group>"; };
+		6E0A56E51BE6D5CB00F028BB /* test-customer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-customer.c"; path = "src/engine/test/test-customer.c"; sourceTree = "<group>"; };
+		6E0A56E61BE6D5CB00F028BB /* test-date.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-date.cpp"; path = "src/engine/test/test-date.cpp"; sourceTree = "<group>"; };
+		6E0A56E71BE6D5CB00F028BB /* test-employee.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-employee.c"; path = "src/engine/test/test-employee.c"; sourceTree = "<group>"; };
+		6E0A56E81BE6D5CB00F028BB /* test-engine-kvp-properties.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-engine-kvp-properties.c"; path = "src/engine/test/test-engine-kvp-properties.c"; sourceTree = "<group>"; };
+		6E0A56E91BE6D5CB00F028BB /* test-engine.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-engine.c"; path = "src/engine/test/test-engine.c"; sourceTree = "<group>"; };
+		6E0A56EA1BE6D5CB00F028BB /* test-group-vs-book.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-group-vs-book.cpp"; path = "src/engine/test/test-group-vs-book.cpp"; sourceTree = "<group>"; };
+		6E0A56EB1BE6D5CB00F028BB /* test-guid.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-guid.cpp"; path = "src/engine/test/test-guid.cpp"; sourceTree = "<group>"; };
+		6E0A56EC1BE6D5CB00F028BB /* test-job.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-job.c"; path = "src/engine/test/test-job.c"; sourceTree = "<group>"; };
+		6E0A56ED1BE6D5CB00F028BB /* test-lots.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-lots.cpp"; path = "src/engine/test/test-lots.cpp"; sourceTree = "<group>"; };
+		6E0A56EE1BE6D5CB00F028BB /* test-numeric.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-numeric.cpp"; path = "src/engine/test/test-numeric.cpp"; sourceTree = "<group>"; };
+		6E0A56EF1BE6D5CB00F028BB /* test-query.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-query.cpp"; path = "src/engine/test/test-query.cpp"; sourceTree = "<group>"; };
+		6E0A56F01BE6D5CB00F028BB /* test-scm-query.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-scm-query.cpp"; path = "src/engine/test/test-scm-query.cpp"; sourceTree = "<group>"; };
+		6E0A56F11BE6D5CB00F028BB /* test-split-vs-account.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-split-vs-account.cpp"; path = "src/engine/test/test-split-vs-account.cpp"; sourceTree = "<group>"; };
+		6E0A56F21BE6D5CB00F028BB /* test-transaction-reversal.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-transaction-reversal.cpp"; path = "src/engine/test/test-transaction-reversal.cpp"; sourceTree = "<group>"; };
+		6E0A56F31BE6D5CB00F028BB /* test-transaction-voiding.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-transaction-voiding.cpp"; path = "src/engine/test/test-transaction-voiding.cpp"; sourceTree = "<group>"; };
+		6E0A56F41BE6D5CB00F028BB /* test-vendor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-vendor.c"; path = "src/engine/test/test-vendor.c"; sourceTree = "<group>"; };
+		6E0A56F51BE6D5CB00F028BB /* utest-Account.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "utest-Account.cpp"; path = "src/engine/test/utest-Account.cpp"; sourceTree = "<group>"; };
+		6E0A56F61BE6D5CB00F028BB /* utest-Budget.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "utest-Budget.c"; path = "src/engine/test/utest-Budget.c"; sourceTree = "<group>"; };
+		6E0A56F71BE6D5CB00F028BB /* utest-Entry.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "utest-Entry.c"; path = "src/engine/test/utest-Entry.c"; sourceTree = "<group>"; };
+		6E0A56F81BE6D5CB00F028BB /* utest-gnc-pricedb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "utest-gnc-pricedb.c"; path = "src/engine/test/utest-gnc-pricedb.c"; sourceTree = "<group>"; };
+		6E0A56F91BE6D5CB00F028BB /* utest-Invoice.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "utest-Invoice.c"; path = "src/engine/test/utest-Invoice.c"; sourceTree = "<group>"; };
+		6E0A56FA1BE6D5CB00F028BB /* utest-Split.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "utest-Split.cpp"; path = "src/engine/test/utest-Split.cpp"; sourceTree = "<group>"; };
+		6E0A56FB1BE6D5CB00F028BB /* utest-Transaction.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "utest-Transaction.cpp"; path = "src/engine/test/utest-Transaction.cpp"; sourceTree = "<group>"; };
 		6E0E95251851BC8F0033FCAD /* assistant-acct-period.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "assistant-acct-period.c"; path = "src/gnome/assistant-acct-period.c"; sourceTree = "<group>"; };
 		6E0E95261851BC8F0033FCAD /* assistant-acct-period.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "assistant-acct-period.h"; path = "src/gnome/assistant-acct-period.h"; sourceTree = "<group>"; };
 		6E0E95271851BC8F0033FCAD /* assistant-hierarchy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "assistant-hierarchy.c"; path = "src/gnome/assistant-hierarchy.c"; sourceTree = "<group>"; };
@@ -99,7 +128,6 @@
 		6E4A803B0F27C3EF0024DAAF /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Makefile.am; path = src/backend/sql/test/Makefile.am; sourceTree = "<group>"; };
 		6E4A803C0F27C4FC0024DAAF /* gnc-help-utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "gnc-help-utils.c"; path = "src/app-utils/gnc-help-utils.c"; sourceTree = "<group>"; };
 		6E4A803D0F27C4FC0024DAAF /* gnc-help-utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "gnc-help-utils.h"; path = "src/app-utils/gnc-help-utils.h"; sourceTree = "<group>"; };
-		6E4A803E0F27C4FC0024DAAF /* test-sx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "test-sx.c"; path = "src/app-utils/test/test-sx.c"; sourceTree = "<group>"; };
 		6E4A803F0F27C4FC0024DAAF /* gnc-backend-dbi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "gnc-backend-dbi.c"; path = "src/backend/dbi/gnc-backend-dbi.c"; sourceTree = "<group>"; };
 		6E4A80400F27C4FC0024DAAF /* gnc-backend-dbi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "gnc-backend-dbi.h"; path = "src/backend/dbi/gnc-backend-dbi.h"; sourceTree = "<group>"; };
 		6E4A80410F27C4FC0024DAAF /* gncmod-backend-dbi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "gncmod-backend-dbi.c"; path = "src/backend/dbi/gncmod-backend-dbi.c"; sourceTree = "<group>"; };
@@ -127,7 +155,6 @@
 		6E4A805A0F27C4FC0024DAAF /* test-column-types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "test-column-types.c"; path = "src/backend/sql/test/test-column-types.c"; sourceTree = "<group>"; };
 		6E4A805B0F27C6A50024DAAF /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Makefile.am; path = src/backend/dbi/test/Makefile.am; sourceTree = "<group>"; };
 		6E4A80760F27C8770024DAAF /* core-utils.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "core-utils.scm"; path = "src/core-utils/core-utils.scm"; sourceTree = "<group>"; };
-		6E4A80770F27C9820024DAAF /* test-account-object.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "test-account-object.c"; path = "src/engine/test/test-account-object.c"; sourceTree = "<group>"; };
 		6E4A80790F27CA4A0024DAAF /* dialog-book-close.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dialog-book-close.c"; path = "src/gnome-utils/dialog-book-close.c"; sourceTree = "<group>"; };
 		6E4A807A0F27CA4A0024DAAF /* dialog-book-close.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "dialog-book-close.h"; path = "src/gnome-utils/dialog-book-close.h"; sourceTree = "<group>"; };
 		6E4A807D0F27CA4A0024DAAF /* gnc-autosave.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "gnc-autosave.c"; path = "src/gnome-utils/gnc-autosave.c"; sourceTree = "<group>"; };
@@ -435,7 +462,6 @@
 		6E8B75ED09912C9E003F7E3A /* gnucash-sheet.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "gnucash-sheet.c"; path = "src/register/register-gnome/gnucash-sheet.c"; sourceTree = "<group>"; };
 		6E8B75EE09912C9E003F7E3A /* gnucash-style.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "gnucash-style.c"; path = "src/register/register-gnome/gnucash-style.c"; sourceTree = "<group>"; };
 		6E8B768C09912C9E003F7E3A /* gtable.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gtable.c; path = "src/register/register-core/gtable.c"; sourceTree = "<group>"; };
-		6E8B768F09912C9F003F7E3A /* guile-strings.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "guile-strings.c"; path = "intl-scm/guile-strings.c"; sourceTree = "<group>"; };
 		6E8B769009912C9F003F7E3A /* guile-util.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "guile-util.c"; path = "src/app-utils/guile-util.c"; sourceTree = "<group>"; };
 		6E8B76A009912C9F003F7E3A /* hello.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hello.c; path = "src/experimental/cgi-bin/hello.c"; sourceTree = "<group>"; };
 		6E8B76A109912C9F003F7E3A /* hello2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hello2.c; path = "src/experimental/cgi-bin/hello2.c"; sourceTree = "<group>"; };
@@ -451,9 +477,7 @@
 		6E8B76AD09912C9F003F7E3A /* import-utilities.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "import-utilities.c"; path = "src/import-export/import-utilities.c"; sourceTree = "<group>"; };
 		6E8B76AE09912C9F003F7E3A /* incompatdep.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = incompatdep.c; path = "src/gnc-module/test/misc-mods/incompatdep.c"; sourceTree = "<group>"; };
 		6E8B76B609912C9F003F7E3A /* iso-4217-currencies.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "iso-4217-currencies.c"; path = "../build/darwin/src/engine/iso-4217-currencies.c"; sourceTree = "<group>"; };
-		6E8B76B809912C9F003F7E3A /* kvp-scm.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "kvp-scm.c"; path = "src/engine/kvp-scm.c"; sourceTree = "<group>"; };
 		6E8B76BB09912C9F003F7E3A /* libc-missing-noop.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "libc-missing-noop.c"; path = "lib/libc/libc-missing-noop.c"; sourceTree = "<group>"; };
-		6E8B76BD09912C9F003F7E3A /* localtime_r.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = localtime_r.c; path = lib/libc/localtime_r.c; sourceTree = "<group>"; };
 		6E8B76C109912C9F003F7E3A /* misc-gnome-utils.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "misc-gnome-utils.c"; path = "src/gnome-utils/misc-gnome-utils.c"; sourceTree = "<group>"; };
 		6E8B76C209912C9F003F7E3A /* numcell.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = numcell.c; path = "src/register/register-core/numcell.c"; sourceTree = "<group>"; };
 		6E8B76C409912C9F003F7E3A /* option-util.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "option-util.c"; path = "src/app-utils/option-util.c"; sourceTree = "<group>"; };
@@ -504,14 +528,9 @@
 		6E8B771809912C9F003F7E3A /* table-layout.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "table-layout.c"; path = "src/register/register-core/table-layout.c"; sourceTree = "<group>"; };
 		6E8B771909912C9F003F7E3A /* table-model.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "table-model.c"; path = "src/register/register-core/table-model.c"; sourceTree = "<group>"; };
 		6E8B771B09912C9F003F7E3A /* test-agedver.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-agedver.c"; path = "src/gnc-module/test/test-agedver.c"; sourceTree = "<group>"; };
-		6E8B772009912C9F003F7E3A /* test-commodities.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-commodities.c"; path = "src/engine/test/test-commodities.c"; sourceTree = "<group>"; };
-		6E8B772609912C9F003F7E3A /* test-date.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-date.c"; path = "src/engine/test/test-date.c"; sourceTree = "<group>"; };
 		6E8B772B09912C9F003F7E3A /* test-dynload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-dynload.c"; path = "src/gnc-module/test/test-dynload.c"; sourceTree = "<group>"; };
-		6E8B772D09912C9F003F7E3A /* test-engine-stuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-engine-stuff.c"; path = "src/engine/test-core/test-engine-stuff.c"; sourceTree = "<group>"; };
 		6E8B772F09912C9F003F7E3A /* test-exp-parser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-exp-parser.c"; path = "src/app-utils/test/test-exp-parser.c"; sourceTree = "<group>"; };
 		6E8B773309912C9F003F7E3A /* test-gnc-recurrence.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-gnc-recurrence.c"; path = "src/gnome-utils/test/test-gnc-recurrence.c"; sourceTree = "<group>"; };
-		6E8B773409912C9F003F7E3A /* test-group-vs-book.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-group-vs-book.c"; path = "src/engine/test/test-group-vs-book.c"; sourceTree = "<group>"; };
-		6E8B773509912C9F003F7E3A /* test-guid.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-guid.c"; path = "src/engine/test/test-guid.c"; sourceTree = "<group>"; };
 		6E8B773809912C9F003F7E3A /* test-import-parse.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-import-parse.c"; path = "src/import-export/test/test-import-parse.c"; sourceTree = "<group>"; };
 		6E8B773909912C9F003F7E3A /* test-incompatdep.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-incompatdep.c"; path = "src/gnc-module/test/test-incompatdep.c"; sourceTree = "<group>"; };
 		6E8B773D09912C9F003F7E3A /* test-link-module.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-link-module.c"; path = "src/gnome-utils/test/test-link-module.c"; sourceTree = "<group>"; };
@@ -529,21 +548,12 @@
 		6E8B774E09912C9F003F7E3A /* test-link.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-link.c"; path = "src/import-export/test/test-link.c"; sourceTree = "<group>"; };
 		6E8B775109912C9F003F7E3A /* test-load-c.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-load-c.c"; path = "src/gnc-module/test/test-load-c.c"; sourceTree = "<group>"; };
 		6E8B775209912C9F003F7E3A /* test-load-engine.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-load-engine.c"; path = "src/engine/test/test-load-engine.c"; sourceTree = "<group>"; };
-		6E8B775609912C9F003F7E3A /* test-lots.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-lots.c"; path = "src/engine/test/test-lots.c"; sourceTree = "<group>"; };
 		6E8B775809912C9F003F7E3A /* test-modsysver.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-modsysver.c"; path = "src/gnc-module/test/test-modsysver.c"; sourceTree = "<group>"; };
-		6E8B775E09912C9F003F7E3A /* test-numeric.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-numeric.c"; path = "src/engine/test/test-numeric.c"; sourceTree = "<group>"; };
 		6E8B775F09912C9F003F7E3A /* test-object.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-object.c"; path = "src/engine/test/test-object.c"; sourceTree = "<group>"; };
-		6E8B776809912C9F003F7E3A /* test-print-queries.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-print-queries.c"; path = "src/app-utils/test/test-print-queries.c"; sourceTree = "<group>"; };
 		6E8B776909912C9F003F7E3A /* test-qif.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-qif.c"; path = "src/import-export/qif/test/test-qif.c"; sourceTree = "<group>"; };
-		6E8B776A09912C9F003F7E3A /* test-query.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-query.c"; path = "src/engine/test/test-query.c"; sourceTree = "<group>"; };
 		6E8B776B09912C9F003F7E3A /* test-querynew.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-querynew.c"; path = "src/engine/test/test-querynew.c"; sourceTree = "<group>"; };
 		6E8B776C09912C9F003F7E3A /* test-recurrence.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-recurrence.c"; path = "src/engine/test/test-recurrence.c"; sourceTree = "<group>"; };
-		6E8B777009912C9F003F7E3A /* test-scm-query-string.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-scm-query-string.c"; path = "src/app-utils/test/test-scm-query-string.c"; sourceTree = "<group>"; };
-		6E8B777109912C9F003F7E3A /* test-scm-query.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-scm-query.c"; path = "src/engine/test/test-scm-query.c"; sourceTree = "<group>"; };
-		6E8B777209912C9F003F7E3A /* test-split-vs-account.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-split-vs-account.c"; path = "src/engine/test/test-split-vs-account.c"; sourceTree = "<group>"; };
 		6E8B777409912C9F003F7E3A /* test-stuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-stuff.c"; path = "src/test-core/test-stuff.c"; sourceTree = "<group>"; };
-		6E8B777609912C9F003F7E3A /* test-transaction-reversal.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-transaction-reversal.c"; path = "src/engine/test/test-transaction-reversal.c"; sourceTree = "<group>"; };
-		6E8B777709912C9F003F7E3A /* test-transaction-voiding.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "test-transaction-voiding.c"; path = "src/engine/test/test-transaction-voiding.c"; sourceTree = "<group>"; };
 		6E8B778209912C9F003F7E3A /* top-level.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "top-level.c"; path = "src/gnome/top-level.c"; sourceTree = "<group>"; };
 		6E8B778409912C9F003F7E3A /* TransLog.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = TransLog.c; path = src/engine/TransLog.c; sourceTree = "<group>"; };
 		6E8B778B09912CA0003F7E3A /* window-reconcile.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = "window-reconcile.c"; path = "src/gnome/window-reconcile.c"; sourceTree = "<group>"; };
@@ -697,13 +707,11 @@
 		6E8B79900991BC41003F7E3A /* import-backend.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-backend.h"; path = "src/import-export/import-backend.h"; sourceTree = "<group>"; };
 		6E8B79910991BC41003F7E3A /* import-commodity-matcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-commodity-matcher.h"; path = "src/import-export/import-commodity-matcher.h"; sourceTree = "<group>"; };
 		6E8B79920991BC41003F7E3A /* import-main-matcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-main-matcher.h"; path = "src/import-export/import-main-matcher.h"; sourceTree = "<group>"; };
-		6E8B79930991BC42003F7E3A /* import-match-map.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-match-map.h"; path = "src/import-export/import-match-map.h"; sourceTree = "<group>"; };
 		6E8B79940991BC42003F7E3A /* import-match-picker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-match-picker.h"; path = "src/import-export/import-match-picker.h"; sourceTree = "<group>"; };
 		6E8B79950991BC42003F7E3A /* import-parse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-parse.h"; path = "src/import-export/import-parse.h"; sourceTree = "<group>"; };
 		6E8B79960991BC42003F7E3A /* import-settings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-settings.h"; path = "src/import-export/import-settings.h"; sourceTree = "<group>"; };
 		6E8B79970991BC42003F7E3A /* import-utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "import-utilities.h"; path = "src/import-export/import-utilities.h"; sourceTree = "<group>"; };
 		6E8B79A20991BC42003F7E3A /* kvp-scm.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "kvp-scm.h"; path = "src/engine/kvp-scm.h"; sourceTree = "<group>"; };
-		6E8B79A70991BC42003F7E3A /* localtime_r.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = localtime_r.h; path = lib/libc/localtime_r.h; sourceTree = "<group>"; };
 		6E8B79AA0991BC42003F7E3A /* misc-gnome-utils.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "misc-gnome-utils.h"; path = "src/gnome-utils/misc-gnome-utils.h"; sourceTree = "<group>"; };
 		6E8B79AD0991BC42003F7E3A /* numcell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = numcell.h; path = "src/register/register-core/numcell.h"; sourceTree = "<group>"; };
 		6E8B79AF0991BC42003F7E3A /* option-util.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "option-util.h"; path = "src/app-utils/option-util.h"; sourceTree = "<group>"; };
@@ -1083,7 +1091,6 @@
 		6EBC075318B1D98500A5CEB7 /* gncVendor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gncVendor.c; path = src/engine/gncVendor.c; sourceTree = "<group>"; };
 		6EBC075418B1D98500A5CEB7 /* gncVendor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gncVendor.h; path = src/engine/gncVendor.h; sourceTree = "<group>"; };
 		6EBC075518B1D98500A5CEB7 /* gncVendorP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gncVendorP.h; path = src/engine/gncVendorP.h; sourceTree = "<group>"; };
-		6EBC075618B1DA8800A5CEB7 /* assistant-utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "assistant-utils.c"; path = "src/gnome-utils/assistant-utils.c"; sourceTree = "<group>"; };
 		6EBC075718B1DA8800A5CEB7 /* assistant-utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "assistant-utils.h"; path = "src/gnome-utils/assistant-utils.h"; sourceTree = "<group>"; };
 		6EBC075818B1DA8800A5CEB7 /* assistant-xml-encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "assistant-xml-encoding.c"; path = "src/gnome-utils/assistant-xml-encoding.c"; sourceTree = "<group>"; };
 		6EBC075918B1DA8800A5CEB7 /* assistant-xml-encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "assistant-xml-encoding.h"; path = "src/gnome-utils/assistant-xml-encoding.h"; sourceTree = "<group>"; };
@@ -1130,7 +1137,6 @@
 		6EBC078218B1DB4D00A5CEB7 /* gnc-ab-gettrans.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gnc-ab-gettrans.h"; path = "src/import-export/aqb/gnc-ab-gettrans.h"; sourceTree = "<group>"; };
 		6EBC078318B1DB4D00A5CEB7 /* gnc-ab-kvp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "gnc-ab-kvp.c"; path = "src/import-export/aqb/gnc-ab-kvp.c"; sourceTree = "<group>"; };
 		6EBC078418B1DB4D00A5CEB7 /* gnc-ab-kvp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gnc-ab-kvp.h"; path = "src/import-export/aqb/gnc-ab-kvp.h"; sourceTree = "<group>"; };
-		6EBC078618B1DB4D00A5CEB7 /* gnc-ab-trans-templ.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gnc-ab-trans-templ.h"; path = "src/import-export/aqb/gnc-ab-trans-templ.h"; sourceTree = "<group>"; };
 		6EBC078718B1DB4D00A5CEB7 /* gnc-ab-transfer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "gnc-ab-transfer.c"; path = "src/import-export/aqb/gnc-ab-transfer.c"; sourceTree = "<group>"; };
 		6EBC078818B1DB4D00A5CEB7 /* gnc-ab-transfer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gnc-ab-transfer.h"; path = "src/import-export/aqb/gnc-ab-transfer.h"; sourceTree = "<group>"; };
 		6EBC078918B1DB4D00A5CEB7 /* gnc-ab-utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "gnc-ab-utils.c"; path = "src/import-export/aqb/gnc-ab-utils.c"; sourceTree = "<group>"; };
@@ -1212,8 +1218,6 @@
 		6EBC07D818B1DDD000A5CEB7 /* sx-summary.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "sx-summary.scm"; path = "src/report/standard-reports/sx-summary.scm"; sourceTree = "<group>"; };
 		6EBC07D918B1DDE300A5CEB7 /* stylesheet-footer.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "stylesheet-footer.scm"; path = "src/report/stylesheets/stylesheet-footer.scm"; sourceTree = "<group>"; };
 		6EBC07DA18B1DE0200A5CEB7 /* printf.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = printf.scm; path = src/scm/printf.scm; sourceTree = "<group>"; };
-		6EC70BFC1176DA09006E876C /* gmtime_r.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gmtime_r.c; path = lib/libc/gmtime_r.c; sourceTree = "<group>"; };
-		6EC70BFD1176DA09006E876C /* gmtime_r.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gmtime_r.h; path = lib/libc/gmtime_r.h; sourceTree = "<group>"; };
 		6EC70C011176DB3B006E876C /* escape.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = escape.c; path = src/backend/sql/escape.c; sourceTree = "<group>"; };
 		6EC70C021176DB3B006E876C /* escape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = escape.h; path = src/backend/sql/escape.h; sourceTree = "<group>"; };
 		6EC70C0A1176DC9B006E876C /* binreloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = binreloc.c; path = "src/core-utils/binreloc.c"; sourceTree = "<group>"; };
@@ -1243,6 +1247,21 @@
 		6EE6D28215FDA360008B3F08 /* business-options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "business-options.h"; path = "src/app-utils/business-options.h"; sourceTree = "<group>"; };
 		6EE6D28315FDA360008B3F08 /* business-options.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "business-options.scm"; path = "src/app-utils/business-options.scm"; sourceTree = "<group>"; };
 		6EE6D28415FDA360008B3F08 /* business-prefs.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "business-prefs.scm"; path = "src/app-utils/business-prefs.scm"; sourceTree = "<group>"; };
+		6EECD8661BE965650013E93A /* kvp-scm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "kvp-scm.cpp"; path = "src/engine/kvp-scm.cpp"; sourceTree = "<group>"; };
+		6EECD8671BE965650013E93A /* ScrubBusiness.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ScrubBusiness.c; path = src/engine/ScrubBusiness.c; sourceTree = "<group>"; };
+		6EECD8681BE965650013E93A /* ScrubBusiness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ScrubBusiness.h; path = src/engine/ScrubBusiness.h; sourceTree = "<group>"; };
+		6EECD8691BE965DD0013E93A /* test-gnc-uri-utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-gnc-uri-utils.c"; path = "src/core-utils/test/test-gnc-uri-utils.c"; sourceTree = "<group>"; };
+		6EECD86A1BE965DD0013E93A /* test-resolve-file-path.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "test-resolve-file-path.c"; path = "src/core-utils/test/test-resolve-file-path.c"; sourceTree = "<group>"; };
+		6EECD86B1BE9676A0013E93A /* test-print-queries.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-print-queries.cpp"; path = "src/app-utils/test/test-print-queries.cpp"; sourceTree = "<group>"; };
+		6EECD86C1BE9676A0013E93A /* test-scm-query-string.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-scm-query-string.cpp"; path = "src/app-utils/test/test-scm-query-string.cpp"; sourceTree = "<group>"; };
+		6EECD86D1BE9676A0013E93A /* test-sx.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "test-sx.cpp"; path = "src/app-utils/test/test-sx.cpp"; sourceTree = "<group>"; };
+		6EECD86E1BE9683D0013E93A /* strfmon.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = strfmon.c; path = lib/libc/strfmon.c; sourceTree = "<group>"; };
+		6EECD86F1BE9683D0013E93A /* strfmon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = strfmon.h; path = lib/libc/strfmon.h; sourceTree = "<group>"; };
+		6EECD8701BE968E30013E93A /* assistant-csv-fixed-trans-import.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "assistant-csv-fixed-trans-import.c"; path = "src/import-export/csv-imp/assistant-csv-fixed-trans-import.c"; sourceTree = "<group>"; };
+		6EECD8711BE968E30013E93A /* csv-fixed-trans-import.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "csv-fixed-trans-import.c"; path = "src/import-export/csv-imp/csv-fixed-trans-import.c"; sourceTree = "<group>"; };
+		6EECD8721BE968E30013E93A /* csv-fixed-trans-import.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "csv-fixed-trans-import.h"; path = "src/import-export/csv-imp/csv-fixed-trans-import.h"; sourceTree = "<group>"; };
+		6EECD8731BE968E30013E93A /* gnc-csv-trans-settings.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "gnc-csv-trans-settings.c"; path = "src/import-export/csv-imp/gnc-csv-trans-settings.c"; sourceTree = "<group>"; };
+		6EECD8741BE968E30013E93A /* gnc-csv-trans-settings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gnc-csv-trans-settings.h"; path = "src/import-export/csv-imp/gnc-csv-trans-settings.h"; sourceTree = "<group>"; };
 		6EF6018618137B2100B8E15A /* business-helpers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "business-helpers.c"; path = "src/app-utils/business-helpers.c"; sourceTree = "<group>"; };
 		6EF6018718137B2100B8E15A /* business-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "business-helpers.h"; path = "src/app-utils/business-helpers.h"; sourceTree = "<group>"; };
 		6EF6018918137B7200B8E15A /* gnc-addr-quickfill.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "gnc-addr-quickfill.c"; path = "src/app-utils/gnc-addr-quickfill.c"; sourceTree = "<group>"; };
@@ -1325,31 +1344,19 @@
 		6E7BB1300B955465000B79D4 /* libqof */ = {
 			isa = PBXGroup;
 			children = (
-				6E24BAEB1B6039CC0075D17E /* gtest-gnc-datetime.cpp */,
-				6E24BAEC1B6039CC0075D17E /* gtest-gnc-int128.cpp */,
-				6E24BAED1B6039CC0075D17E /* gtest-gnc-timezone.cpp */,
-				6E24BAEF1B6039CC0075D17E /* test-gnc-date.c */,
-				6E24BAF01B6039CC0075D17E /* test-gnc-guid.cpp */,
-				6E24BAF11B6039CC0075D17E /* test-gnc-numeric.c */,
-				6E24BAF21B6039CC0075D17E /* test-kvp-frame.cpp */,
-				6E24BAF31B6039CC0075D17E /* test-kvp-value.cpp */,
-				6E24BAF41B6039CC0075D17E /* test-qof-string-cache.c */,
-				6E24BAF51B6039CC0075D17E /* test-qof.c */,
-				6E24BAF61B6039CC0075D17E /* test-qofbackend.c */,
-				6E24BAF71B6039CC0075D17E /* test-qofbook.c */,
-				6E24BAF81B6039CC0075D17E /* test-qofinstance.cpp */,
-				6E24BAF91B6039CC0075D17E /* test-qofobject.c */,
-				6E24BAFA1B6039CC0075D17E /* test-qofsession.c */,
 				6E24BAE51B6039840075D17E /* gnc-aqbanking-templates.cpp */,
+				6E97EB721915B9D90021442F /* gnc-date.cpp */,
 				6E24BAE71B6039840075D17E /* gnc-datetime.cpp */,
-				6E24BAE91B6039840075D17E /* gnc-timezone.cpp */,
 				6EB956961A39565A002E3AC5 /* gnc-int128.cpp */,
-				6EB956981A39565A002E3AC5 /* gnc-rational.cpp */,
-				6EB9569B1A39565A002E3AC5 /* kvp-value.cpp */,
-				6E97EB721915B9D90021442F /* gnc-date.cpp */,
 				6E97EB731915B9D90021442F /* gnc-numeric.cpp */,
+				6EB956981A39565A002E3AC5 /* gnc-rational.cpp */,
+				6E24BAE91B6039840075D17E /* gnc-timezone.cpp */,
+				6E24BAEB1B6039CC0075D17E /* gtest-gnc-datetime.cpp */,
+				6E24BAEC1B6039CC0075D17E /* gtest-gnc-int128.cpp */,
+				6E24BAED1B6039CC0075D17E /* gtest-gnc-timezone.cpp */,
 				6E97EB741915B9D90021442F /* guid.cpp */,
 				6E97EB751915B9D90021442F /* kvp_frame.cpp */,
+				6EB9569B1A39565A002E3AC5 /* kvp-value.cpp */,
 				6E97EB771915B9D90021442F /* qof-string-cache.cpp */,
 				6E97EB781915B9D90021442F /* qof-win32.cpp */,
 				6E97EB791915B9D90021442F /* qofbackend.cpp */,
@@ -1365,6 +1372,18 @@
 				6E97EB841915B9D90021442F /* qofquerycore.cpp */,
 				6E97EB851915B9D90021442F /* qofsession.cpp */,
 				6E97EB861915B9D90021442F /* qofutil.cpp */,
+				6E24BAEF1B6039CC0075D17E /* test-gnc-date.c */,
+				6E24BAF01B6039CC0075D17E /* test-gnc-guid.cpp */,
+				6E24BAF11B6039CC0075D17E /* test-gnc-numeric.c */,
+				6E24BAF21B6039CC0075D17E /* test-kvp-frame.cpp */,
+				6E24BAF31B6039CC0075D17E /* test-kvp-value.cpp */,
+				6E24BAF41B6039CC0075D17E /* test-qof-string-cache.c */,
+				6E24BAF51B6039CC0075D17E /* test-qof.c */,
+				6E24BAF61B6039CC0075D17E /* test-qofbackend.c */,
+				6E24BAF71B6039CC0075D17E /* test-qofbook.c */,
+				6E24BAF81B6039CC0075D17E /* test-qofinstance.cpp */,
+				6E24BAF91B6039CC0075D17E /* test-qofobject.c */,
+				6E24BAFA1B6039CC0075D17E /* test-qofsession.c */,
 			);
 			name = libqof;
 			sourceTree = "<group>";
@@ -1372,14 +1391,10 @@
 		6E7BB1310B9554A1000B79D4 /* app-utils */ = {
 			isa = PBXGroup;
 			children = (
-				6E24BADE1B6038EC0075D17E /* fin.c */,
-				6E24BAE11B6039060075D17E /* test-app-utils.c */,
-				6E24BAE21B6039060075D17E /* test-gnc-ui-util.c */,
-				6E24BAE31B6039060075D17E /* test-option-util.cpp */,
-				6E24BAE41B6039060075D17E /* test-print-parse-amount.cpp */,
-				6E24BADB1B6038EC0075D17E /* expression_parser.c */,
 				6EF6018618137B2100B8E15A /* business-helpers.c */,
+				6E24BADB1B6038EC0075D17E /* expression_parser.c */,
 				6E8B750409912C9D003F7E3A /* file-utils.c */,
+				6E24BADE1B6038EC0075D17E /* fin.c */,
 				6E8B751B09912C9D003F7E3A /* gfec.c */,
 				6E8B752009912C9D003F7E3A /* gnc-account-merge.c */,
 				6E8B752309912C9D003F7E3A /* gnc-accounting-period.c */,
@@ -1402,11 +1417,15 @@
 				6E8B76C409912C9F003F7E3A /* option-util.c */,
 				6EF6019418137B7200B8E15A /* QuickFill.c */,
 				6EF6019518137B7200B8E15A /* QuickFill.h */,
+				6E24BAE11B6039060075D17E /* test-app-utils.c */,
 				6E8B772F09912C9F003F7E3A /* test-exp-parser.c */,
+				6E24BAE21B6039060075D17E /* test-gnc-ui-util.c */,
 				6E8B773E09912C9F003F7E3A /* test-link-module.c */,
-				6E8B776809912C9F003F7E3A /* test-print-queries.c */,
-				6E8B777009912C9F003F7E3A /* test-scm-query-string.c */,
-				6E4A803E0F27C4FC0024DAAF /* test-sx.c */,
+				6E24BAE31B6039060075D17E /* test-option-util.cpp */,
+				6E24BAE41B6039060075D17E /* test-print-parse-amount.cpp */,
+				6EECD86B1BE9676A0013E93A /* test-print-queries.cpp */,
+				6EECD86C1BE9676A0013E93A /* test-scm-query-string.cpp */,
+				6EECD86D1BE9676A0013E93A /* test-sx.cpp */,
 			);
 			name = "app-utils";
 			sourceTree = "<group>";
@@ -1537,7 +1556,6 @@
 		6E7BB1350B955574000B79D4 /* core-utils */ = {
 			isa = PBXGroup;
 			children = (
-				6EBC075618B1DA8800A5CEB7 /* assistant-utils.c */,
 				6EBC075818B1DA8800A5CEB7 /* assistant-xml-encoding.c */,
 				6EC70C0A1176DC9B006E876C /* binreloc.c */,
 				6EBC075A18B1DA8800A5CEB7 /* dialog-dup-trans.c */,
@@ -1567,6 +1585,8 @@
 				6EBC077218B1DA8900A5CEB7 /* gnc-tree-view-owner.c */,
 				6EBC077418B1DA8900A5CEB7 /* gnc-tree-view-split-reg.c */,
 				6EC70C121176DC9B006E876C /* gnc-uri-utils.c */,
+				6EECD8691BE965DD0013E93A /* test-gnc-uri-utils.c */,
+				6EECD86A1BE965DD0013E93A /* test-resolve-file-path.c */,
 				6EBC077718B1DA8900A5CEB7 /* tree-view-utils.c */,
 			);
 			name = "core-utils";
@@ -1578,6 +1598,7 @@
 				6E8B74A909912C9D003F7E3A /* Account.c */,
 				6E8B74BC09912C9D003F7E3A /* cap-gains.c */,
 				6E8B74BD09912C9D003F7E3A /* cashobjects.c */,
+				6E0A56DF1BE6D5CB00F028BB /* dummy.cpp */,
 				6E8B74FE09912C9D003F7E3A /* engine-helpers.c */,
 				6E8B751D09912C9D003F7E3A /* glib-helpers.c */,
 				6E8B752B09912C9D003F7E3A /* gnc-budget.c */,
@@ -1604,7 +1625,8 @@
 				6EBC074D18B1D98500A5CEB7 /* gncOwner.c */,
 				6EBC075018B1D98500A5CEB7 /* gncTaxTable.c */,
 				6EBC075318B1D98500A5CEB7 /* gncVendor.c */,
-				6E8B76B809912C9F003F7E3A /* kvp-scm.c */,
+				6E0A56E01BE6D5CB00F028BB /* gtest-import-map.cpp */,
+				6EECD8661BE965650013E93A /* kvp-scm.cpp */,
 				6E8B76C909912C9F003F7E3A /* policy.c */,
 				6E8B76EA09912C9F003F7E3A /* Query.c */,
 				6E8B76F009912C9F003F7E3A /* Recurrence.c */,
@@ -1612,29 +1634,44 @@
 				6E8B76F509912C9F003F7E3A /* Scrub.c */,
 				6E8B76F609912C9F003F7E3A /* Scrub2.c */,
 				6E8B76F709912C9F003F7E3A /* Scrub3.c */,
+				6EECD8671BE965650013E93A /* ScrubBusiness.c */,
 				6EFB257109B038210062574C /* Split.c */,
 				6E8B771309912C9F003F7E3A /* SX-book.c */,
 				6E8B771409912C9F003F7E3A /* SX-ttinfo.c */,
-				6E4A80770F27C9820024DAAF /* test-account-object.c */,
-				6E8B772009912C9F003F7E3A /* test-commodities.c */,
-				6E8B772609912C9F003F7E3A /* test-date.c */,
-				6E8B772D09912C9F003F7E3A /* test-engine-stuff.c */,
-				6E8B773409912C9F003F7E3A /* test-group-vs-book.c */,
-				6E8B773509912C9F003F7E3A /* test-guid.c */,
+				6E0A56E11BE6D5CB00F028BB /* test-account-object.cpp */,
+				6E0A56E21BE6D5CB00F028BB /* test-address.c */,
+				6E0A56E31BE6D5CB00F028BB /* test-business.c */,
+				6E0A56E41BE6D5CB00F028BB /* test-commodities.cpp */,
+				6E0A56E51BE6D5CB00F028BB /* test-customer.c */,
+				6E0A56E61BE6D5CB00F028BB /* test-date.cpp */,
+				6E0A56E71BE6D5CB00F028BB /* test-employee.c */,
+				6E0A56E81BE6D5CB00F028BB /* test-engine-kvp-properties.c */,
+				6E0A56E91BE6D5CB00F028BB /* test-engine.c */,
+				6E0A56EA1BE6D5CB00F028BB /* test-group-vs-book.cpp */,
+				6E0A56EB1BE6D5CB00F028BB /* test-guid.cpp */,
+				6E0A56EC1BE6D5CB00F028BB /* test-job.c */,
 				6E8B774909912C9F003F7E3A /* test-link.c */,
 				6E8B775209912C9F003F7E3A /* test-load-engine.c */,
-				6E8B775609912C9F003F7E3A /* test-lots.c */,
-				6E8B775E09912C9F003F7E3A /* test-numeric.c */,
+				6E0A56ED1BE6D5CB00F028BB /* test-lots.cpp */,
+				6E0A56EE1BE6D5CB00F028BB /* test-numeric.cpp */,
 				6E8B775F09912C9F003F7E3A /* test-object.c */,
-				6E8B776A09912C9F003F7E3A /* test-query.c */,
+				6E0A56EF1BE6D5CB00F028BB /* test-query.cpp */,
 				6E8B776B09912C9F003F7E3A /* test-querynew.c */,
 				6E8B776C09912C9F003F7E3A /* test-recurrence.c */,
-				6E8B777109912C9F003F7E3A /* test-scm-query.c */,
-				6E8B777209912C9F003F7E3A /* test-split-vs-account.c */,
-				6E8B777609912C9F003F7E3A /* test-transaction-reversal.c */,
-				6E8B777709912C9F003F7E3A /* test-transaction-voiding.c */,
+				6E0A56F01BE6D5CB00F028BB /* test-scm-query.cpp */,
+				6E0A56F11BE6D5CB00F028BB /* test-split-vs-account.cpp */,
+				6E0A56F21BE6D5CB00F028BB /* test-transaction-reversal.cpp */,
+				6E0A56F31BE6D5CB00F028BB /* test-transaction-voiding.cpp */,
+				6E0A56F41BE6D5CB00F028BB /* test-vendor.c */,
 				6E93FC1E09CE87FB005BE17C /* Transaction.c */,
 				6E8B778409912C9F003F7E3A /* TransLog.c */,
+				6E0A56F51BE6D5CB00F028BB /* utest-Account.cpp */,
+				6E0A56F61BE6D5CB00F028BB /* utest-Budget.c */,
+				6E0A56F71BE6D5CB00F028BB /* utest-Entry.c */,
+				6E0A56F81BE6D5CB00F028BB /* utest-gnc-pricedb.c */,
+				6E0A56F91BE6D5CB00F028BB /* utest-Invoice.c */,
+				6E0A56FA1BE6D5CB00F028BB /* utest-Split.cpp */,
+				6E0A56FB1BE6D5CB00F028BB /* utest-Transaction.cpp */,
 			);
 			name = engine;
 			sourceTree = "<group>";
@@ -1806,9 +1843,11 @@
 				6EBC077918B1DB4D00A5CEB7 /* assistant-ab-initial.c */,
 				6EBC079C18B1DBAA00A5CEB7 /* assistant-csv-account-import.c */,
 				6EBC079318B1DB7F00A5CEB7 /* assistant-csv-export.c */,
+				6EECD8701BE968E30013E93A /* assistant-csv-fixed-trans-import.c */,
 				6EBC079E18B1DBAA00A5CEB7 /* assistant-csv-trans-import.c */,
 				6EBC07AB18B1DC1500A5CEB7 /* assistant-qif-import.c */,
 				6EBC07A018B1DBAA00A5CEB7 /* csv-account-import.c */,
+				6EECD8711BE968E30013E93A /* csv-fixed-trans-import.c */,
 				6EBC079518B1DB7F00A5CEB7 /* csv-transactions-export.c */,
 				6EBC079718B1DB7F00A5CEB7 /* csv-tree-export.c */,
 				6EBC077B18B1DB4D00A5CEB7 /* dialog-ab-daterange.c */,
@@ -1821,6 +1860,7 @@
 				6EBC078918B1DB4D00A5CEB7 /* gnc-ab-utils.c */,
 				6EBC07A218B1DBAA00A5CEB7 /* gnc-csv-gnumeric-popup.c */,
 				6EBC07A418B1DBAA00A5CEB7 /* gnc-csv-model.c */,
+				6EECD8731BE968E30013E93A /* gnc-csv-trans-settings.c */,
 				6EBC078B18B1DB4D00A5CEB7 /* gnc-file-aqb-import.c */,
 				6EBC078D18B1DB4E00A5CEB7 /* gnc-gwen-gui.c */,
 				6E8B757109912C9D003F7E3A /* gnc-log-replay.c */,
@@ -1941,23 +1981,21 @@
 		6E7BB13E0B955714000B79D4 /* miscellaneous */ = {
 			isa = PBXGroup;
 			children = (
-				6E25551D177D67E80074F7BD /* mainwindow.cpp */,
-				6E25551E177D67E80074F7BD /* mainwindow.hpp */,
 				6E8B74F109912C9D003F7E3A /* doxygen_main_page.c */,
 				6E8B750309912C9D003F7E3A /* fastcgi-hello.c */,
-				6EC70BFC1176DA09006E876C /* gmtime_r.c */,
 				6E8B759D09912C9E003F7E3A /* gnc-server.c */,
 				6E8B75DB09912C9E003F7E3A /* gncmod-tax-us.c */,
 				6E8B75E409912C9E003F7E3A /* gnucash-bin.c */,
-				6E8B768F09912C9F003F7E3A /* guile-strings.c */,
 				6E8B76A009912C9F003F7E3A /* hello.c */,
 				6E8B76A109912C9F003F7E3A /* hello2.c */,
 				6E8B76A209912C9F003F7E3A /* hello3.c */,
 				6E8B76B609912C9F003F7E3A /* iso-4217-currencies.c */,
 				6E8B76BB09912C9F003F7E3A /* libc-missing-noop.c */,
-				6E8B76BD09912C9F003F7E3A /* localtime_r.c */,
+				6E25551D177D67E80074F7BD /* mainwindow.cpp */,
+				6E25551E177D67E80074F7BD /* mainwindow.hpp */,
 				6E8B770309912C9F003F7E3A /* setenv.c */,
 				6E4A800B0F27C0350024DAAF /* stf-parse.c */,
+				6EECD86E1BE9683D0013E93A /* strfmon.c */,
 				6E8B771109912C9F003F7E3A /* strptime.c */,
 				6E8B773F09912C9F003F7E3A /* test-link-module.c */,
 				6E8B777409912C9F003F7E3A /* test-stuff.c */,
@@ -2021,6 +2059,7 @@
 				6E8B79F10991BC42003F7E3A /* Scrub.h */,
 				6E8B79F20991BC42003F7E3A /* Scrub2.h */,
 				6E8B79F30991BC42003F7E3A /* Scrub3.h */,
+				6EECD8681BE965650013E93A /* ScrubBusiness.h */,
 				6E8B79F40991BC42003F7E3A /* ScrubP.h */,
 				6EFB257309B0383B0062574C /* Split.h */,
 				6EFB257409B0383B0062574C /* SplitP.h */,
@@ -2234,13 +2273,12 @@
 		6E7BB1450B9558BF000B79D4 /* miscellaneous */ = {
 			isa = PBXGroup;
 			children = (
-				6E4A800C0F27C0350024DAAF /* stf-parse.h */,
+				6E8B79890991BC41003F7E3A /* guile-mappings.h */,
 				6E4A80060F27C0350024DAAF /* pow.h */,
-				6EC70BFD1176DA09006E876C /* gmtime_r.h */,
-				6E8B79A70991BC42003F7E3A /* localtime_r.h */,
 				6E8B7A000991BC42003F7E3A /* setenv.h */,
+				6E4A800C0F27C0350024DAAF /* stf-parse.h */,
+				6EECD86F1BE9683D0013E93A /* strfmon.h */,
 				6E8B7A0D0991BC42003F7E3A /* strptime.h */,
-				6E8B79890991BC41003F7E3A /* guile-mappings.h */,
 				6E8B7A190991BC42003F7E3A /* test-stuff.h */,
 			);
 			name = miscellaneous;
@@ -2436,6 +2474,7 @@
 				6EBC079F18B1DBAA00A5CEB7 /* assistant-csv-trans-import.h */,
 				6EBC07AC18B1DC1500A5CEB7 /* assistant-qif-import.h */,
 				6EBC07A118B1DBAA00A5CEB7 /* csv-account-import.h */,
+				6EECD8721BE968E30013E93A /* csv-fixed-trans-import.h */,
 				6EBC079618B1DB7F00A5CEB7 /* csv-transactions-export.h */,
 				6EBC079818B1DB7F00A5CEB7 /* csv-tree-export.h */,
 				6EBC077C18B1DB4D00A5CEB7 /* dialog-ab-daterange.h */,
@@ -2444,11 +2483,11 @@
 				6EBC078018B1DB4D00A5CEB7 /* gnc-ab-getbalance.h */,
 				6EBC078218B1DB4D00A5CEB7 /* gnc-ab-gettrans.h */,
 				6EBC078418B1DB4D00A5CEB7 /* gnc-ab-kvp.h */,
-				6EBC078618B1DB4D00A5CEB7 /* gnc-ab-trans-templ.h */,
 				6EBC078818B1DB4D00A5CEB7 /* gnc-ab-transfer.h */,
 				6EBC078A18B1DB4D00A5CEB7 /* gnc-ab-utils.h */,
 				6EBC07A318B1DBAA00A5CEB7 /* gnc-csv-gnumeric-popup.h */,
 				6EBC07A518B1DBAA00A5CEB7 /* gnc-csv-model.h */,
+				6EECD8741BE968E30013E93A /* gnc-csv-trans-settings.h */,
 				6EBC078C18B1DB4E00A5CEB7 /* gnc-file-aqb-import.h */,
 				6EBC078E18B1DB4E00A5CEB7 /* gnc-gwen-gui.h */,
 				6E8B786A0991BC41003F7E3A /* gnc-log-replay.h */,
@@ -2464,7 +2503,6 @@
 				6E8B79900991BC41003F7E3A /* import-backend.h */,
 				6E8B79910991BC41003F7E3A /* import-commodity-matcher.h */,
 				6E8B79920991BC41003F7E3A /* import-main-matcher.h */,
-				6E8B79930991BC42003F7E3A /* import-match-map.h */,
 				6E8B79940991BC42003F7E3A /* import-match-picker.h */,
 				6E8B79950991BC42003F7E3A /* import-parse.h */,
 				6E8B79960991BC42003F7E3A /* import-settings.h */,

commit 60ae86d1785bf3fa73b80c0f43fda1a28bfdedab
Author: Mike Alexander <mta at umich.edu>
Date:   Sun Nov 1 18:10:23 2015 -0500

    Check for a duplicate price in add_price before adding it to the list instead of after.

diff --git a/src/engine/gnc-pricedb.c b/src/engine/gnc-pricedb.c
index 4c28b82..dd48bbd 100644
--- a/src/engine/gnc-pricedb.c
+++ b/src/engine/gnc-pricedb.c
@@ -1109,6 +1109,12 @@ add_price(GNCPriceDB *db, GNCPrice *p)
         return FALSE;
     }
 
+    if (!insert_or_replace_price(db, p))
+    {
+        LEAVE("A better price already exists");
+        return FALSE;
+    }
+
     currency_hash = g_hash_table_lookup(db->commodity_hash, commodity);
     if (!currency_hash)
     {
@@ -1128,11 +1134,6 @@ add_price(GNCPriceDB *db, GNCPrice *p)
         return FALSE;
     }
 
-    if (!insert_or_replace_price(db, p))
-    {
-        LEAVE("A better price already exists");
-        return FALSE;
-    }
     g_hash_table_insert(currency_hash, currency, price_list);
     p->db = db;
     qof_event_gen (&p->inst, QOF_EVENT_ADD, NULL);

commit c7f87f253b6499b787223177c7ae7fd11a77a5da
Author: Mike Alexander <mta at umich.edu>
Date:   Sun Nov 1 17:24:54 2015 -0500

    Don't leak the list returned by pricedb_get_prices_internal.

diff --git a/src/engine/gnc-pricedb.c b/src/engine/gnc-pricedb.c
index 4ab3e02..4c28b82 100644
--- a/src/engine/gnc-pricedb.c
+++ b/src/engine/gnc-pricedb.c
@@ -1489,6 +1489,7 @@ gnc_pricedb_lookup_latest(GNCPriceDB *db,
      * first in the list.  */
     result = price_list->data;
     gnc_price_ref(result);
+    g_list_free (price_list);
     LEAVE(" ");
     return result;
 }
@@ -1818,10 +1819,12 @@ gnc_pricedb_lookup_at_time(GNCPriceDB *db,
         if (timespec_equal(&price_time, &t))
         {
             gnc_price_ref(p);
+            g_list_free (price_list);
             return p;
         }
         item = item->next;
     }
+    g_list_free (price_list);
     LEAVE (" ");
     return NULL;
 }
@@ -1934,6 +1937,7 @@ lookup_nearest_in_time(GNCPriceDB *db,
     }
 
     gnc_price_ref(result);
+    g_list_free (price_list);
     LEAVE (" ");
     return result;
 }
@@ -1975,6 +1979,7 @@ gnc_pricedb_lookup_latest_before (GNCPriceDB *db,
     }
     while (timespec_cmp(&price_time, &t) > 0 && item);
     gnc_price_ref(current_price);
+    g_list_free (price_list);
     LEAVE (" ");
     return current_price;
 }



Summary of changes:
 gnucash.xcodeproj/project.pbxproj | 196 +++++++++++++++++++++++---------------
 src/engine/gnc-pricedb.c          | 171 +++++++++++++++++++++++++++++----
 2 files changed, 271 insertions(+), 96 deletions(-)



More information about the gnucash-changes mailing list