* engine/gnc-be-utils.h: implement macro helpers for begin/commit functions

* business/business-core/*.c: Implement BeginEdit()/CommitEdit() functions
	  for all the business-accounting data objects.
	* Use the begin/commit calls in the GUI and file-backend.
	* mostly fixes bug #96855.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7431 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins 2002-11-03 20:21:42 +00:00
parent 923006d98b
commit ac574a38eb
38 changed files with 545 additions and 73 deletions

View File

@ -1,3 +1,10 @@
2002-11-03 Derek Atkins <derek@ihtfp.com>
* engine/gnc-be-utils.h: implement macro helpers for begin/commit functions
* business/business-core/*.c: Implement BeginEdit()/CommitEdit() functions
for all the business-accounting data objects.
* Use the begin/commit calls in the GUI and file-backend.
* mostly fixes bug #96855.
2002-11-03 Christian Stimming <stimming@tuhh.de> 2002-11-03 Christian Stimming <stimming@tuhh.de>
* src/gnome/dialog-sxsincelast.c, src/gnome/window-main.c, * src/gnome/dialog-sxsincelast.c, src/gnome/window-main.c,

View File

@ -279,7 +279,9 @@ set_parent_child (xmlNodePtr node, struct billterm_pdata *pdata,
term = gncBillTermLookup (pdata->book, guid); term = gncBillTermLookup (pdata->book, guid);
if (!term) { if (!term) {
term = gncBillTermCreate (pdata->book); term = gncBillTermCreate (pdata->book);
gncBillTermBeginEdit (term);
gncBillTermSetGUID (term, guid); gncBillTermSetGUID (term, guid);
gncBillTermCommitEdit (term);
} }
g_free (guid); g_free (guid);
g_return_val_if_fail (term, FALSE); g_return_val_if_fail (term, FALSE);
@ -312,6 +314,7 @@ billterm_guid_handler (xmlNodePtr node, gpointer billterm_pdata)
if (term) { if (term) {
gncBillTermDestroy (pdata->term); gncBillTermDestroy (pdata->term);
pdata->term = term; pdata->term = term;
gncBillTermBeginEdit (term);
} else { } else {
gncBillTermSetGUID(pdata->term, guid); gncBillTermSetGUID(pdata->term, guid);
} }
@ -417,12 +420,14 @@ dom_tree_to_billterm (xmlNodePtr node, GNCBook *book)
billterm_pdata.term = gncBillTermCreate (book); billterm_pdata.term = gncBillTermCreate (book);
billterm_pdata.book = book; billterm_pdata.book = book;
gncBillTermBeginEdit (billterm_pdata.term);
successful = dom_tree_generic_parse (node, billterm_handlers_v2, successful = dom_tree_generic_parse (node, billterm_handlers_v2,
&billterm_pdata); &billterm_pdata);
gncBillTermCommitEdit (billterm_pdata.term);
if (!successful) { if (successful)
gncBillTermCommitEdit (billterm_pdata.term);
else {
PERR ("failed to parse billing term tree"); PERR ("failed to parse billing term tree");
gncBillTermDestroy (billterm_pdata.term); gncBillTermDestroy (billterm_pdata.term);
billterm_pdata.term = NULL; billterm_pdata.term = NULL;

View File

@ -198,6 +198,7 @@ customer_guid_handler (xmlNodePtr node, gpointer cust_pdata)
if (cust) { if (cust) {
gncCustomerDestroy (pdata->customer); gncCustomerDestroy (pdata->customer);
pdata->customer = cust; pdata->customer = cust;
gncCustomerBeginEdit (cust);
} else { } else {
gncCustomerSetGUID(pdata->customer, guid); gncCustomerSetGUID(pdata->customer, guid);
} }
@ -235,7 +236,9 @@ customer_terms_handler (xmlNodePtr node, gpointer cust_pdata)
term = gncBillTermLookup (pdata->book, guid); term = gncBillTermLookup (pdata->book, guid);
if (!term) { if (!term) {
term = gncBillTermCreate (pdata->book); term = gncBillTermCreate (pdata->book);
gncBillTermBeginEdit (term);
gncBillTermSetGUID (term, guid); gncBillTermSetGUID (term, guid);
gncBillTermCommitEdit (term);
} else } else
gncBillTermDecRef (term); gncBillTermDecRef (term);
@ -346,7 +349,9 @@ customer_taxtable_handler (xmlNodePtr node, gpointer cust_pdata)
taxtable = gncTaxTableLookup (pdata->book, guid); taxtable = gncTaxTableLookup (pdata->book, guid);
if (!taxtable) { if (!taxtable) {
taxtable = gncTaxTableCreate (pdata->book); taxtable = gncTaxTableCreate (pdata->book);
gncTaxTableBeginEdit (taxtable);
gncTaxTableSetGUID (taxtable, guid); gncTaxTableSetGUID (taxtable, guid);
gncTaxTableCommitEdit (taxtable);
} else } else
gncTaxTableDecRef (taxtable); gncTaxTableDecRef (taxtable);
@ -388,12 +393,14 @@ dom_tree_to_customer (xmlNodePtr node, GNCBook *book)
cust_pdata.customer = gncCustomerCreate(book); cust_pdata.customer = gncCustomerCreate(book);
cust_pdata.book = book; cust_pdata.book = book;
gncCustomerBeginEdit (cust_pdata.customer);
successful = dom_tree_generic_parse (node, customer_handlers_v2, successful = dom_tree_generic_parse (node, customer_handlers_v2,
&cust_pdata); &cust_pdata);
gncCustomerCommitEdit (cust_pdata.customer);
if (!successful) if (successful)
gncCustomerCommitEdit (cust_pdata.customer);
else
{ {
PERR ("failed to parse customer tree"); PERR ("failed to parse customer tree");
gncCustomerDestroy (cust_pdata.customer); gncCustomerDestroy (cust_pdata.customer);

View File

@ -160,6 +160,7 @@ employee_guid_handler (xmlNodePtr node, gpointer employee_pdata)
if (employee) { if (employee) {
gncEmployeeDestroy (pdata->employee); gncEmployeeDestroy (pdata->employee);
pdata->employee = employee; pdata->employee = employee;
gncEmployeeBeginEdit (employee);
} else { } else {
gncEmployeeSetGUID(pdata->employee, guid); gncEmployeeSetGUID(pdata->employee, guid);
} }
@ -279,12 +280,13 @@ dom_tree_to_employee (xmlNodePtr node, GNCBook *book)
employee_pdata.employee = gncEmployeeCreate(book); employee_pdata.employee = gncEmployeeCreate(book);
employee_pdata.book = book; employee_pdata.book = book;
gncEmployeeBeginEdit (employee_pdata.employee);
successful = dom_tree_generic_parse (node, employee_handlers_v2, successful = dom_tree_generic_parse (node, employee_handlers_v2,
&employee_pdata); &employee_pdata);
if (successful)
gncEmployeeCommitEdit (employee_pdata.employee); gncEmployeeCommitEdit (employee_pdata.employee);
else
if (!successful)
{ {
PERR ("failed to parse employee tree"); PERR ("failed to parse employee tree");
gncEmployeeDestroy (employee_pdata.employee); gncEmployeeDestroy (employee_pdata.employee);

View File

@ -298,7 +298,9 @@ set_taxtable (xmlNodePtr node, struct entry_pdata *pdata,
taxtable = gncTaxTableLookup (pdata->book, guid); taxtable = gncTaxTableLookup (pdata->book, guid);
if (!taxtable) { if (!taxtable) {
taxtable = gncTaxTableCreate (pdata->book); taxtable = gncTaxTableCreate (pdata->book);
gncTaxTableBeginEdit (taxtable);
gncTaxTableSetGUID (taxtable, guid); gncTaxTableSetGUID (taxtable, guid);
gncTaxTableCommitEdit (taxtable);
} else } else
gncTaxTableDecRef (taxtable); gncTaxTableDecRef (taxtable);
@ -320,6 +322,7 @@ entry_guid_handler (xmlNodePtr node, gpointer entry_pdata)
if (entry) { if (entry) {
gncEntryDestroy (pdata->entry); gncEntryDestroy (pdata->entry);
pdata->entry = entry; pdata->entry = entry;
gncEntryBeginEdit (entry);
} else { } else {
gncEntrySetGUID(pdata->entry, guid); gncEntrySetGUID(pdata->entry, guid);
} }
@ -536,8 +539,11 @@ entry_order_handler (xmlNodePtr node, gpointer entry_pdata)
order = gncOrderLookup (pdata->book, guid); order = gncOrderLookup (pdata->book, guid);
if (!order) { if (!order) {
order = gncOrderCreate (pdata->book); order = gncOrderCreate (pdata->book);
gncOrderBeginEdit (order);
gncOrderSetGUID (order, guid); gncOrderSetGUID (order, guid);
gncOrderCommitEdit (order);
} }
gncOrderBeginEdit (order);
gncOrderAddEntry (order, pdata->entry); gncOrderAddEntry (order, pdata->entry);
gncOrderCommitEdit (order); gncOrderCommitEdit (order);
@ -557,8 +563,11 @@ entry_invoice_handler (xmlNodePtr node, gpointer entry_pdata)
invoice = gncInvoiceLookup (pdata->book, guid); invoice = gncInvoiceLookup (pdata->book, guid);
if (!invoice) { if (!invoice) {
invoice = gncInvoiceCreate (pdata->book); invoice = gncInvoiceCreate (pdata->book);
gncInvoiceBeginEdit (invoice);
gncInvoiceSetGUID (invoice, guid); gncInvoiceSetGUID (invoice, guid);
gncInvoiceCommitEdit (invoice);
} }
gncInvoiceBeginEdit (invoice);
gncInvoiceAddEntry (invoice, pdata->entry); gncInvoiceAddEntry (invoice, pdata->entry);
gncInvoiceCommitEdit (invoice); gncInvoiceCommitEdit (invoice);
@ -578,8 +587,11 @@ entry_bill_handler (xmlNodePtr node, gpointer entry_pdata)
invoice = gncInvoiceLookup (pdata->book, guid); invoice = gncInvoiceLookup (pdata->book, guid);
if (!invoice) { if (!invoice) {
invoice = gncInvoiceCreate (pdata->book); invoice = gncInvoiceCreate (pdata->book);
gncInvoiceBeginEdit (invoice);
gncInvoiceSetGUID (invoice, guid); gncInvoiceSetGUID (invoice, guid);
gncInvoiceCommitEdit (invoice);
} }
gncInvoiceBeginEdit (invoice);
gncBillAddEntry (invoice, pdata->entry); gncBillAddEntry (invoice, pdata->entry);
gncInvoiceCommitEdit (invoice); gncInvoiceCommitEdit (invoice);
@ -667,6 +679,7 @@ dom_tree_to_entry (xmlNodePtr node, GNCBook *book)
entry_pdata.entry = gncEntryCreate(book); entry_pdata.entry = gncEntryCreate(book);
entry_pdata.book = book; entry_pdata.book = book;
entry_pdata.acc = NULL; entry_pdata.acc = NULL;
gncEntryBeginEdit (entry_pdata.entry);
successful = dom_tree_generic_parse (node, entry_handlers_v2, successful = dom_tree_generic_parse (node, entry_handlers_v2,
&entry_pdata); &entry_pdata);
@ -676,9 +689,10 @@ dom_tree_to_entry (xmlNodePtr node, GNCBook *book)
else else
gncEntrySetInvAccount (entry_pdata.entry, entry_pdata.acc); gncEntrySetInvAccount (entry_pdata.entry, entry_pdata.acc);
} }
gncEntryCommitEdit (entry_pdata.entry);
if (!successful) if (successful)
gncEntryCommitEdit (entry_pdata.entry);
else
{ {
PERR ("failed to parse entry tree"); PERR ("failed to parse entry tree");
gncEntryDestroy (entry_pdata.entry); gncEntryDestroy (entry_pdata.entry);

View File

@ -201,6 +201,7 @@ invoice_guid_handler (xmlNodePtr node, gpointer invoice_pdata)
if (invoice) { if (invoice) {
gncInvoiceDestroy (pdata->invoice); gncInvoiceDestroy (pdata->invoice);
pdata->invoice = invoice; pdata->invoice = invoice;
gncInvoiceBeginEdit (invoice);
} else { } else {
gncInvoiceSetGUID(pdata->invoice, guid); gncInvoiceSetGUID(pdata->invoice, guid);
} }
@ -290,7 +291,9 @@ invoice_terms_handler (xmlNodePtr node, gpointer invoice_pdata)
term = gncBillTermLookup (pdata->book, guid); term = gncBillTermLookup (pdata->book, guid);
if (!term) { if (!term) {
term = gncBillTermCreate (pdata->book); term = gncBillTermCreate (pdata->book);
gncBillTermBeginEdit (term);
gncBillTermSetGUID (term, guid); gncBillTermSetGUID (term, guid);
gncBillTermCommitEdit (term);
} else } else
gncBillTermDecRef (term); gncBillTermDecRef (term);
@ -405,12 +408,14 @@ dom_tree_to_invoice (xmlNodePtr node, GNCBook *book)
invoice_pdata.invoice = gncInvoiceCreate(book); invoice_pdata.invoice = gncInvoiceCreate(book);
invoice_pdata.book = book; invoice_pdata.book = book;
gncInvoiceBeginEdit (invoice_pdata.invoice);
successful = dom_tree_generic_parse (node, invoice_handlers_v2, successful = dom_tree_generic_parse (node, invoice_handlers_v2,
&invoice_pdata); &invoice_pdata);
gncInvoiceCommitEdit (invoice_pdata.invoice);
if (!successful) if (successful)
gncInvoiceCommitEdit (invoice_pdata.invoice);
else
{ {
PERR ("failed to parse invoice tree"); PERR ("failed to parse invoice tree");
gncInvoiceDestroy (invoice_pdata.invoice); gncInvoiceDestroy (invoice_pdata.invoice);

View File

@ -141,6 +141,7 @@ job_guid_handler (xmlNodePtr node, gpointer job_pdata)
if (job) { if (job) {
gncJobDestroy (pdata->job); gncJobDestroy (pdata->job);
pdata->job = job; pdata->job = job;
gncJobBeginEdit (job);
} else { } else {
gncJobSetGUID(pdata->job, guid); gncJobSetGUID(pdata->job, guid);
} }
@ -212,12 +213,14 @@ dom_tree_to_job (xmlNodePtr node, GNCBook *book)
job_pdata.job = gncJobCreate(book); job_pdata.job = gncJobCreate(book);
job_pdata.book = book; job_pdata.book = book;
gncJobBeginEdit (job_pdata.job);
successful = dom_tree_generic_parse (node, job_handlers_v2, successful = dom_tree_generic_parse (node, job_handlers_v2,
&job_pdata); &job_pdata);
gncJobCommitEdit (job_pdata.job);
if (!successful) if (successful)
gncJobCommitEdit (job_pdata.job);
else
{ {
PERR ("failed to parse job tree"); PERR ("failed to parse job tree");
gncJobDestroy (job_pdata.job); gncJobDestroy (job_pdata.job);

View File

@ -153,6 +153,7 @@ order_guid_handler (xmlNodePtr node, gpointer order_pdata)
if (order) { if (order) {
gncOrderDestroy (pdata->order); gncOrderDestroy (pdata->order);
pdata->order = order; pdata->order = order;
gncOrderBeginEdit (order);
} else { } else {
gncOrderSetGUID(pdata->order, guid); gncOrderSetGUID(pdata->order, guid);
} }
@ -250,12 +251,14 @@ dom_tree_to_order (xmlNodePtr node, GNCBook *book)
order_pdata.order = gncOrderCreate(book); order_pdata.order = gncOrderCreate(book);
order_pdata.book = book; order_pdata.book = book;
gncOrderBeginEdit (order_pdata.order);
successful = dom_tree_generic_parse (node, order_handlers_v2, successful = dom_tree_generic_parse (node, order_handlers_v2,
&order_pdata); &order_pdata);
gncOrderCommitEdit (order_pdata.order);
if (!successful) if (successful)
gncOrderCommitEdit (order_pdata.order);
else
{ {
PERR ("failed to parse order tree"); PERR ("failed to parse order tree");
gncOrderDestroy (order_pdata.order); gncOrderDestroy (order_pdata.order);

View File

@ -234,7 +234,9 @@ set_parent_child (xmlNodePtr node, struct taxtable_pdata *pdata,
table = gncTaxTableLookup (pdata->book, guid); table = gncTaxTableLookup (pdata->book, guid);
if (!table) { if (!table) {
table = gncTaxTableCreate (pdata->book); table = gncTaxTableCreate (pdata->book);
gncTaxTableBeginEdit (table);
gncTaxTableSetGUID (table, guid); gncTaxTableSetGUID (table, guid);
gncTaxTableCommitEdit (table);
} }
g_free (guid); g_free (guid);
g_return_val_if_fail (table, FALSE); g_return_val_if_fail (table, FALSE);
@ -256,6 +258,7 @@ taxtable_guid_handler (xmlNodePtr node, gpointer taxtable_pdata)
if (table) { if (table) {
gncTaxTableDestroy (pdata->table); gncTaxTableDestroy (pdata->table);
pdata->table = table; pdata->table = table;
gncTaxTableBeginEdit (table);
} else { } else {
gncTaxTableSetGUID(pdata->table, guid); gncTaxTableSetGUID(pdata->table, guid);
} }
@ -362,12 +365,15 @@ dom_tree_to_taxtable (xmlNodePtr node, GNCBook *book)
taxtable_pdata.table = gncTaxTableCreate (book); taxtable_pdata.table = gncTaxTableCreate (book);
taxtable_pdata.book = book; taxtable_pdata.book = book;
gncTaxTableBeginEdit (taxtable_pdata.table);
successful = dom_tree_generic_parse (node, taxtable_handlers_v2, successful = dom_tree_generic_parse (node, taxtable_handlers_v2,
&taxtable_pdata); &taxtable_pdata);
gncTaxTableCommitEdit (taxtable_pdata.table);
if (!successful) { if (successful)
gncTaxTableCommitEdit (taxtable_pdata.table);
else
{
PERR ("failed to parse tax table tree"); PERR ("failed to parse tax table tree");
gncTaxTableDestroy (taxtable_pdata.table); gncTaxTableDestroy (taxtable_pdata.table);
taxtable_pdata.table = NULL; taxtable_pdata.table = NULL;

View File

@ -185,6 +185,7 @@ vendor_guid_handler (xmlNodePtr node, gpointer vendor_pdata)
if (vendor) { if (vendor) {
gncVendorDestroy (pdata->vendor); gncVendorDestroy (pdata->vendor);
pdata->vendor = vendor; pdata->vendor = vendor;
gncVendorBeginEdit (vendor);
} else { } else {
gncVendorSetGUID(pdata->vendor, guid); gncVendorSetGUID(pdata->vendor, guid);
} }
@ -222,7 +223,9 @@ vendor_terms_handler (xmlNodePtr node, gpointer vendor_pdata)
term = gncBillTermLookup (pdata->book, guid); term = gncBillTermLookup (pdata->book, guid);
if (!term) { if (!term) {
term = gncBillTermCreate (pdata->book); term = gncBillTermCreate (pdata->book);
gncBillTermBeginEdit (term);
gncBillTermSetGUID (term, guid); gncBillTermSetGUID (term, guid);
gncBillTermCommitEdit (term);
} else } else
gncBillTermDecRef (term); gncBillTermDecRef (term);
@ -293,7 +296,9 @@ vendor_taxtable_handler (xmlNodePtr node, gpointer vendor_pdata)
taxtable = gncTaxTableLookup (pdata->book, guid); taxtable = gncTaxTableLookup (pdata->book, guid);
if (!taxtable) { if (!taxtable) {
taxtable = gncTaxTableCreate (pdata->book); taxtable = gncTaxTableCreate (pdata->book);
gncTaxTableBeginEdit (taxtable);
gncTaxTableSetGUID (taxtable, guid); gncTaxTableSetGUID (taxtable, guid);
gncTaxTableCommitEdit (taxtable);
} else } else
gncTaxTableDecRef (taxtable); gncTaxTableDecRef (taxtable);
@ -332,12 +337,14 @@ dom_tree_to_vendor (xmlNodePtr node, GNCBook *book)
vendor_pdata.vendor = gncVendorCreate(book); vendor_pdata.vendor = gncVendorCreate(book);
vendor_pdata.book = book; vendor_pdata.book = book;
gncVendorBeginEdit (vendor_pdata.vendor);
successful = dom_tree_generic_parse (node, vendor_handlers_v2, successful = dom_tree_generic_parse (node, vendor_handlers_v2,
&vendor_pdata); &vendor_pdata);
gncVendorCommitEdit (vendor_pdata.vendor);
if (!successful) if (successful)
gncVendorCommitEdit (vendor_pdata.vendor);
else
{ {
PERR ("failed to parse vendor tree"); PERR ("failed to parse vendor tree");
gncVendorDestroy (vendor_pdata.vendor); gncVendorDestroy (vendor_pdata.vendor);

View File

@ -15,6 +15,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncBillTermP.h" #include "gncBillTermP.h"
@ -35,6 +36,10 @@ struct _gncBillTerm {
GncBillTerm * parent; /* if non-null, we are an immutable child */ GncBillTerm * parent; /* if non-null, we are an immutable child */
GncBillTerm * child; /* if non-null, we have not changed */ GncBillTerm * child; /* if non-null, we have not changed */
gboolean invisible; gboolean invisible;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
@ -43,6 +48,8 @@ struct _book_info {
GList * terms; /* visible terms */ GList * terms; /* visible terms */
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_BILLTERM_MODULE_NAME #define _GNC_MOD_NAME GNC_BILLTERM_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -67,6 +74,7 @@ G_INLINE_FUNC void
mark_term (GncBillTerm *term) mark_term (GncBillTerm *term)
{ {
term->dirty = TRUE; term->dirty = TRUE;
gncBusinessSetDirtyFlag (term->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&term->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&term->guid, GNC_EVENT_MODIFY);
} }
@ -89,6 +97,13 @@ GncBillTerm * gncBillTermCreate (GNCBook *book)
} }
void gncBillTermDestroy (GncBillTerm *term) void gncBillTermDestroy (GncBillTerm *term)
{
if (!term) return;
term->do_free = TRUE;
gncBillTermCommitEdit (term);
}
static void gncBillTermFree (GncBillTerm *term)
{ {
if (!term) return; if (!term) return;
@ -215,16 +230,27 @@ void gncBillTermChanged (GncBillTerm *term)
term->child = NULL; term->child = NULL;
} }
void gncBillTermCommitEdit (GncBillTerm *term) void gncBillTermBeginEdit (GncBillTerm *term)
{ {
if (!term) return; GNC_BEGIN_EDIT (term, _GNC_MOD_NAME);
}
/* XXX Commit to DB */ static void gncBillTermOnError (GncBillTerm *term, GNCBackendError errcode)
if (term->dirty) {
gncBusinessSetDirtyFlag (term->book, _GNC_MOD_NAME, TRUE); PERR("BillTerm Backend Failure: %d", errcode);
}
static void gncBillTermOnDone (GncBillTerm *term)
{
term->dirty = FALSE; term->dirty = FALSE;
} }
void gncBillTermCommitEdit (GncBillTerm *term)
{
GNC_COMMIT_EDIT_PART1 (term);
GNC_COMMIT_EDIT_PART2 (term, _GNC_MOD_NAME, gncBillTermOnError,
gncBillTermOnDone, gncBillTermFree);
}
/* Get Functions */ /* Get Functions */
GncBillTerm * gncBillTermLookup (GNCBook *book, const GUID *guid) GncBillTerm * gncBillTermLookup (GNCBook *book, const GUID *guid)

