Skip to content

Commit 0ed5e12

Browse files
[Transaction.hpp] restore trans->is_closing_cached struct member
because trans->is_closing is heavily accessed during account balance calculations, and it's reasonable to cache the kvp value.
1 parent 7463b40 commit 0ed5e12

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

libgnucash/engine/Transaction.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ gnc_transaction_init(Transaction* trans)
273273
trans->marker = 0;
274274
trans->orig = nullptr;
275275
trans->txn_type = TXN_TYPE_UNCACHED;
276+
trans->is_closing_cached = -1;
276277
LEAVE (" ");
277278
}
278279

@@ -2129,6 +2130,7 @@ xaccTransSetIsClosingTxn (Transaction *trans, gboolean is_closing)
21292130
{
21302131
if (!trans) return;
21312132
xaccTransBeginEdit(trans);
2133+
trans->is_closing_cached = is_closing ? 1 : 0;
21322134

21332135
if (is_closing)
21342136
{
@@ -2337,16 +2339,15 @@ xaccTransGetIsClosingTxn (const Transaction *trans)
23372339
{
23382340
if (!trans) return FALSE;
23392341

2340-
GValue v = G_VALUE_INIT;
2341-
gboolean rv;
2342-
qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str);
2343-
if (G_VALUE_HOLDS_INT64 (&v))
2344-
rv = (g_value_get_int64 (&v) ? 1 : 0);
2345-
else
2346-
rv = 0;
2347-
g_value_unset (&v);
2348-
2349-
return rv;
2342+
if (trans->is_closing_cached == -1)
2343+
{
2344+
auto t = const_cast<Transaction*>(trans);
2345+
GValue v = G_VALUE_INIT;
2346+
qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str);
2347+
t->is_closing_cached = G_VALUE_HOLDS_INT64 (&v) && g_value_get_int64 (&v) ? 1 : 0;
2348+
g_value_unset (&v);
2349+
}
2350+
return trans->is_closing_cached != 0;
23502351
}
23512352

23522353
/********************************************************************\

libgnucash/engine/TransactionP.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ struct transaction_s
116116
*/
117117
char txn_type;
118118

119+
signed char is_closing_cached;
119120
};
120121

121122
struct _TransactionClass

libgnucash/engine/test/utest-Transaction.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,6 +1807,19 @@ test_xaccTransGetTxnType (Fixture *fixture, gconstpointer pData)
18071807
g_assert_cmpint (TXN_TYPE_NONE, ==, xaccTransGetTxnType(txn));
18081808
}
18091809

1810+
static void
1811+
test_xaccTrans_IsClosing (Fixture *fixture, gconstpointer pData)
1812+
{
1813+
auto txn = fixture->txn;
1814+
g_assert_false (xaccTransGetIsClosingTxn (txn));
1815+
1816+
xaccTransSetIsClosingTxn (txn, TRUE);
1817+
g_assert_true (xaccTransGetIsClosingTxn (txn));
1818+
1819+
xaccTransSetIsClosingTxn (txn, FALSE);
1820+
g_assert_false (xaccTransGetIsClosingTxn (txn));
1821+
}
1822+
18101823
/* xaccTransGetReadOnly C: 7 in 5 Local: 1:0:0
18111824
* xaccTransIsReadonlyByPostedDate C: 2 in 2 Local: 0:0:0
18121825
* xaccTransHasReconciledSplitsByAccount Local: 1:0:0
@@ -2049,6 +2062,7 @@ test_suite_transaction (void)
20492062
GNC_TEST_ADD (suitename, "xaccTransRollbackEdit - Backend Errors", Fixture, NULL, setup, test_xaccTransRollbackEdit_BackendErrors, teardown);
20502063
GNC_TEST_ADD (suitename, "xaccTransOrder_num_action", Fixture, NULL, setup, test_xaccTransOrder_num_action, teardown);
20512064
GNC_TEST_ADD (suitename, "xaccTransGetTxnType", Fixture, NULL, setup, test_xaccTransGetTxnType, teardown);
2065+
GNC_TEST_ADD (suitename, "xaccTransIsClosing", Fixture, NULL, setup, test_xaccTrans_IsClosing, teardown);
20522066
GNC_TEST_ADD (suitename, "xaccTransGetreadOnly", Fixture, NULL, setup, test_xaccTransGetReadOnly, teardown);
20532067
GNC_TEST_ADD (suitename, "xaccTransSetDocLink", Fixture, NULL, setup, test_xaccTransSetDocLink, teardown);
20542068
GNC_TEST_ADD (suitename, "xaccTransVoid", Fixture, NULL, setup, test_xaccTransVoid, teardown);

0 commit comments

Comments
 (0)