From cfc357a430ae4f20093e39078be1a00cf278cea7 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Fri, 5 Dec 2025 17:34:28 +0800 Subject: [PATCH] [backend/xml] fast string setters for acct/trans/split Avoids allocating/g_free temporary strings when DOM text exists. Replaces dom_tree_to_text() with dom_node_to_text() fast-path for Account, Transaction, and Split string setters. --- libgnucash/backend/xml/gnc-account-xml-v2.cpp | 6 ++++++ .../backend/xml/gnc-transaction-xml-v2.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libgnucash/backend/xml/gnc-account-xml-v2.cpp b/libgnucash/backend/xml/gnc-account-xml-v2.cpp index 2a157baa2e..620150a068 100644 --- a/libgnucash/backend/xml/gnc-account-xml-v2.cpp +++ b/libgnucash/backend/xml/gnc-account-xml-v2.cpp @@ -175,6 +175,12 @@ static inline gboolean set_string (xmlNodePtr node, Account* act, void (*func) (Account* act, const gchar* txt)) { + if (auto txt = dom_node_to_text (node)) + { + func (act,txt); + return TRUE; + } + gchar* txt = dom_tree_to_text (node); g_return_val_if_fail (txt, FALSE); diff --git a/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp b/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp index 5d56224664..db0d577b27 100644 --- a/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp +++ b/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp @@ -203,6 +203,12 @@ static inline gboolean set_spl_string (xmlNodePtr node, Split* spl, void (*func) (Split* spl, const char* txt)) { + if (auto txt = dom_node_to_text (node)) + { + func (spl, txt); + return TRUE; + } + gchar* tmp = dom_tree_to_text (node); g_return_val_if_fail (tmp, FALSE); @@ -251,6 +257,13 @@ static gboolean spl_reconciled_state_handler (xmlNodePtr node, gpointer data) { struct split_pdata* pdata = static_cast (data); + + if (auto txt = dom_node_to_text (node)) + { + xaccSplitSetReconcile (pdata->split, txt[0]); + return TRUE; + } + gchar* tmp = dom_tree_to_text (node); g_return_val_if_fail (tmp, FALSE); @@ -399,6 +412,12 @@ static inline gboolean set_tran_string (xmlNodePtr node, Transaction* trn, void (*func) (Transaction* trn, const char* txt)) { + if (auto txt = dom_node_to_text (node)) + { + func (trn, txt); + return TRUE; + } + gchar* tmp; tmp = dom_tree_to_text (node);