View File

@ -41,6 +41,7 @@ void gncBillTermIncRef (GncBillTerm *term);
void gncBillTermDecRef (GncBillTerm *term); void gncBillTermDecRef (GncBillTerm *term);
void gncBillTermChanged (GncBillTerm *term); void gncBillTermChanged (GncBillTerm *term);
void gncBillTermBeginEdit (GncBillTerm *term);
void gncBillTermCommitEdit (GncBillTerm *term); void gncBillTermCommitEdit (GncBillTerm *term);
/* Get Functions */ /* Get Functions */

View File

@ -17,6 +17,7 @@
#include "gncObject.h" #include "gncObject.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncCustomer.h" #include "gncCustomer.h"
@ -39,11 +40,16 @@ struct _gncCustomer {
gboolean active; gboolean active;
GList * jobs; GList * jobs;
int editlevel;
gboolean do_free;
GncTaxTable* taxtable; GncTaxTable* taxtable;
gboolean taxtable_override; gboolean taxtable_override;
gboolean dirty; gboolean dirty;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_CUSTOMER_MODULE_NAME #define _GNC_MOD_NAME GNC_CUSTOMER_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -57,6 +63,7 @@ G_INLINE_FUNC void
mark_customer (GncCustomer *customer) mark_customer (GncCustomer *customer)
{ {
customer->dirty = TRUE; customer->dirty = TRUE;
gncBusinessSetDirtyFlag (customer->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&customer->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&customer->guid, GNC_EVENT_MODIFY);
} }
@ -92,6 +99,13 @@ GncCustomer *gncCustomerCreate (GNCBook *book)
} }
void gncCustomerDestroy (GncCustomer *cust) void gncCustomerDestroy (GncCustomer *cust)
{
if (!cust) return;
cust->do_free = TRUE;
gncCustomerCommitEdit (cust);
}
static void gncCustomerFree (GncCustomer *cust)
{ {
if (!cust) return; if (!cust) return;
@ -256,18 +270,30 @@ void gncCustomerRemoveJob (GncCustomer *cust, GncJob *job)
gnc_engine_generate_event (&cust->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&cust->guid, GNC_EVENT_MODIFY);
} }
void gncCustomerCommitEdit (GncCustomer *cust) void gncCustomerBeginEdit (GncCustomer *cust)
{ {
if (!cust) return; GNC_BEGIN_EDIT (cust, _GNC_MOD_NAME);
}
/* XXX COMMIT TO DATABASE */ static void gncCustomerOnError (GncCustomer *cust, GNCBackendError errcode)
if (gncCustomerIsDirty (cust)) {
gncBusinessSetDirtyFlag (cust->book, _GNC_MOD_NAME, TRUE); PERR("Customer Backend Failure: %d", errcode);
}
static void gncCustomerOnDone (GncCustomer *cust)
{
cust->dirty = FALSE; cust->dirty = FALSE;
gncAddressClearDirty (cust->addr); gncAddressClearDirty (cust->addr);
gncAddressClearDirty (cust->shipaddr); gncAddressClearDirty (cust->shipaddr);
} }
void gncCustomerCommitEdit (GncCustomer *cust)
{
GNC_COMMIT_EDIT_PART1 (cust);
GNC_COMMIT_EDIT_PART2 (cust, _GNC_MOD_NAME, gncCustomerOnError,
gncCustomerOnDone, gncCustomerFree);
}
/* Get Functions */ /* Get Functions */
GNCBook * gncCustomerGetBook (GncCustomer *cust) GNCBook * gncCustomerGetBook (GncCustomer *cust)

