[Transaction.c] use is_unset static to denote uncached readonly_reason

tests in 128c8d6f88
This commit is contained in:
Christopher Lam
2021-09-25 00:09:47 +08:00
parent b8c9b1a6ce
commit d82bb7b8a2
3 changed files with 12 additions and 25 deletions

View File

@@ -274,8 +274,7 @@ gnc_transaction_init(Transaction* trans)
trans->date_posted = 0; trans->date_posted = 0;
trans->marker = 0; trans->marker = 0;
trans->orig = NULL; trans->orig = NULL;
trans->readonly_reason = NULL; trans->readonly_reason = (char*) is_unset;
trans->reason_cache_valid = FALSE;
trans->isClosingTxn_cached = -1; trans->isClosingTxn_cached = -1;
trans->notes = (char*) is_unset; trans->notes = (char*) is_unset;
trans->doclink = (char*) is_unset; trans->doclink = (char*) is_unset;
@@ -818,7 +817,8 @@ xaccFreeTransaction (Transaction *trans)
/* free up transaction strings */ /* free up transaction strings */
CACHE_REMOVE(trans->num); CACHE_REMOVE(trans->num);
CACHE_REMOVE(trans->description); CACHE_REMOVE(trans->description);
g_free (trans->readonly_reason); if (trans->readonly_reason != is_unset)
g_free (trans->readonly_reason);
if (trans->doclink != is_unset) if (trans->doclink != is_unset)
g_free (trans->doclink); g_free (trans->doclink);
if (trans->void_reason != is_unset) if (trans->void_reason != is_unset)
@@ -832,7 +832,6 @@ xaccFreeTransaction (Transaction *trans)
trans->date_entered = 0; trans->date_entered = 0;
trans->date_posted = 0; trans->date_posted = 0;
trans->readonly_reason = NULL; trans->readonly_reason = NULL;
trans->reason_cache_valid = FALSE;
trans->doclink = NULL; trans->doclink = NULL;
trans->notes = NULL; trans->notes = NULL;
trans->void_reason = NULL; trans->void_reason = NULL;
@@ -2130,9 +2129,9 @@ void xaccTransClearReadOnly (Transaction *trans)
qof_instance_set_dirty(QOF_INSTANCE(trans)); qof_instance_set_dirty(QOF_INSTANCE(trans));
xaccTransCommitEdit(trans); xaccTransCommitEdit(trans);
g_free (trans->readonly_reason); if (trans->readonly_reason != is_unset)
g_free (trans->readonly_reason);
trans->readonly_reason = NULL; trans->readonly_reason = NULL;
trans->reason_cache_valid = TRUE;
} }
} }
@@ -2150,9 +2149,9 @@ xaccTransSetReadOnly (Transaction *trans, const char *reason)
g_value_unset (&v); g_value_unset (&v);
xaccTransCommitEdit(trans); xaccTransCommitEdit(trans);
g_free (trans->readonly_reason); if (trans->readonly_reason != is_unset)
g_free (trans->readonly_reason);
trans->readonly_reason = g_strdup (reason); trans->readonly_reason = g_strdup (reason);
trans->reason_cache_valid = TRUE;
} }
} }
@@ -2570,22 +2569,13 @@ xaccTransGetReadOnly (Transaction *trans)
if (!trans) if (!trans)
return NULL; return NULL;
if (!trans->reason_cache_valid) if (trans->readonly_reason == is_unset)
{ {
GValue v = G_VALUE_INIT; GValue v = G_VALUE_INIT;
qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON); qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON);
trans->readonly_reason = G_VALUE_HOLDS_STRING (&v) ?
/* Clear possible old cache value first */ g_value_dup_string (&v) : NULL;
g_free (trans->readonly_reason); g_value_unset (&v);
trans->readonly_reason = NULL;
/* Then set the new one */
if (G_VALUE_HOLDS_STRING (&v))
{
trans->readonly_reason = g_value_dup_string (&v);
g_value_unset (&v);
}
trans->reason_cache_valid = TRUE;
} }
return trans->readonly_reason; return trans->readonly_reason;
} }

View File

@@ -114,11 +114,9 @@ struct transaction_s
/* The readonly_reason is a string that indicates why a transaction /* The readonly_reason is a string that indicates why a transaction
* is marked as read-only. If NULL, the transaction is read-write. * is marked as read-only. If NULL, the transaction is read-write.
* This value is stored in kvp, but we cache a copy here for * This value is stored in kvp, but we cache a copy here for
* performance reasons. reason_cache_valid indicates whether the * performance reasons.
* cached value is valid.
*/ */
char * readonly_reason; char * readonly_reason;
gboolean reason_cache_valid;
char * doclink; char * doclink;
char * void_reason; char * void_reason;

View File

@@ -33,7 +33,6 @@ public:
marker = 0; marker = 0;
orig = nullptr; orig = nullptr;
readonly_reason = nullptr; readonly_reason = nullptr;
reason_cache_valid = FALSE;
isClosingTxn_cached = -1; isClosingTxn_cached = -1;
} }
void* operator new(size_t size) void* operator new(size_t size)