[Gnucash-changes] r13834 - gnucash/trunk/src/register/ledger-core - Don't immediately commit the blank transaction after creating it.

Chris Shoemaker chris at cvs.gnucash.org
Sun Apr 23 19:01:47 EDT 2006


Author: chris
Date: 2006-04-23 19:01:46 -0400 (Sun, 23 Apr 2006)
New Revision: 13834
Trac: http://svn.gnucash.org/trac/changeset/13834

Modified:
   gnucash/trunk/src/register/ledger-core/split-register-control.c
   gnucash/trunk/src/register/ledger-core/split-register-load.c
   gnucash/trunk/src/register/ledger-core/split-register.c
Log:
   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.


Modified: gnucash/trunk/src/register/ledger-core/split-register-control.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register-control.c	2006-04-23 21:07:55 UTC (rev 13833)
+++ gnucash/trunk/src/register/ledger-core/split-register-control.c	2006-04-23 23:01:46 UTC (rev 13834)
@@ -712,10 +712,11 @@
           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);
 

Modified: gnucash/trunk/src/register/ledger-core/split-register-load.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register-load.c	2006-04-23 21:07:55 UTC (rev 13833)
+++ gnucash/trunk/src/register/ledger-core/split-register-load.c	2006-04-23 23:01:46 UTC (rev 13834)
@@ -235,8 +235,18 @@
     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 @@
    * 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. */

Modified: gnucash/trunk/src/register/ledger-core/split-register.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register.c	2006-04-23 21:07:55 UTC (rev 13833)
+++ gnucash/trunk/src/register/ledger-core/split-register.c	2006-04-23 23:01:46 UTC (rev 13834)
@@ -1008,7 +1008,8 @@
 }
 
 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 @@
       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 @@
          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 @@
    /* 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 @@
    {
      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 @@
    {
       if (xaccTransIsOpen (pending_trans))
         xaccTransCommitEdit (pending_trans);
+      else g_assert_not_reached();
 
       info->pending_trans_guid = *guid_null ();
       pending_trans = NULL;



More information about the gnucash-changes mailing list