View File

@ -42,6 +42,7 @@ void gncCustomerSetTaxTable (GncCustomer *customer, GncTaxTable *table);
void gncCustomerAddJob (GncCustomer *customer, GncJob *job); void gncCustomerAddJob (GncCustomer *customer, GncJob *job);
void gncCustomerRemoveJob (GncCustomer *customer, GncJob *job); void gncCustomerRemoveJob (GncCustomer *customer, GncJob *job);
void gncCustomerBeginEdit (GncCustomer *customer);
void gncCustomerCommitEdit (GncCustomer *customer); void gncCustomerCommitEdit (GncCustomer *customer);
/* Get Functions */ /* Get Functions */

View File

@ -17,6 +17,7 @@
#include "gncObject.h" #include "gncObject.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncEmployee.h" #include "gncEmployee.h"
@ -36,8 +37,13 @@ struct _gncEmployee {
gnc_numeric rate; gnc_numeric rate;
gboolean active; gboolean active;
gboolean dirty; gboolean dirty;
int editlevel;
gboolean do_free;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_EMPLOYEE_MODULE_NAME #define _GNC_MOD_NAME GNC_EMPLOYEE_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -51,6 +57,7 @@ G_INLINE_FUNC void
mark_employee (GncEmployee *employee) mark_employee (GncEmployee *employee)
{ {
employee->dirty = TRUE; employee->dirty = TRUE;
gncBusinessSetDirtyFlag (employee->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&employee->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&employee->guid, GNC_EVENT_MODIFY);
} }
@ -85,6 +92,13 @@ GncEmployee *gncEmployeeCreate (GNCBook *book)
} }
void gncEmployeeDestroy (GncEmployee *employee) void gncEmployeeDestroy (GncEmployee *employee)
{
if (!employee) return;
employee->do_free = TRUE;
gncEmployeeCommitEdit(employee);
}
static void gncEmployeeFree (GncEmployee *employee)
{ {
if (!employee) return; if (!employee) return;
@ -267,17 +281,29 @@ gboolean gncEmployeeIsDirty (GncEmployee *employee)
return (employee->dirty || gncAddressIsDirty (employee->addr)); return (employee->dirty || gncAddressIsDirty (employee->addr));
} }
void gncEmployeeCommitEdit (GncEmployee *employee) void gncEmployeeBeginEdit (GncEmployee *employee)
{ {
if (!employee) return; GNC_BEGIN_EDIT (employee, _GNC_MOD_NAME);
}
/* XXX COMMIT TO DATABASE */ static void gncEmployeeOnError (GncEmployee *employee, GNCBackendError errcode)
if (gncEmployeeIsDirty (employee)) {
gncBusinessSetDirtyFlag (employee->book, _GNC_MOD_NAME, TRUE); PERR("Employee Backend Failure: %d", errcode);
}
static void gncEmployeeOnDone (GncEmployee *employee)
{
employee->dirty = FALSE; employee->dirty = FALSE;
gncAddressClearDirty (employee->addr); gncAddressClearDirty (employee->addr);
} }
void gncEmployeeCommitEdit (GncEmployee *employee)
{
GNC_COMMIT_EDIT_PART1 (employee);
GNC_COMMIT_EDIT_PART2 (employee, _GNC_MOD_NAME, gncEmployeeOnError,
gncEmployeeOnDone, gncEmployeeFree);
}
/* Other functions */ /* Other functions */
int gncEmployeeCompare (GncEmployee *a, GncEmployee *b) int gncEmployeeCompare (GncEmployee *a, GncEmployee *b)

