diff --git a/ChangeLog b/ChangeLog index 12568357f0..641f961a16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2006-01-29 Derek Atkins + + * src/business/business-core/file/gnc-bill-term-xml-v2.c: + * src/business/business-core/file/gnc-bill-term-xml-v2.h: + Add a new API to "find-or-create" a billterm so all the + code is collated in one location. + Add more debugging during the scrub phases. + * src/business/business-core/file/gnc-invoice-xml-v2.c: + * src/business/business-core/file/gnc-vendor-xml-v2.c: + * src/business/business-core/file/gnc-customer-xml-v2.c: + Use the new bill-term find-or-create API + * src/business/business-core/gncBillTerm.c: + add some additional debugging + * src/business/business-core/gncBillTerm.h: + The Billterm Type ENUM must start at 1, not zero. The data file + now appears to properly save itself without destroying data. + Fixes rest of #328790. + 2006-01-29 David Hampton * src/gtk-compat.h: diff --git a/src/business/business-core/file/gnc-bill-term-xml-v2.c b/src/business/business-core/file/gnc-bill-term-xml-v2.c index 509173d124..1ce7ee0bc2 100644 --- a/src/business/business-core/file/gnc-bill-term-xml-v2.c +++ b/src/business/business-core/file/gnc-bill-term-xml-v2.c @@ -629,6 +629,10 @@ billterm_scrub_cust (QofEntity * cust_p, gpointer ht_p) count = GPOINTER_TO_INT(g_hash_table_lookup(ht, term)); count++; g_hash_table_insert(ht, term, GINT_TO_POINTER(count)); + if (billterm_is_grandchild(term)) + PWARN("customer %s has grandchild billterm %s\n", + guid_to_string(qof_instance_get_guid(QOF_INSTANCE(cust))), + guid_to_string(qof_instance_get_guid(QOF_INSTANCE(term)))); } } @@ -645,6 +649,10 @@ billterm_scrub_vendor (QofEntity * vendor_p, gpointer ht_p) count = GPOINTER_TO_INT(g_hash_table_lookup(ht, term)); count++; g_hash_table_insert(ht, term, GINT_TO_POINTER(count)); + if (billterm_is_grandchild(term)) + PWARN("vendor %s has grandchild billterm %s\n", + guid_to_string(qof_instance_get_guid(QOF_INSTANCE(vendor))), + guid_to_string(qof_instance_get_guid(QOF_INSTANCE(term)))); } } @@ -670,6 +678,7 @@ billterm_scrub (QofBook *book) GncBillTerm *parent, *term; GHashTable *ht = g_hash_table_new(g_direct_hash, g_direct_equal); + PDEBUG("scrubbing billterms..."); qof_object_foreach (GNC_ID_INVOICE, book, billterm_scrub_invoices, ht); qof_object_foreach (GNC_ID_CUSTOMER, book, billterm_scrub_cust, ht); qof_object_foreach (GNC_ID_VENDOR, book, billterm_scrub_vendor, ht); @@ -679,7 +688,7 @@ billterm_scrub (QofBook *book) for (node = list; node; node = node->next) { term = node->data; - PINFO ("deleting grandchild billterm: %s\n", + PWARN ("deleting grandchild billterm: %s\n", guid_to_string(qof_instance_get_guid(QOF_INSTANCE(term)))); /* Make sure the parent has no children */ @@ -725,3 +734,24 @@ gnc_billterm_xml_initialize (void) GNC_FILE_BACKEND, &be_data); } + +GncBillTerm * +gnc_billterm_xml_find_or_create(QofBook *book, GUID *guid) +{ + GncBillTerm *term; + + g_return_val_if_fail(book, NULL); + g_return_val_if_fail(guid, NULL); + term = gncBillTermLookup(book, guid); + PDEBUG("looking for billterm %s, found %p", guid_to_string(guid), term); + if (!term) { + term = gncBillTermCreate(book); + gncBillTermBeginEdit(term); + gncBillTermSetGUID(term, guid); + gncBillTermCommitEdit(term); + PDEBUG("Created term: %p", term); + } else + gncBillTermDecRef(term); + + return term; +} diff --git a/src/business/business-core/file/gnc-bill-term-xml-v2.h b/src/business/business-core/file/gnc-bill-term-xml-v2.h index b1589ee9e6..8c26b7ef17 100644 --- a/src/business/business-core/file/gnc-bill-term-xml-v2.h +++ b/src/business/business-core/file/gnc-bill-term-xml-v2.h @@ -24,6 +24,8 @@ #ifndef GNC_BILLTERM_XML_V2_H #define GNC_BILLTERM_XML_V2_H +#include "gncBillTerm.h" void gnc_billterm_xml_initialize (void); +GncBillTerm *gnc_billterm_xml_find_or_create(QofBook *book, GUID *guid); #endif /* GNC_BILLTERM_XML_V2_H */ diff --git a/src/business/business-core/file/gnc-customer-xml-v2.c b/src/business/business-core/file/gnc-customer-xml-v2.c index bcdc902d1f..a3861d59c9 100644 --- a/src/business/business-core/file/gnc-customer-xml-v2.c +++ b/src/business/business-core/file/gnc-customer-xml-v2.c @@ -46,6 +46,7 @@ #include "gncTaxTableP.h" #include "gnc-customer-xml-v2.h" #include "gnc-address-xml-v2.h" +#include "gnc-bill-term-xml-v2.h" #include "xml-helpers.h" @@ -230,15 +231,8 @@ customer_terms_handler (xmlNodePtr node, gpointer cust_pdata) guid = dom_tree_to_guid(node); g_return_val_if_fail (guid, FALSE); - term = gncBillTermLookup (pdata->book, guid); - if (!term) { - term = gncBillTermCreate (pdata->book); - gncBillTermBeginEdit (term); - gncBillTermSetGUID (term, guid); - gncBillTermCommitEdit (term); - } else - gncBillTermDecRef (term); - + term = gnc_billterm_xml_find_or_create(pdata->book, guid); + g_assert(term); g_free (guid); gncCustomerSetTerms (pdata->customer, term); diff --git a/src/business/business-core/file/gnc-invoice-xml-v2.c b/src/business/business-core/file/gnc-invoice-xml-v2.c index 501f2f46fb..d9ebd6d561 100644 --- a/src/business/business-core/file/gnc-invoice-xml-v2.c +++ b/src/business/business-core/file/gnc-invoice-xml-v2.c @@ -45,6 +45,7 @@ #include "gncInvoiceP.h" #include "gnc-invoice-xml-v2.h" #include "gnc-owner-xml-v2.h" +#include "gnc-bill-term-xml-v2.h" #define _GNC_MOD_NAME GNC_ID_INVOICE @@ -290,15 +291,8 @@ invoice_terms_handler (xmlNodePtr node, gpointer invoice_pdata) guid = dom_tree_to_guid(node); g_return_val_if_fail (guid, FALSE); - term = gncBillTermLookup (pdata->book, guid); - if (!term) { - term = gncBillTermCreate (pdata->book); - gncBillTermBeginEdit (term); - gncBillTermSetGUID (term, guid); - gncBillTermCommitEdit (term); - } else - gncBillTermDecRef (term); - + term = gnc_billterm_xml_find_or_create(pdata->book, guid); + g_assert(term); g_free (guid); gncInvoiceSetTerms (pdata->invoice, term); diff --git a/src/business/business-core/file/gnc-vendor-xml-v2.c b/src/business/business-core/file/gnc-vendor-xml-v2.c index 5daf0c7c7c..b350f8c1d6 100644 --- a/src/business/business-core/file/gnc-vendor-xml-v2.c +++ b/src/business/business-core/file/gnc-vendor-xml-v2.c @@ -47,6 +47,7 @@ #include "gnc-vendor-xml-v2.h" #include "gnc-address-xml-v2.h" #include "xml-helpers.h" +#include "gnc-bill-term-xml-v2.h" #define _GNC_MOD_NAME GNC_ID_VENDOR @@ -212,15 +213,8 @@ vendor_terms_handler (xmlNodePtr node, gpointer vendor_pdata) guid = dom_tree_to_guid(node); g_return_val_if_fail (guid, FALSE); - term = gncBillTermLookup (pdata->book, guid); - if (!term) { - term = gncBillTermCreate (pdata->book); - gncBillTermBeginEdit (term); - gncBillTermSetGUID (term, guid); - gncBillTermCommitEdit (term); - } else - gncBillTermDecRef (term); - + term = gnc_billterm_xml_find_or_create(pdata->book, guid); + g_assert(term); g_free (guid); gncVendorSetTerms (pdata->vendor, term); diff --git a/src/business/business-core/gncBillTerm.c b/src/business/business-core/gncBillTerm.c index 37bc804da2..99faf83bad 100644 --- a/src/business/business-core/gncBillTerm.c +++ b/src/business/business-core/gncBillTerm.c @@ -148,6 +148,8 @@ GncBillTerm * gncBillTermCreate (QofBook *book) void gncBillTermDestroy (GncBillTerm *term) { if (!term) return; + PDEBUG("destroying bill term %s (%p)", + guid_to_string(qof_instance_get_guid(&term->inst)), term); term->inst.do_free = TRUE; qof_collection_mark_dirty (term->inst.entity.collection); gncBillTermCommitEdit (term); diff --git a/src/business/business-core/gncBillTerm.h b/src/business/business-core/gncBillTerm.h index 9c79baf064..cdd131ded4 100644 --- a/src/business/business-core/gncBillTerm.h +++ b/src/business/business-core/gncBillTerm.h @@ -57,9 +57,10 @@ typedef struct _gncBillTerm GncBillTerm; * How to interpret the amount. * You can interpret it as a VALUE or a PERCENT. * ??? huh? + * NOTE: This enum /depends/ on starting at value 1 */ #define ENUM_TERMS_TYPE(_) \ - _(GNC_TERM_TYPE_DAYS,) \ + _(GNC_TERM_TYPE_DAYS,=1) \ _(GNC_TERM_TYPE_PROXIMO,) DEFINE_ENUM(GncBillTermType, ENUM_TERMS_TYPE)