From 752096c43902bb64facdfb9d5dcce4ea7245e78a Mon Sep 17 00:00:00 2001 From: Chris Shoemaker Date: Sun, 23 Apr 2006 23:01:46 +0000 Subject: [PATCH] Don't immediately commit the blank transaction after creating it. When saving the register state, don't commit an open transaction unless we think it was opened from this register. These changes are intended to fix bug #327780. I've also added several related assertions. If any of these assertions fail, it may indicate that I don't really understand what's going on, and that this may not be the correct fix for #327780. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13834 57a11ea4-9604-0410-9ed3-97b8803252fd --- .../ledger-core/split-register-control.c | 9 ++-- .../ledger-core/split-register-load.c | 22 +++++++-- src/register/ledger-core/split-register.c | 46 ++++++++++++++----- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/register/ledger-core/split-register-control.c b/src/register/ledger-core/split-register-control.c index 315c94ec3c..0b168a99f4 100644 --- a/src/register/ledger-core/split-register-control.c +++ b/src/register/ledger-core/split-register-control.c @@ -712,10 +712,11 @@ gnc_split_register_auto_completion (SplitRegister *reg, info->blank_split_guid = *xaccSplitGetGUID(blank_split); } - if ((pending_trans != NULL) && (pending_trans != trans)) - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); - + if ((pending_trans != NULL) && (pending_trans != trans)) { + if (xaccTransIsOpen (pending_trans)) + xaccTransCommitEdit (pending_trans); + else g_assert_not_reached(); + } pending_trans = trans; info->pending_trans_guid = *xaccTransGetGUID (pending_trans); diff --git a/src/register/ledger-core/split-register-load.c b/src/register/ledger-core/split-register-load.c index c483f8a92c..c0165a4939 100644 --- a/src/register/ledger-core/split-register-load.c +++ b/src/register/ledger-core/split-register-load.c @@ -235,7 +235,17 @@ gnc_split_register_load (SplitRegister *reg, GList * slist, xaccTransSetDateSecs (new_trans, info->last_date_entered); blank_split = xaccMallocSplit (gnc_get_current_book ()); xaccSplitSetParent(blank_split, new_trans); - xaccTransCommitEdit (new_trans); + /* We don't want to commit this transaction yet, because the split + doesn't even belong to an account yet. But, we don't want to + set this transaction as the pending transaction either, because + we want to pretend that it hasn't been changed. We depend on + some other code (somewhere) to commit this transaction if we + really edit it, even though it's not marked as the pending + transaction. */ + + /* Wouldn't it be a bug to open this transaction if there was already a + pending transaction? */ + g_assert(pending_trans == NULL); info->blank_split_guid = *xaccSplitGetGUID (blank_split); info->blank_split_edited = FALSE; @@ -515,11 +525,13 @@ gnc_split_register_load (SplitRegister *reg, GList * slist, * from the account. */ if (!found_pending) { - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); + if (xaccTransIsOpen (pending_trans)) + xaccTransCommitEdit (pending_trans); + else if (pending_trans) + g_assert_not_reached(); - info->pending_trans_guid = *guid_null (); - pending_trans = NULL; + info->pending_trans_guid = *guid_null (); + pending_trans = NULL; } /* Set up the hint transaction, split, transaction split, and column. */ diff --git a/src/register/ledger-core/split-register.c b/src/register/ledger-core/split-register.c index 26cd8b9e70..1134f430bb 100644 --- a/src/register/ledger-core/split-register.c +++ b/src/register/ledger-core/split-register.c @@ -1008,7 +1008,8 @@ gnc_split_register_unvoid_current_trans (SplitRegister *reg) } void -gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, Split *split) +gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, + Split *split) { SRInfo *info; Transaction *trans; @@ -1028,7 +1029,9 @@ gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, Split * i++; } - /* This is now the pending transaction */ + /* This is now the pending transaction */ + g_assert(xaccTransLookup(&info->pending_trans_guid, + gnc_get_current_book()) == NULL); info = gnc_split_register_get_info (reg); info->pending_trans_guid = *xaccTransGetGUID(trans); @@ -1338,13 +1341,24 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) blank_split = NULL; } else - return FALSE; + return FALSE; /* nothing to do */ } else if (!xaccTransIsOpen (trans)) return FALSE; - if (xaccTransIsOpen (trans)) - xaccTransCommitEdit (trans); + /* CAS: The code here used to unconditionally commit any open + transaction. But, even if it's open, what if it was opened by + someone else? I've made it so we only commit if we began the + edit. */ + if (xaccTransIsOpen (trans)) { + if (trans == pending_trans) { + info->pending_trans_guid = *guid_null (); + PINFO("commiting trans (%p)", trans); + xaccTransCommitEdit (trans); + } else { + DEBUG("trans (%p) != pending (%p)", trans, pending_trans); + } + } if (pending_trans == trans) { @@ -1373,9 +1387,16 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) /* determine whether we should commit the pending transaction */ if (pending_trans != trans) { - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); - + // FIXME: How could the pending transaction not be open? + // FIXME: For that matter, how could an open pending + // transaction ever not be the current trans? + if (xaccTransIsOpen (pending_trans)) { + g_message("Impossible? commiting pending %p", pending_trans); + xaccTransCommitEdit (pending_trans); + } else if (pending_trans) + g_assert_not_reached(); + + PINFO("beginning edit of trans %p", trans); xaccTransBeginEdit (trans); pending_trans = trans; info->pending_trans_guid = *xaccTransGetGUID(trans); @@ -1421,10 +1442,10 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) { SRSaveData *sd; - sd = gnc_split_register_save_data_new (trans, split, - (info->trans_expanded || - reg->style == REG_STYLE_AUTO_LEDGER || - reg->style == REG_STYLE_JOURNAL)); + sd = gnc_split_register_save_data_new ( + trans, split, (info->trans_expanded || + reg->style == REG_STYLE_AUTO_LEDGER || + reg->style == REG_STYLE_JOURNAL)); gnc_table_save_cells (reg->table, sd); gnc_split_register_save_data_destroy (sd); } @@ -2371,6 +2392,7 @@ gnc_split_register_cleanup (SplitRegister *reg) { if (xaccTransIsOpen (pending_trans)) xaccTransCommitEdit (pending_trans); + else g_assert_not_reached(); info->pending_trans_guid = *guid_null (); pending_trans = NULL;