View File

@ -47,6 +47,7 @@ gboolean gncEmployeeGetActive (GncEmployee *employee);
GncEmployee * gncEmployeeLookup (GNCBook *book, const GUID *guid); GncEmployee * gncEmployeeLookup (GNCBook *book, const GUID *guid);
gboolean gncEmployeeIsDirty (GncEmployee *employee); gboolean gncEmployeeIsDirty (GncEmployee *employee);
void gncEmployeeBeginEdit (GncEmployee *employee);
void gncEmployeeCommitEdit (GncEmployee *employee); void gncEmployeeCommitEdit (GncEmployee *employee);
int gncEmployeeCompare (GncEmployee *a, GncEmployee *b); int gncEmployeeCompare (GncEmployee *a, GncEmployee *b);

View File

@ -15,6 +15,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncEntry.h" #include "gncEntry.h"
@ -56,6 +57,8 @@ struct _gncEntry {
GncInvoice * invoice; GncInvoice * invoice;
GncInvoice * bill; GncInvoice * bill;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
/* CACHED VALUES */ /* CACHED VALUES */
@ -81,6 +84,8 @@ struct _gncEntry {
Timespec b_taxtable_modtime; Timespec b_taxtable_modtime;
}; };
static short module = MOD_BUSINESS;
/* You must edit the functions in this block in tandem. KEEP THEM IN /* You must edit the functions in this block in tandem. KEEP THEM IN
SYNC! */ SYNC! */
@ -136,6 +141,7 @@ G_INLINE_FUNC void
mark_entry (GncEntry *entry) mark_entry (GncEntry *entry)
{ {
entry->dirty = TRUE; entry->dirty = TRUE;
gncBusinessSetDirtyFlag (entry->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&entry->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&entry->guid, GNC_EVENT_MODIFY);
} }
@ -178,6 +184,13 @@ GncEntry *gncEntryCreate (GNCBook *book)
} }
void gncEntryDestroy (GncEntry *entry) void gncEntryDestroy (GncEntry *entry)
{
if (!entry) return;
entry->do_free = TRUE;
gncEntryCommitEdit(entry);
}
static void gncEntryFree (GncEntry *entry)
{ {
if (!entry) return; if (!entry) return;
@ -984,13 +997,32 @@ gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry, gboolean is_inv)
return (is_inv ? entry->i_disc_value_rounded : gnc_numeric_zero()); return (is_inv ? entry->i_disc_value_rounded : gnc_numeric_zero());
} }
gboolean gncEntryIsOpen (GncEntry *entry)
{
if (!entry) return FALSE;
return (entry->editlevel > 0);
}
void gncEntryBeginEdit (GncEntry *entry)
{
GNC_BEGIN_EDIT (entry, _GNC_MOD_NAME);
}
static void gncEntryOnError (GncEntry *entry, GNCBackendError errcode)
{
PERR("Entry Backend Failure: %d", errcode);
}
static void gncEntryOnDone (GncEntry *entry)
{
entry->dirty = FALSE;
}
void gncEntryCommitEdit (GncEntry *entry) void gncEntryCommitEdit (GncEntry *entry)
{ {
if (!entry) return; GNC_COMMIT_EDIT_PART1 (entry);
/* XXX */ GNC_COMMIT_EDIT_PART2 (entry, _GNC_MOD_NAME, gncEntryOnError,
if (entry->dirty) gncEntryOnDone, gncEntryFree);
gncBusinessSetDirtyFlag (entry->book, _GNC_MOD_NAME, TRUE);
entry->dirty = FALSE;
} }
int gncEntryCompare (GncEntry *a, GncEntry *b) int gncEntryCompare (GncEntry *a, GncEntry *b)

View File

@ -138,6 +138,8 @@ GncInvoice * gncEntryGetBill (GncEntry *entry);
GncEntry * gncEntryLookup (GNCBook *book, const GUID *guid); GncEntry * gncEntryLookup (GNCBook *book, const GUID *guid);
gboolean gncEntryIsOpen (GncEntry *entry);
void gncEntryBeginEdit (GncEntry *entry);
void gncEntryCommitEdit (GncEntry *entry); void gncEntryCommitEdit (GncEntry *entry);
int gncEntryCompare (GncEntry *a, GncEntry *b); int gncEntryCompare (GncEntry *a, GncEntry *b);

View File

@ -19,6 +19,7 @@
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-lot.h" #include "gnc-lot.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncEntry.h" #include "gncEntry.h"
@ -51,9 +52,14 @@ struct _gncInvoice {
gboolean active; gboolean active;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_INVOICE_MODULE_NAME #define _GNC_MOD_NAME GNC_INVOICE_MODULE_NAME
#define GNC_INVOICE_ID "gncInvoice" #define GNC_INVOICE_ID "gncInvoice"
@ -79,6 +85,7 @@ static void
mark_invoice (GncInvoice *invoice) mark_invoice (GncInvoice *invoice)
{ {
invoice->dirty = TRUE; invoice->dirty = TRUE;
gncBusinessSetDirtyFlag (invoice->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&invoice->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&invoice->guid, GNC_EVENT_MODIFY);
} }
@ -110,6 +117,13 @@ GncInvoice *gncInvoiceCreate (GNCBook *book)
} }
void gncInvoiceDestroy (GncInvoice *invoice) void gncInvoiceDestroy (GncInvoice *invoice)
{
if (!invoice) return;
invoice->do_free = TRUE;
gncInvoiceCommitEdit (invoice);
}
static void gncInvoiceFree (GncInvoice *invoice)
{ {
if (!invoice) return; if (!invoice) return;
@ -655,6 +669,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
Account *this_acc; Account *this_acc;
/* Stabilize the TaxTable in this entry */ /* Stabilize the TaxTable in this entry */
gncEntryBeginEdit (entry);
if (reverse) if (reverse)
gncEntrySetInvTaxTable gncEntrySetInvTaxTable
(entry, gncTaxTableReturnChild (gncEntryGetInvTaxTable (entry), TRUE)); (entry, gncTaxTableReturnChild (gncEntryGetInvTaxTable (entry), TRUE));
@ -666,6 +681,7 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
if (gncEntryGetBillable (entry)) if (gncEntryGetBillable (entry))
gncEntrySetInvPrice (entry, gncEntryGetBillPrice (entry)); gncEntrySetInvPrice (entry, gncEntryGetBillPrice (entry));
} }
gncEntryCommitEdit (entry);
/* Obtain the Entry's Value and TaxValues */ /* Obtain the Entry's Value and TaxValues */
gncEntryGetValue (entry, reverse, &value, NULL, &tax, &taxes); gncEntryGetValue (entry, reverse, &value, NULL, &tax, &taxes);
@ -831,14 +847,24 @@ GncInvoice * gncInvoiceLookup (GNCBook *book, const GUID *guid)
void gncInvoiceBeginEdit (GncInvoice *invoice) void gncInvoiceBeginEdit (GncInvoice *invoice)
{ {
if (!invoice) return; GNC_BEGIN_EDIT (invoice, _GNC_MOD_NAME);
} }
static void gncInvoiceOnError (GncInvoice *invoice, GNCBackendError errcode)
{
PERR("Invoice Backend Failure: %d", errcode);
}
static void gncInvoiceOnDone (GncInvoice *invoice)
{
invoice->dirty = FALSE;
}
void gncInvoiceCommitEdit (GncInvoice *invoice) void gncInvoiceCommitEdit (GncInvoice *invoice)
{ {
if (!invoice) return; GNC_COMMIT_EDIT_PART1 (invoice);
if (invoice->dirty) GNC_COMMIT_EDIT_PART2 (invoice, _GNC_MOD_NAME, gncInvoiceOnError,
gncBusinessSetDirtyFlag (invoice->book, _GNC_MOD_NAME, TRUE); gncInvoiceOnDone, gncInvoiceFree);
invoice->dirty = FALSE;
} }
int gncInvoiceCompare (GncInvoice *a, GncInvoice *b) int gncInvoiceCompare (GncInvoice *a, GncInvoice *b)

View File

@ -17,6 +17,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncJob.h" #include "gncJob.h"
@ -30,9 +31,14 @@ struct _gncJob {
char * desc; char * desc;
GncOwner owner; GncOwner owner;
gboolean active; gboolean active;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_JOB_MODULE_NAME #define _GNC_MOD_NAME GNC_JOB_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -46,6 +52,7 @@ G_INLINE_FUNC void
mark_job (GncJob *job) mark_job (GncJob *job)
{ {
job->dirty = TRUE; job->dirty = TRUE;
gncBusinessSetDirtyFlag (job->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&job->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&job->guid, GNC_EVENT_MODIFY);
} }
@ -76,6 +83,13 @@ GncJob *gncJobCreate (GNCBook *book)
} }
void gncJobDestroy (GncJob *job) void gncJobDestroy (GncJob *job)
{
if (!job) return;
job->do_free = TRUE;
gncJobCommitEdit (job);
}
static void gncJobFree (GncJob *job)
{ {
if (!job) return; if (!job) return;
@ -184,14 +198,26 @@ void gncJobSetActive (GncJob *job, gboolean active)
mark_job (job); mark_job (job);
} }
void gncJobBeginEdit (GncJob *job)
{
GNC_BEGIN_EDIT (job, _GNC_MOD_NAME);
}
static void gncJobOnError (GncJob *job, GNCBackendError errcode)
{
PERR("Job Backend Failure: %d", errcode);
}
static void gncJobOnDone (GncJob *job)
{
job->dirty = FALSE;
}
void gncJobCommitEdit (GncJob *job) void gncJobCommitEdit (GncJob *job)
{ {
if (!job) return; GNC_COMMIT_EDIT_PART1 (job);
GNC_COMMIT_EDIT_PART2 (job, _GNC_MOD_NAME, gncJobOnError,
/* XXX: COMMIT TO DATABASE */ gncJobOnDone, gncJobFree);
if (job->dirty)
gncBusinessSetDirtyFlag (job->book, _GNC_MOD_NAME, TRUE);
job->dirty = FALSE;
} }
/* Get Functions */ /* Get Functions */

View File

@ -27,6 +27,7 @@ void gncJobSetReference (GncJob *job, const char *owner_reference);
void gncJobSetOwner (GncJob *job, GncOwner *owner); void gncJobSetOwner (GncJob *job, GncOwner *owner);
void gncJobSetActive (GncJob *job, gboolean active); void gncJobSetActive (GncJob *job, gboolean active);
void gncJobBeginEdit (GncJob *job);
void gncJobCommitEdit (GncJob *job); void gncJobCommitEdit (GncJob *job);
/* Get Functions */ /* Get Functions */

View File

@ -16,6 +16,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncEntry.h" #include "gncEntry.h"
@ -38,9 +39,14 @@ struct _gncOrder {
Timespec closed; Timespec closed;
gboolean active; gboolean active;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_ORDER_MODULE_NAME #define _GNC_MOD_NAME GNC_ORDER_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -63,6 +69,7 @@ G_INLINE_FUNC void
mark_order (GncOrder *order) mark_order (GncOrder *order)
{ {
order->dirty = TRUE; order->dirty = TRUE;
gncBusinessSetDirtyFlag (order->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&order->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&order->guid, GNC_EVENT_MODIFY);
} }
@ -93,6 +100,13 @@ GncOrder *gncOrderCreate (GNCBook *book)
} }
void gncOrderDestroy (GncOrder *order) void gncOrderDestroy (GncOrder *order)
{
if (!order) return;
order->do_free = TRUE;
gncOrderCommitEdit (order);
}
static void gncOrderFree (GncOrder *order)
{ {
if (!order) return; if (!order) return;
@ -296,16 +310,24 @@ gboolean gncOrderIsClosed (GncOrder *order)
void gncOrderBeginEdit (GncOrder *order) void gncOrderBeginEdit (GncOrder *order)
{ {
if (!order) return; GNC_BEGIN_EDIT (order, _GNC_MOD_NAME);
}
static void gncOrderOnError (GncOrder *order, GNCBackendError errcode)
{
PERR("Order Backend Failure: %d", errcode);
}
static void gncOrderOnDone (GncOrder *order)
{
order->dirty = FALSE;
} }
void gncOrderCommitEdit (GncOrder *order) void gncOrderCommitEdit (GncOrder *order)
{ {
if (!order) return; GNC_COMMIT_EDIT_PART1 (order);
GNC_COMMIT_EDIT_PART2 (order, _GNC_MOD_NAME, gncOrderOnError,
if (order->dirty) gncOrderOnDone, gncOrderFree);
gncBusinessSetDirtyFlag (order->book, _GNC_MOD_NAME, TRUE);
order->dirty = FALSE;
} }
int gncOrderCompare (GncOrder *a, GncOrder *b) int gncOrderCompare (GncOrder *a, GncOrder *b)

View File

@ -15,6 +15,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncTaxTableP.h" #include "gncTaxTableP.h"
@ -31,6 +32,9 @@ struct _gncTaxTable {
GncTaxTable * parent; /* if non-null, we are an immutable child */ GncTaxTable * parent; /* if non-null, we are an immutable child */
GncTaxTable * child; /* if non-null, we have not changed */ GncTaxTable * child; /* if non-null, we have not changed */
gboolean invisible; gboolean invisible;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
@ -46,6 +50,8 @@ struct _book_info {
GList * tables; /* visible tables */ GList * tables; /* visible tables */
}; };
static short module = MOD_BUSINESS;
/* You must edit the functions in this block in tandem. KEEP THEM IN /* You must edit the functions in this block in tandem. KEEP THEM IN
SYNC! */ SYNC! */
@ -129,6 +135,7 @@ G_INLINE_FUNC void
mark_table (GncTaxTable *table) mark_table (GncTaxTable *table)
{ {
table->dirty = TRUE; table->dirty = TRUE;
gncBusinessSetDirtyFlag (table->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&table->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&table->guid, GNC_EVENT_MODIFY);
} }
@ -156,6 +163,13 @@ GncTaxTable * gncTaxTableCreate (GNCBook *book)
} }
void gncTaxTableDestroy (GncTaxTable *table) void gncTaxTableDestroy (GncTaxTable *table)
{
if (!table) return;
table->do_free = TRUE;
gncTaxTableCommitEdit (table);
}
static void gncTaxTableFree (GncTaxTable *table)
{ {
GList *list; GList *list;
if (!table) return; if (!table) return;
@ -309,13 +323,26 @@ void gncTaxTableChanged (GncTaxTable *table)
table->child = NULL; table->child = NULL;
} }
void gncTaxTableBeginEdit (GncTaxTable *table)
{
GNC_BEGIN_EDIT (table, _GNC_MOD_NAME);
}
static void gncTaxTableOnError (GncTaxTable *table, GNCBackendError errcode)
{
PERR("TaxTable Backend Failure: %d", errcode);
}
static void gncTaxTableOnDone (GncTaxTable *table)
{
table->dirty = FALSE;
}
void gncTaxTableCommitEdit (GncTaxTable *table) void gncTaxTableCommitEdit (GncTaxTable *table)
{ {
if (!table) return; GNC_COMMIT_EDIT_PART1 (table);
GNC_COMMIT_EDIT_PART2 (table, _GNC_MOD_NAME, gncTaxTableOnError,
if (table->dirty) gncTaxTableOnDone, gncTaxTableFree);
gncBusinessSetDirtyFlag (table->book, _GNC_MOD_NAME, TRUE);
table->dirty = FALSE;
} }

View File

@ -59,6 +59,7 @@ void gncTaxTableAddEntry (GncTaxTable *table, GncTaxTableEntry *entry);
void gncTaxTableRemoveEntry (GncTaxTable *table, GncTaxTableEntry *entry); void gncTaxTableRemoveEntry (GncTaxTable *table, GncTaxTableEntry *entry);
void gncTaxTableChanged (GncTaxTable *table); void gncTaxTableChanged (GncTaxTable *table);
void gncTaxTableBeginEdit (GncTaxTable *table);
void gncTaxTableCommitEdit (GncTaxTable *table); void gncTaxTableCommitEdit (GncTaxTable *table);
/* Get Functions */ /* Get Functions */

View File

@ -16,6 +16,7 @@
#include "GNCIdP.h" #include "GNCIdP.h"
#include "QueryObject.h" #include "QueryObject.h"
#include "gnc-event-p.h" #include "gnc-event-p.h"
#include "gnc-be-utils.h"
#include "gncBusiness.h" #include "gncBusiness.h"
#include "gncVendor.h" #include "gncVendor.h"
@ -36,9 +37,15 @@ struct _gncVendor {
GList * jobs; GList * jobs;
GncTaxTable* taxtable; GncTaxTable* taxtable;
gboolean taxtable_override; gboolean taxtable_override;
int editlevel;
gboolean do_free;
gboolean dirty; gboolean dirty;
}; };
static short module = MOD_BUSINESS;
#define _GNC_MOD_NAME GNC_VENDOR_MODULE_NAME #define _GNC_MOD_NAME GNC_VENDOR_MODULE_NAME
#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str)); #define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
@ -52,6 +59,7 @@ G_INLINE_FUNC void
mark_vendor (GncVendor *vendor) mark_vendor (GncVendor *vendor)
{ {
vendor->dirty = TRUE; vendor->dirty = TRUE;
gncBusinessSetDirtyFlag (vendor->book, _GNC_MOD_NAME, TRUE);
gnc_engine_generate_event (&vendor->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&vendor->guid, GNC_EVENT_MODIFY);
} }
@ -83,6 +91,13 @@ GncVendor *gncVendorCreate (GNCBook *book)
} }
void gncVendorDestroy (GncVendor *vendor) void gncVendorDestroy (GncVendor *vendor)
{
if (!vendor) return;
vendor->do_free = TRUE;
gncVendorCommitEdit (vendor);
}
static void gncVendorFree (GncVendor *vendor)
{ {
if (!vendor) return; if (!vendor) return;
@ -307,17 +322,29 @@ void gncVendorRemoveJob (GncVendor *vendor, GncJob *job)
gnc_engine_generate_event (&vendor->guid, GNC_EVENT_MODIFY); gnc_engine_generate_event (&vendor->guid, GNC_EVENT_MODIFY);
} }
void gncVendorCommitEdit (GncVendor *vendor) void gncVendorBeginEdit (GncVendor *vendor)
{ {
if (!vendor) return; GNC_BEGIN_EDIT (vendor, _GNC_MOD_NAME);
}
/* XXX COMMIT TO DATABASE */ static void gncVendorOnError (GncVendor *vendor, GNCBackendError errcode)
if (gncVendorIsDirty (vendor)) {
gncBusinessSetDirtyFlag (vendor->book, _GNC_MOD_NAME, TRUE); PERR("Vendor Backend Failure: %d", errcode);
}
static void gncVendorOnDone (GncVendor *vendor)
{
vendor->dirty = FALSE; vendor->dirty = FALSE;
gncAddressClearDirty (vendor->addr); gncAddressClearDirty (vendor->addr);
} }
void gncVendorCommitEdit (GncVendor *vendor)
{
GNC_COMMIT_EDIT_PART1 (vendor);
GNC_COMMIT_EDIT_PART2 (vendor, _GNC_MOD_NAME, gncVendorOnError,
gncVendorOnDone, gncVendorFree);
}
/* Other functions */ /* Other functions */
int gncVendorCompare (GncVendor *a, GncVendor *b) int gncVendorCompare (GncVendor *a, GncVendor *b)

View File

@ -38,6 +38,7 @@ void gncVendorSetTaxTable (GncVendor *vendor, GncTaxTable *table);
void gncVendorAddJob (GncVendor *vendor, GncJob *job); void gncVendorAddJob (GncVendor *vendor, GncJob *job);
void gncVendorRemoveJob (GncVendor *vendor, GncJob *job); void gncVendorRemoveJob (GncVendor *vendor, GncJob *job);
void gncVendorBeginEdit (GncVendor *vendor);
void gncVendorCommitEdit (GncVendor *vendor); void gncVendorCommitEdit (GncVendor *vendor);
/* Get Functions */ /* Get Functions */

View File

@ -279,10 +279,12 @@ new_billterm_ok_cb (GtkWidget *widget, gpointer data)
/* Ok, it's all valid, now either change or add this thing */ /* Ok, it's all valid, now either change or add this thing */
if (nbt->this_term == NULL) { if (nbt->this_term == NULL) {
nbt->this_term = gncBillTermCreate (btw->book); nbt->this_term = gncBillTermCreate (btw->book);
gncBillTermBeginEdit (nbt->this_term);
gncBillTermSetName (nbt->this_term, name); gncBillTermSetName (nbt->this_term, name);
/* Reset the current term */ /* Reset the current term */
btw->current_term = nbt->this_term; btw->current_term = nbt->this_term;
} } else
gncBillTermBeginEdit (btw->current_term);
/* Fill in the rest of the term */ /* Fill in the rest of the term */
if (ui_to_billterm (nbt)) if (ui_to_billterm (nbt))
@ -615,8 +617,8 @@ billterms_delete_term_cb (GtkButton *button, BillTermsWindow *btw)
gncBillTermGetName (btw->current_term))) { gncBillTermGetName (btw->current_term))) {
/* Ok, let's remove it */ /* Ok, let's remove it */
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncBillTermBeginEdit (btw->current_term);
gncBillTermDestroy (btw->current_term); gncBillTermDestroy (btw->current_term);
// gncBillTermCommitEdit (btw->current_term);
btw->current_term = NULL; btw->current_term = NULL;
gnc_resume_gui_refresh (); gnc_resume_gui_refresh ();
} }

View File

@ -122,6 +122,8 @@ static void gnc_ui_to_customer (CustomerWindow *cw, GncCustomer *cust)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncCustomerBeginEdit (cust);
gncCustomerSetID (cust, gtk_editable_get_chars gncCustomerSetID (cust, gtk_editable_get_chars
(GTK_EDITABLE (cw->id_entry), 0, -1)); (GTK_EDITABLE (cw->id_entry), 0, -1));
gncCustomerSetName (cust, gtk_editable_get_chars gncCustomerSetName (cust, gtk_editable_get_chars
@ -296,6 +298,7 @@ gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (cw->dialog_type == NEW_CUSTOMER && customer != NULL) { if (cw->dialog_type == NEW_CUSTOMER && customer != NULL) {
gncCustomerBeginEdit (customer);
gncCustomerDestroy (customer); gncCustomerDestroy (customer);
cw->customer_guid = *xaccGUIDNULL (); cw->customer_guid = *xaccGUIDNULL ();
} }

View File

@ -89,6 +89,8 @@ static void gnc_ui_to_employee (EmployeeWindow *ew, GncEmployee *employee)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncEmployeeBeginEdit (employee);
gncEmployeeSetID (employee, gtk_editable_get_chars gncEmployeeSetID (employee, gtk_editable_get_chars
(GTK_EDITABLE (ew->id_entry), 0, -1)); (GTK_EDITABLE (ew->id_entry), 0, -1));
gncEmployeeSetUsername (employee, gtk_editable_get_chars gncEmployeeSetUsername (employee, gtk_editable_get_chars
@ -230,6 +232,7 @@ gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL) { if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL) {
gncEmployeeBeginEdit (employee);
gncEmployeeDestroy (employee); gncEmployeeDestroy (employee);
ew->employee_guid = *xaccGUIDNULL (); ew->employee_guid = *xaccGUIDNULL ();
} }

View File

@ -203,6 +203,8 @@ static void gnc_ui_to_invoice (InvoiceWindow *iw, GncInvoice *invoice)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncInvoiceBeginEdit (invoice);
if (iw->active_check) if (iw->active_check)
gncInvoiceSetActive (invoice, gtk_toggle_button_get_active gncInvoiceSetActive (invoice, gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON (iw->active_check))); (GTK_TOGGLE_BUTTON (iw->active_check)));
@ -333,6 +335,7 @@ gnc_invoice_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (iw->dialog_type == NEW_INVOICE && invoice != NULL) { if (iw->dialog_type == NEW_INVOICE && invoice != NULL) {
gncInvoiceBeginEdit (invoice);
gncInvoiceDestroy (invoice); gncInvoiceDestroy (invoice);
iw->invoice_guid = *xaccGUIDNULL (); iw->invoice_guid = *xaccGUIDNULL ();
} }
@ -549,10 +552,12 @@ gnc_invoice_window_postCB (GtkWidget *widget, gpointer data)
* the verify_ok earlier, so we know it's ok. * the verify_ok earlier, so we know it's ok.
*/ */
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncInvoiceBeginEdit (invoice);
gnc_invoice_window_ok_save (iw); gnc_invoice_window_ok_save (iw);
/* ... post it; post date is set to now ... */ /* ... post it; post date is set to now ... */
gncInvoicePostToAccount (invoice, acc, &postdate, &ddue, memo); gncInvoicePostToAccount (invoice, acc, &postdate, &ddue, memo);
gncInvoiceCommitEdit (invoice);
gnc_resume_gui_refresh (); gnc_resume_gui_refresh ();
if (memo) if (memo)

View File

@ -72,6 +72,8 @@ jw_get_job (JobWindow *jw)
static void gnc_ui_to_job (JobWindow *jw, GncJob *job) static void gnc_ui_to_job (JobWindow *jw, GncJob *job)
{ {
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncJobBeginEdit (job);
gncJobSetID (job, gtk_editable_get_chars (GTK_EDITABLE (jw->id_entry), gncJobSetID (job, gtk_editable_get_chars (GTK_EDITABLE (jw->id_entry),
0, -1)); 0, -1));
gncJobSetName (job, gtk_editable_get_chars (GTK_EDITABLE (jw->name_entry), gncJobSetName (job, gtk_editable_get_chars (GTK_EDITABLE (jw->name_entry),
@ -178,6 +180,7 @@ gnc_job_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (jw->dialog_type == NEW_JOB && job != NULL) { if (jw->dialog_type == NEW_JOB && job != NULL) {
gncJobBeginEdit (job);
gncJobDestroy (job); gncJobDestroy (job);
jw->job_guid = *xaccGUIDNULL (); jw->job_guid = *xaccGUIDNULL ();
} }

View File

@ -97,6 +97,7 @@ static void gnc_ui_to_order (OrderWindow *ow, GncOrder *order)
return; return;
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncOrderBeginEdit (order);
gncOrderSetID (order, gtk_editable_get_chars gncOrderSetID (order, gtk_editable_get_chars
(GTK_EDITABLE (ow->id_entry), 0, -1)); (GTK_EDITABLE (ow->id_entry), 0, -1));
@ -291,6 +292,7 @@ gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (ow->dialog_type == NEW_ORDER && order != NULL) { if (ow->dialog_type == NEW_ORDER && order != NULL) {
gncOrderBeginEdit (order);
gncOrderDestroy (order); gncOrderDestroy (order);
ow->order_guid = *xaccGUIDNULL (); ow->order_guid = *xaccGUIDNULL ();
} }

View File

@ -107,6 +107,7 @@ static void gnc_ui_to_vendor (VendorWindow *vw, GncVendor *vendor)
addr = gncVendorGetAddr (vendor); addr = gncVendorGetAddr (vendor);
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncVendorBeginEdit (vendor);
gncVendorSetID (vendor, gtk_editable_get_chars gncVendorSetID (vendor, gtk_editable_get_chars
(GTK_EDITABLE (vw->id_entry), 0, -1)); (GTK_EDITABLE (vw->id_entry), 0, -1));
@ -221,6 +222,7 @@ gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (vw->dialog_type == NEW_VENDOR && vendor != NULL) { if (vw->dialog_type == NEW_VENDOR && vendor != NULL) {
gncVendorBeginEdit (vendor);
gncVendorDestroy (vendor); gncVendorDestroy (vendor);
vw->vendor_guid = *xaccGUIDNULL (); vw->vendor_guid = *xaccGUIDNULL ();
} }

View File

@ -38,8 +38,11 @@ gnc_entry_ledger_clear_blank_entry (GncEntryLedger *ledger)
if (!ledger) return; if (!ledger) return;
entry = gnc_entry_ledger_get_blank_entry (ledger); entry = gnc_entry_ledger_get_blank_entry (ledger);
if (entry) if (entry) {
if (!gncEntryIsOpen (entry))
gncEntryBeginEdit (entry);
gncEntryDestroy (entry); gncEntryDestroy (entry);
}
ledger->blank_entry_guid = *xaccGUIDNULL (); ledger->blank_entry_guid = *xaccGUIDNULL ();
ledger->blank_entry_edited = FALSE; ledger->blank_entry_edited = FALSE;
@ -642,6 +645,9 @@ gnc_entry_ledger_delete_current_entry (GncEntryLedger *ledger)
/* Ok, let's delete this entry */ /* Ok, let's delete this entry */
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (!gncEntryIsOpen (entry))
gncEntryBeginEdit (entry);
{ {
GncOrder *order; GncOrder *order;
GncInvoice *invoice; GncInvoice *invoice;
@ -659,7 +665,6 @@ gnc_entry_ledger_delete_current_entry (GncEntryLedger *ledger)
gncBillRemoveEntry (invoice, entry); gncBillRemoveEntry (invoice, entry);
gncEntryDestroy (entry); gncEntryDestroy (entry);
/* XXX: Commit the deletion? */
} }
gnc_resume_gui_refresh (); gnc_resume_gui_refresh ();
} }

View File

@ -57,6 +57,9 @@ gnc_entry_ledger_save (GncEntryLedger *ledger, gboolean do_commit)
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
if (!gncEntryIsOpen (entry))
gncEntryBeginEdit (entry);
if (entry == blank_entry) { if (entry == blank_entry) {
Timespec ts; Timespec ts;
ts.tv_sec = time(NULL); ts.tv_sec = time(NULL);

View File

@ -111,11 +111,13 @@ new_tax_table_ok_cb (GtkWidget *widget, gpointer data)
/* Ok, it's all valid, now either change to add this thing */ /* Ok, it's all valid, now either change to add this thing */
if (ntt->new_table) { if (ntt->new_table) {
GncTaxTable *table = gncTaxTableCreate (ttw->book); GncTaxTable *table = gncTaxTableCreate (ttw->book);
gncTaxTableBeginEdit (table);
gncTaxTableSetName (table, name); gncTaxTableSetName (table, name);
/* Reset the current table */ /* Reset the current table */
ttw->current_table = table; ttw->current_table = table;
ntt->created_table = table; ntt->created_table = table;
} } else
gncTaxTableBeginEdit (ttw->current_table);
/* Create/edit the entry */ /* Create/edit the entry */
{ {
@ -517,8 +519,8 @@ tax_table_delete_table_cb (GtkButton *button, TaxTableWindow *ttw)
gncTaxTableGetName (ttw->current_table))) { gncTaxTableGetName (ttw->current_table))) {
/* Ok, let's remove it */ /* Ok, let's remove it */
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncTaxTableBeginEdit (ttw->current_table);
gncTaxTableDestroy (ttw->current_table); gncTaxTableDestroy (ttw->current_table);
// gncTaxTableCommitEdit (ttw->current_table);
ttw->current_table = NULL; ttw->current_table = NULL;
gnc_resume_gui_refresh (); gnc_resume_gui_refresh ();
} }
@ -560,6 +562,7 @@ tax_table_delete_entry_cb (GtkButton *button, TaxTableWindow *ttw)
_("Are you sure you want to delete this entry?"))) { _("Are you sure you want to delete this entry?"))) {
/* Ok, let's remove it */ /* Ok, let's remove it */
gnc_suspend_gui_refresh (); gnc_suspend_gui_refresh ();
gncTaxTableBeginEdit (ttw->current_table);
gncTaxTableRemoveEntry (ttw->current_table, ttw->current_entry); gncTaxTableRemoveEntry (ttw->current_table, ttw->current_entry);
gncTaxTableEntryDestroy (ttw->current_entry); gncTaxTableEntryDestroy (ttw->current_entry);
gncTaxTableChanged (ttw->current_table); gncTaxTableChanged (ttw->current_table);

View File

@ -66,6 +66,7 @@ gncinclude_HEADERS = \
engine-helpers.h \ engine-helpers.h \
glib-helpers.h \ glib-helpers.h \
gnc-associate-account.h \ gnc-associate-account.h \
gnc-be-utils.h \
gnc-book.h \ gnc-book.h \
gnc-commodity.h \ gnc-commodity.h \
gnc-engine-util.h \ gnc-engine-util.h \

135
src/engine/gnc-be-utils.h Normal file
View File

@ -0,0 +1,135 @@
/*
* gnc-be-utils.h -- GnuCash Backend Utilities
* common code used by objects to define begin_edit() and
* commit_edit() functions.
*
* Written by: Derek Atkins <derek@ihtfp.com>
*
*/
#ifndef GNC_BE_UTILS_H
#define GNC_BE_UTILS_H
#include "BackendP.h"
#include "gnc-book.h"
#include "gnc-engine-util.h"
/* begin_edit helper
*
* assumes:
* obj->editlevel (int)
* obj->book (GNCBook*)
*
* @args:
* obj: the object to begin editing
* type: the object type
*
* The caller should use this macro first and then perform any other operations.
*/
#define GNC_BEGIN_EDIT(obj,type) { \
Backend * be; \
if (!(obj)) return; \
\
(obj)->editlevel++; \
if (1 < (obj)->editlevel) return; \
\
if (0 >= (obj)->editlevel) \
{ \
PERR ("unbalanced call - resetting (was %d)", (obj)->editlevel); \
(obj)->editlevel = 1; \
} \
\
/* See if there's a backend. If there is, invoke it. */ \
be = gnc_book_get_backend ((obj)->book); \
if (be && be->begin) { \
(be->begin) (be, (type), (obj)); \
} \
}
/*
* commit_edit helpers
*
* The caller should call PART1 as the first thing, then
* perform any local operations prior to calling the backend.
* Then call PART2. You cannot do anything after PART2.
*
* assumes:
* obj->editlevel (int)
* obj->book (GNCBook*)
* obj->do_free (gboolean)
*/
/*
* part1 -- deal with the editlevel
*
* assumes:
* obj->editlevel (int)
*
* @args:
* obj: the object being committed
*/
#define GNC_COMMIT_EDIT_PART1(obj) { \
if (!(obj)) return; \
\
(obj)->editlevel--; \
if (0 < (obj)->editlevel) return; \
\
if (0 > (obj)->editlevel) \
{ \
PERR ("unbalanced call - resetting (was %d)", (obj)->editlevel); \
(obj)->editlevel = 0; \
} \
}
/*
* part2 -- deal with the backend
*
* assumes:
* obj->book (GNCBook*)
* obj->do_free (gboolean)
*
* @args:
* obj: the object being committed
* type: the type of the object
* on_error: a function called if there is a backend error.
* void (*on_error)(obj, GNCBackendError)
* on_done: a function called after the commit is complete but before
* the object is freed. This is where you clear the "dirty"
* flag, and perform any other operations after the commit.
* void (*on_done)(obj)
* on_free: a function called if obj->do_free is TRUE.
* void (*on_free)(obj)
*/
#define GNC_COMMIT_EDIT_PART2(obj,type,on_error,on_done,on_free) { \
Backend * be; \
\
/* See if there's a backend. If there is, invoke it. */ \
be = gnc_book_get_backend ((obj)->book); \
if (be && be->commit) \
{ \
GNCBackendError errcode; \
\
/* clear errors */ \
do { \
errcode = xaccBackendGetError (be); \
} while (ERR_BACKEND_NO_ERR != errcode); \
\
(be->commit) (be, (type), (obj)); \
errcode = xaccBackendGetError (be); \
if (ERR_BACKEND_NO_ERR != errcode) \
{ \
(obj)->do_free = FALSE; \
(on_error)((obj), errcode); \
xaccBackendSetError (be, errcode); \
} \
} \
(on_done)(obj);\
\
if ((obj)->do_free) (on_free)(obj); \
}
#endif /* GNC_BE_UTILS_H */