gnucash master: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Thu Nov 17 18:47:28 EST 2016


Updated	 via  https://github.com/Gnucash/gnucash/commit/0f506276 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d73c9bef (commit)
	 via  https://github.com/Gnucash/gnucash/commit/3afe27ec (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b847601e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/2c01bfba (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b683878a (commit)
	 via  https://github.com/Gnucash/gnucash/commit/00950e97 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b838c1eb (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f2eb13fc (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ada3a312 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c470d006 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/10b006fd (commit)
	 via  https://github.com/Gnucash/gnucash/commit/db719191 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ee0e61a0 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b2a644c2 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4ae5abf8 (commit)
	from  https://github.com/Gnucash/gnucash/commit/d1b406d8 (commit)



commit 0f506276ffeb75e42d56d49106dbbd2650581f92
Merge: d1b406d d73c9be
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Nov 17 15:38:08 2016 -0800

    Second interim merge of c++-backend.
    
    This is about as far as I can go on the SQL/DBI backend without changes
    to QofBackend, QofQuery, QofInstance, and the engine classes. The XML
    backend needs the same OO treatment before that's possible, so that's
    the next stage.


commit d73c9bef054e3b83e8081d5d469c98811938de52
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Nov 17 13:40:19 2016 -0800

    Remove two unnecessary local variable declarations.

diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index cb25055..96cd4b9 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -347,11 +347,9 @@ query_transactions (GncSqlBackend* sql_be, const GncSqlStatementPtr& stmt)
     if (result->begin() == result->end())
         return;
 
-    GList* node;
     Transaction* tx;
 #if LOAD_TRANSACTIONS_AS_NEEDED
     GSList* bal_list = NULL;
-    GSList* nextbal;
     Account* root = gnc_book_get_root_account (sql_be->book());
 
     qof_event_suspend ();
@@ -392,7 +390,7 @@ query_transactions (GncSqlBackend* sql_be, const GncSqlStatementPtr& stmt)
     // balance has changed, update the start balance so that the end
     // balance is the same as it was before the splits were loaded.
     // Repeat for cleared and reconciled balances.
-    for (nextbal = bal_list; nextbal != NULL; nextbal = nextbal->next)
+    for (auto nextbal = bal_list; nextbal != NULL; nextbal = nextbal->next)
     {
         full_acct_balances_t* balns = (full_acct_balances_t*)nextbal->data;
         gnc_numeric* pnew_end_bal;

commit 3afe27ec455e4be05ad31ac000e32fed095d67a6
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Nov 15 16:40:38 2016 -0800

    Convert foo_needing_parents to std::vector and its loops to std::remove_if.
    
    Fixing incorrect implementation in gnc-bill-term-sql and gnc-tax-table-sql,
    where there was no test for the parent actually having been loaded.
    Also #ifdef-out the starting balances part of GncSqlAccountBackend::load_all
    and move its variable decls inside the ifdef as auto.

diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 6d2cba1..f804d3c 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -65,6 +65,8 @@ static void set_parent_guid (gpointer pObject,  gpointer pValue);
 #define ACCOUNT_MAX_CODE_LEN 2048
 #define ACCOUNT_MAX_DESCRIPTION_LEN 2048
 
+using AccountVec = std::vector<Account*>;
+
 static const EntryVec col_table
 {
     gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid" ),
@@ -98,11 +100,14 @@ GncSqlAccountBackend::GncSqlAccountBackend() :
     GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT,
                         TABLE_NAME, col_table) {}
 
-typedef struct
+struct ParentGuid
 {
     Account* pAccount;
     GncGUID guid;
-} account_parent_guid_struct;
+};
+
+using ParentGuidPtr = ParentGuid*; // Can't pass std::shared_ptr<ParentGuid> as a gpointer.
+using ParentGuidVec = std::vector<ParentGuidPtr>;
 
 /* ================================================================= */
 
@@ -156,24 +161,20 @@ set_parent (gpointer pObject,  gpointer pValue)
 static void
 set_parent_guid (gpointer pObject,  gpointer pValue)
 {
-    account_parent_guid_struct* s = (account_parent_guid_struct*)pObject;
-    GncGUID* guid = (GncGUID*)pValue;
-
     g_return_if_fail (pObject != NULL);
     g_return_if_fail (pValue != NULL);
-
-    s->guid = *guid;
+    ParentGuidPtr s = reinterpret_cast<decltype(s)>(pObject);
+    s->guid = *static_cast<GncGUID*>(pValue);
 }
 
 static  Account*
 load_single_account (GncSqlBackend* sql_be, GncSqlRow& row,
-                     GList** l_accounts_needing_parents)
+                     ParentGuidVec& l_accounts_needing_parents)
 {
     const GncGUID* guid;
     Account* pAccount = NULL;
 
     g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (l_accounts_needing_parents != NULL, NULL);
 
     guid = gnc_sql_load_guid (sql_be, row);
     if (guid != NULL)
@@ -188,18 +189,17 @@ load_single_account (GncSqlBackend* sql_be, GncSqlRow& row,
     gnc_sql_load_object (sql_be, row, GNC_ID_ACCOUNT, pAccount, col_table);
     xaccAccountCommitEdit (pAccount);
 
-    /* If we don't have a parent and this isn't the root account, it might be because the parent
-       account hasn't been loaded yet.  Remember the account and its parent guid for later. */
+    /* If we don't have a parent and this isn't the root account, it might be
+       because the parent account hasn't been loaded yet.  Remember the account
+       and its parent guid for later. */
     if (gnc_account_get_parent (pAccount) == NULL
         && pAccount != gnc_book_get_root_account (sql_be->book()))
     {
-        account_parent_guid_struct* s = static_cast<decltype (s)> (
-                                            g_malloc (sizeof (account_parent_guid_struct)));
-        g_assert (s != NULL);
+        auto s = new ParentGuid;
 
         s->pAccount = pAccount;
         gnc_sql_load_object (sql_be, row, GNC_ID_ACCOUNT, s, parent_col_table);
-        *l_accounts_needing_parents = g_list_prepend (*l_accounts_needing_parents, s);
+        l_accounts_needing_parents.push_back(s);
     }
 
     return pAccount;
@@ -209,10 +209,7 @@ void
 GncSqlAccountBackend::load_all (GncSqlBackend* sql_be)
 {
     QofBook* pBook;
-    GList* l_accounts_needing_parents = NULL;
-    GSList* bal_slist;
-    GSList* bal;
-
+    ParentGuidVec l_accounts_needing_parents;
     g_return_if_fail (sql_be != NULL);
 
     ENTER ("");
@@ -224,7 +221,7 @@ GncSqlAccountBackend::load_all (GncSqlBackend* sql_be)
     auto stmt = sql_be->create_statement_from_sql(sql.str());
     auto result = sql_be->execute_select_statement(stmt);
     for (auto row : *result)
-        load_single_account (sql_be, row, &l_accounts_needing_parents);
+        load_single_account (sql_be, row, l_accounts_needing_parents);
 
     sql.str("");
     sql << "SELECT DISTINCT guid FROM " << TABLE_NAME;
@@ -236,60 +233,48 @@ GncSqlAccountBackend::load_all (GncSqlBackend* sql_be)
        items are removed from the front and added to the back if the
        parent is still not available, then eventually, the list will
        shrink to size 0. */
-    if (l_accounts_needing_parents != NULL)
+    if (!l_accounts_needing_parents.empty())
     {
-        gboolean progress_made = TRUE;
-        Account* root;
-        Account* pParent;
-        GList* elem;
-
+        auto progress_made = true;
+        std::reverse(l_accounts_needing_parents.begin(),
+                     l_accounts_needing_parents.end());
+	auto end = l_accounts_needing_parents.end();
         while (progress_made)
         {
-            progress_made = FALSE;
-            for (elem = l_accounts_needing_parents; elem != NULL;)
-            {
-                account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data;
-                pParent = xaccAccountLookup (&s->guid, sql_be->book());
-                if (pParent != NULL)
-                {
-                    GList* next_elem;
-
-                    gnc_account_append_child (pParent, s->pAccount);
-                    next_elem = g_list_next (elem);
-                    l_accounts_needing_parents = g_list_delete_link (l_accounts_needing_parents,
-                                                                     elem);
-                    g_free (s);
-                    elem = next_elem;
-                    progress_made = TRUE;
-                }
-                else
-                {
-                    /* Can't be up in the for loop because the 'then' clause reads inside a node freed
-                       by g_list_delete_link(). */
-                    elem = g_list_next (elem);
-                }
-            }
+            progress_made = false;
+            end = std::remove_if(l_accounts_needing_parents.begin(), end,
+				 [&](ParentGuidPtr s)
+				 {
+				     auto pParent = xaccAccountLookup (&s->guid,
+								       sql_be->book());
+				     if (pParent != nullptr)
+				     {
+					 gnc_account_append_child (pParent,
+								   s->pAccount);
+					 progress_made = true;
+					 delete s;
+					 return true;
+				     }
+				     return false;
+				 });
         }
 
         /* Any non-ROOT accounts left over must be parented by the root account */
-        root = gnc_book_get_root_account (pBook);
-        while (l_accounts_needing_parents != NULL)
-        {
-            account_parent_guid_struct* s = (account_parent_guid_struct*)
-                l_accounts_needing_parents->data;
-            if (xaccAccountGetType (s->pAccount) != ACCT_TYPE_ROOT)
-            {
-                gnc_account_append_child (root, s->pAccount);
-            }
-            g_free (s);
-            l_accounts_needing_parents = g_list_delete_link (l_accounts_needing_parents,
-                                                             l_accounts_needing_parents);
-        }
+        auto root = gnc_book_get_root_account (pBook);
+        end = std::remove_if(l_accounts_needing_parents.begin(), end,
+			     [&](ParentGuidPtr s)
+			     {
+				 if (xaccAccountGetType (s->pAccount) != ACCT_TYPE_ROOT)
+				     gnc_account_append_child (root, s->pAccount);
+				 delete s;
+				 return true;
+			     });
     }
 
+#if LOAD_TRANSACTIONS_AS_NEEDED
     /* Load starting balances */
-    bal_slist = gnc_sql_get_account_balances_slist (sql_be);
-    for (bal = bal_slist; bal != NULL; bal = bal->next)
+    auto bal_slist = gnc_sql_get_account_balances_slist (sql_be);
+    for (auto bal = bal_slist; bal != NULL; bal = bal->next)
     {
         acct_balances_t* balances = (acct_balances_t*)bal->data;
 
@@ -306,7 +291,7 @@ GncSqlAccountBackend::load_all (GncSqlBackend* sql_be)
     {
         g_slist_free (bal_slist);
     }
-
+#endif
     LEAVE ("");
 }
 
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index b95a902..4b5e011 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -102,12 +102,15 @@ GncSqlBillTermBackend::GncSqlBillTermBackend() :
         GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_BILLTERM,
                             TABLE_NAME, col_table) {}
 
-typedef struct
+struct BillTermParentGuid
 {
     GncBillTerm* billterm;
     GncGUID guid;
-    gboolean have_guid;
-} billterm_parent_guid_struct;
+    bool have_guid;
+};
+
+using BillTermParentGuidPtr = BillTermParentGuid*;
+using BillTermParentGuidVec = std::vector<BillTermParentGuidPtr>;
 
 static void
 set_invisible (gpointer data, gboolean value)
@@ -173,54 +176,43 @@ bt_set_parent (gpointer data, gpointer value)
 static void
 bt_set_parent_guid (gpointer pObject,  gpointer pValue)
 {
-    billterm_parent_guid_struct* s = (billterm_parent_guid_struct*)pObject;
-    GncGUID* guid = (GncGUID*)pValue;
-
     g_return_if_fail (pObject != NULL);
     g_return_if_fail (pValue != NULL);
 
-    s->guid = *guid;
-    s->have_guid = TRUE;
+    auto s = static_cast<BillTermParentGuidPtr>(pObject);
+    s->guid = *static_cast<GncGUID*>(pValue);
+    s->have_guid = true;
 }
 
 static GncBillTerm*
 load_single_billterm (GncSqlBackend* sql_be, GncSqlRow& row,
-                      GList** l_billterms_needing_parents)
+                      BillTermParentGuidVec& l_billterms_needing_parents)
 {
-    const GncGUID* guid;
-    GncBillTerm* pBillTerm;
-
     g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (sql_be, row);
-    pBillTerm = gncBillTermLookup (sql_be->book(), guid);
-    if (pBillTerm == NULL)
+    auto guid = gnc_sql_load_guid (sql_be, row);
+    auto pBillTerm = gncBillTermLookup (sql_be->book(), guid);
+    if (pBillTerm == nullptr)
     {
         pBillTerm = gncBillTermCreate (sql_be->book());
     }
     gnc_sql_load_object (sql_be, row, GNC_ID_BILLTERM, pBillTerm, col_table);
 
-    /* If the billterm doesn't have a parent, it might be because it hasn't been loaded yet.
-       If so, add this billterm to the list of billterms with no parent, along with the parent
-       GncGUID so that after they are all loaded, the parents can be fixed up. */
+    /* If the billterm doesn't have a parent, it might be because it hasn't been
+       loaded yet.  If so, add this billterm to the list of billterms with no
+       parent, along with the parent GncGUID so that after they are all loaded,
+       the parents can be fixed up. */
     if (gncBillTermGetParent (pBillTerm) == NULL)
     {
-        billterm_parent_guid_struct* s = static_cast<decltype (s)> (
-                                             g_malloc (sizeof (billterm_parent_guid_struct)));
-        g_assert (s != NULL);
-
-        s->billterm = pBillTerm;
-        s->have_guid = FALSE;
-        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, s, billterm_parent_col_table);
-        if (s->have_guid)
-        {
-            *l_billterms_needing_parents = g_list_prepend (*l_billterms_needing_parents,
-                                                           s);
-        }
-        else
-        {
-            g_free (s);
-        }
+        BillTermParentGuid s;
+
+        s.billterm = pBillTerm;
+        s.have_guid = false;
+        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, &s,
+                             billterm_parent_col_table);
+        if (s.have_guid)
+            l_billterms_needing_parents.push_back(new BillTermParentGuid(s));
+
     }
 
     qof_instance_mark_clean (QOF_INSTANCE (pBillTerm));
@@ -239,12 +231,12 @@ GncSqlBillTermBackend::load_all (GncSqlBackend* sql_be)
     auto stmt = sql_be->create_statement_from_sql(sql.str());
     auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
-    GList* l_billterms_needing_parents = NULL;
+    BillTermParentGuidVec l_billterms_needing_parents;
 
     for (auto row : *result)
     {
         auto pBillTerm =
-            load_single_billterm (sql_be, row, &l_billterms_needing_parents);
+            load_single_billterm (sql_be, row, l_billterms_needing_parents);
         if (pBillTerm != nullptr)
             instances.push_back(QOF_INSTANCE(pBillTerm));
     }
@@ -257,23 +249,31 @@ GncSqlBillTermBackend::load_all (GncSqlBackend* sql_be)
        items are removed from the front and added to the back if the
        parent is still not available, then eventually, the list will
        shrink to size 0. */
-    if (l_billterms_needing_parents != NULL)
+    if (!l_billterms_needing_parents.empty())
     {
-        gboolean progress_made = TRUE;
-        GList* elem;
-
+        bool progress_made = true;
+	std::reverse(l_billterms_needing_parents.begin(),
+		     l_billterms_needing_parents.end());
+	auto end = l_billterms_needing_parents.end();
         while (progress_made)
         {
-            progress_made = FALSE;
-            for (elem = l_billterms_needing_parents; elem != NULL;
-                 elem = g_list_next (elem))
-            {
-                billterm_parent_guid_struct* s = (billterm_parent_guid_struct*)elem->data;
-                bt_set_parent (s->billterm, &s->guid);
-                l_billterms_needing_parents = g_list_delete_link (l_billterms_needing_parents,
-                                                                  elem);
-                progress_made = TRUE;
-            }
+            progress_made = false;
+            end = std::remove_if(l_billterms_needing_parents.begin(), end,
+				 [&](BillTermParentGuidPtr s)
+				 {
+				     auto pBook = qof_instance_get_book (QOF_INSTANCE (s->billterm));
+				     auto parent = gncBillTermLookup (pBook,
+								      &s->guid);
+				     if (parent != nullptr)
+				     {
+					 gncBillTermSetParent (s->billterm, parent);
+					 gncBillTermSetChild (parent, s->billterm);
+					 progress_made = true;
+					 delete s;
+					 return true;
+				     }
+				     return false;
+				 });
         }
     }
 }
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index 3737440..02b95af 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -120,12 +120,15 @@ GncSqlTaxTableBackend::GncSqlTaxTableBackend() :
     GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_TAXTABLE,
                         TT_TABLE_NAME, tt_col_table) {}
 
-typedef struct
+struct TaxTblParentGuid
 {
     GncTaxTable* tt;
     GncGUID guid;
-    gboolean have_guid;
-} taxtable_parent_guid_struct;
+    bool have_guid;
+};
+
+using TaxTblParentGuidPtr = TaxTblParentGuid*;
+using TaxTblParentGuidVec = std::vector<TaxTblParentGuidPtr>;
 
 static gpointer
 get_obj_guid (gpointer pObject, const QofParam* param)
@@ -194,14 +197,12 @@ tt_set_parent (gpointer data, gpointer value)
 static void
 tt_set_parent_guid (gpointer pObject,  gpointer pValue)
 {
-    taxtable_parent_guid_struct* s = (taxtable_parent_guid_struct*)pObject;
-    GncGUID* guid = (GncGUID*)pValue;
-
     g_return_if_fail (pObject != NULL);
     g_return_if_fail (pValue != NULL);
 
-    s->guid = *guid;
-    s->have_guid = TRUE;
+    auto s = static_cast<TaxTblParentGuidPtr>(pObject);
+    s->guid = *static_cast<GncGUID*>(pValue);
+    s->have_guid = true;
 }
 
 static void
@@ -241,7 +242,7 @@ load_taxtable_entries (GncSqlBackend* sql_be, GncTaxTable* tt)
 
 static void
 load_single_taxtable (GncSqlBackend* sql_be, GncSqlRow& row,
-                      GList** l_tt_needing_parents)
+                      TaxTblParentGuidVec& l_tt_needing_parents)
 {
     const GncGUID* guid;
     GncTaxTable* tt;
@@ -250,7 +251,7 @@ load_single_taxtable (GncSqlBackend* sql_be, GncSqlRow& row,
 
     guid = gnc_sql_load_guid (sql_be, row);
     tt = gncTaxTableLookup (sql_be->book(), guid);
-    if (tt == NULL)
+    if (tt == nullptr)
     {
         tt = gncTaxTableCreate (sql_be->book());
     }
@@ -258,26 +259,21 @@ load_single_taxtable (GncSqlBackend* sql_be, GncSqlRow& row,
     gnc_sql_slots_load (sql_be, QOF_INSTANCE (tt));
     load_taxtable_entries (sql_be, tt);
 
-    /* If the tax table doesn't have a parent, it might be because it hasn't been loaded yet.
-       If so, add this tax table to the list of tax tables with no parent, along with the parent
-       GncGUID so that after they are all loaded, the parents can be fixed up. */
+    /* If the tax table doesn't have a parent, it might be because it hasn't
+       been loaded yet.  if so, add this tax table to the list of tax tables
+       with no parent, along with the parent GncGUID so that after they are all
+       loaded, the parents can be fixed up. */
     if (gncTaxTableGetParent (tt) == NULL)
     {
-        taxtable_parent_guid_struct* s = static_cast<decltype (s)> (
-                                             g_malloc (sizeof (taxtable_parent_guid_struct)));
-        g_assert (s != NULL);
-
-        s->tt = tt;
-        s->have_guid = FALSE;
-        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, s, tt_parent_col_table);
-        if (s->have_guid)
-        {
-            *l_tt_needing_parents = g_list_prepend (*l_tt_needing_parents, s);
-        }
-        else
-        {
-            g_free (s);
-        }
+        TaxTblParentGuid s;
+
+        s.tt = tt;
+        s.have_guid = false;
+        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, &s,
+                             tt_parent_col_table);
+        if (s.have_guid)
+            l_tt_needing_parents.push_back(new TaxTblParentGuid(s));
+
     }
 
     qof_instance_mark_clean (QOF_INSTANCE (tt));
@@ -293,31 +289,41 @@ GncSqlTaxTableBackend::load_all (GncSqlBackend* sql_be)
     sql << "SELECT * FROM " << TT_TABLE_NAME;
     auto stmt = sql_be->create_statement_from_sql(sql.str());
     auto result = sql_be->execute_select_statement(stmt);
-    GList* tt_needing_parents = NULL;
+    TaxTblParentGuidVec tt_needing_parents;
 
     for (auto row : *result)
-        load_single_taxtable (sql_be, row, &tt_needing_parents);
+        load_single_taxtable (sql_be, row, tt_needing_parents);
 
     /* While there are items on the list of taxtables needing parents,
        try to see if the parent has now been loaded.  Theory says that if
        items are removed from the front and added to the back if the
        parent is still not available, then eventually, the list will
        shrink to size 0. */
-    if (tt_needing_parents != NULL)
+    if (!tt_needing_parents.empty())
     {
-        gboolean progress_made = TRUE;
-        GList* elem;
-
+        bool progress_made = true;
+	std::reverse(tt_needing_parents.begin(),
+		     tt_needing_parents.end());
+	auto end = tt_needing_parents.end();
         while (progress_made)
         {
-            progress_made = FALSE;
-            for (elem = tt_needing_parents; elem != NULL; elem = g_list_next (elem))
-            {
-                taxtable_parent_guid_struct* s = (taxtable_parent_guid_struct*)elem->data;
-                tt_set_parent (s->tt, &s->guid);
-                tt_needing_parents = g_list_delete_link (tt_needing_parents, elem);
-                progress_made = TRUE;
-            }
+            progress_made = false;
+            end = std::remove_if(tt_needing_parents.begin(), end,
+				 [&](TaxTblParentGuidPtr s)
+				 {
+				     auto pBook = qof_instance_get_book (QOF_INSTANCE (s->tt));
+				     auto parent = gncTaxTableLookup (pBook,
+								      &s->guid);
+				     if (parent != nullptr)
+				     {
+					 tt_set_parent (s->tt, &s->guid);
+					 progress_made = true;
+					 delete s;
+					 return true;
+				     }
+				     return false;
+				 });
+
         }
     }
 }

commit b847601ebefd8ca0643a20f5f54a56b6a362588d
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Nov 14 13:38:44 2016 -0800

    Replace GStrings with std::strings.

diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index 068ca38..395167e 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -40,6 +40,9 @@ extern "C"
 #endif
 }
 
+#include <string>
+#include <sstream>
+
 #include "gnc-sql-connection.hpp"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
@@ -60,7 +63,7 @@ typedef enum
     LIST
 } context_t;
 
-typedef struct
+struct slot_info_t
 {
     GncSqlBackend* be;
     const GncGUID* guid;
@@ -70,8 +73,8 @@ typedef struct
     GList* pList;
     context_t context;
     KvpValue* pKvpValue;
-    GString* path;
-} slot_info_t;
+    std::string path;
+};
 
 
 static  gpointer get_obj_guid (gpointer pObject);
@@ -182,64 +185,34 @@ GncSqlSlotsBackend::GncSqlSlotsBackend() :
 
 /* ================================================================= */
 
-static gchar*
-get_key_from_path (GString* path)
+inline static std::string::size_type
+get_final_delim(std::string& path)
 {
-    gchar* str = NULL, *key = NULL, *ret = NULL;
-
-    g_return_val_if_fail (path != NULL, g_strdup (""));
-
-    if (path->str == NULL) return g_strdup ("");
-    str = g_strdup (path->str);
-    key = strrchr (str, '/');
-
-    /* Remove trailing /es */
-    if (key == NULL) return str;
-    while (str + strlen (str) - key == 1)
+    auto idx = path.rfind('/');
+    while (idx == path.length())
     {
-        *key = '\0';
-        key = strrchr (str, '/');
+        path.erase(idx);
+        idx = path.rfind('/');
     }
-    if (key == NULL) return str;
-    /* Now advance key past the last intermediate / to get the post-delimiter string */
-    while (*key == '/') ++key;
-
-    ret = g_strdup (key);
-    g_free (str);
-    return ret;
+    return idx;
 }
 
-static gchar*
-get_path_from_path (GString* path)
+static std::string
+get_key_from_path (std::string path)
 {
-    gchar* str = NULL, *key = NULL;
-
-    g_return_val_if_fail (path != NULL, NULL);
-
-    if (path->str == NULL) return NULL;
-    str = g_strdup (path->str);
-    key = strrchr (str, '/');
-    /* No /es means no path, just a key */
-    if (key == NULL)
-    {
-        g_free (str);
-        return NULL;
-    }
-    /* Remove trailing /es */
-    while (str + strlen (str) - key == 1)
-    {
-        *key = '\0';
-        key = strrchr (str, '/');
-    }
-    if (key == NULL)
-    {
-        g_free (str);
-        return NULL;
-    }
-    /* reterminate the string at the slash */
-    *key = '\0';
+    auto idx = get_final_delim(path);
+    if (idx == std::string::npos)
+        return path;
+    return path.substr(idx);
+}
 
-    return str;
+static std::string
+get_path_from_path (std::string path)
+{
+    auto idx = get_final_delim(path);
+    if (idx == std::string::npos)
+        return "";
+    return path.substr(0, idx);
 }
 
 static void
@@ -252,9 +225,8 @@ set_slot_from_value (slot_info_t* pInfo, KvpValue* pValue)
     {
     case FRAME:
     {
-        gchar* key = get_key_from_path (pInfo->path);
-        pInfo->pKvpFrame->set (key, pValue);
-        g_free (key);
+        auto key = get_key_from_path (pInfo->path);
+        pInfo->pKvpFrame->set (key.c_str(), pValue);
         break;
     }
     case LIST:
@@ -265,17 +237,15 @@ set_slot_from_value (slot_info_t* pInfo, KvpValue* pValue)
     case NONE:
     default:
     {
-        gchar* key = get_key_from_path (pInfo->path);
-        gchar* path = get_path_from_path (pInfo->path);
+        auto key = get_key_from_path (pInfo->path);
+        auto path = get_path_from_path (pInfo->path);
         auto frame = pInfo->pKvpFrame;
-        if (path)
+        if (!path.empty())
         {
-            frame->set_path ({path, key}, pValue);
-            g_free (path);
+            frame->set_path ({path.c_str(), key.c_str()}, pValue);
         }
         else
-            frame->set (key, pValue);
-        g_free (key);
+            frame->set (key.c_str(), pValue);
         break;
     }
     }
@@ -304,22 +274,14 @@ get_path (gpointer pObject)
 
     g_return_val_if_fail (pObject != NULL, NULL);
 
-    return (gpointer)pInfo->path->str;
+    return (gpointer)pInfo->path.c_str();
 }
 
 static void
 set_path (gpointer pObject,  gpointer pValue)
 {
     slot_info_t* pInfo = (slot_info_t*)pObject;
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (pValue != NULL);
-
-    if (pInfo->path != NULL)
-    {
-        (void)g_string_free (pInfo->path, TRUE);
-    }
-    pInfo->path = g_string_new ((gchar*)pValue);
+    pInfo->path = static_cast<char*>(pValue);
 }
 
 static KvpValue::Type
@@ -497,16 +459,14 @@ set_guid_val (gpointer pObject,  gpointer pValue)
     {
         slot_info_t* newInfo = slot_info_copy (pInfo, (GncGUID*)pValue);
         KvpValue* pValue = NULL;
-        gchar* key = get_key_from_path (pInfo->path);
+        auto key = get_key_from_path (pInfo->path);
 
         newInfo->context = LIST;
 
         slots_load_info (newInfo);
         pValue = new KvpValue {newInfo->pList};
-        pInfo->pKvpFrame->set (key, pValue);
-        g_string_free (newInfo->path, TRUE);
-        g_slice_free (slot_info_t, newInfo);
-        g_free (key);
+        pInfo->pKvpFrame->set (key.c_str(), pValue);
+	delete newInfo;
         break;
     }
     case KvpValue::Type::FRAME:
@@ -520,26 +480,22 @@ set_guid_val (gpointer pObject,  gpointer pValue)
         case LIST:
         {
             auto value = new KvpValue {newFrame};
-            gchar* key = get_key_from_path (pInfo->path);
-            newInfo->path = g_string_assign (newInfo->path, key);
+            newInfo->path = get_key_from_path (pInfo->path);
             pInfo->pList = g_list_append (pInfo->pList, value);
-            g_free (key);
             break;
         }
         case FRAME:
         default:
         {
-            gchar* key = get_key_from_path (pInfo->path);
-            pInfo->pKvpFrame->set (key, new KvpValue {newFrame});
-            g_free (key);
+            auto key = get_key_from_path (pInfo->path);
+            pInfo->pKvpFrame->set (key.c_str(), new KvpValue {newFrame});
             break;
         }
         }
 
         newInfo->context = FRAME;
         slots_load_info (newInfo);
-        g_string_free (newInfo->path, TRUE);
-        g_slice_free (slot_info_t, newInfo);
+        delete newInfo;
         break;
     }
     default:
@@ -610,9 +566,8 @@ set_gdate_val (gpointer pObject, GDate* value)
 static slot_info_t*
 slot_info_copy (slot_info_t* pInfo, GncGUID* guid)
 {
-    slot_info_t* newSlot;
     g_return_val_if_fail (pInfo != NULL, NULL);
-    newSlot = g_slice_new0 (slot_info_t);
+    auto newSlot = new slot_info_t;
 
     newSlot->be = pInfo->be;
     newSlot->guid = guid == NULL ? pInfo->guid : guid;
@@ -622,17 +577,15 @@ slot_info_copy (slot_info_t* pInfo, GncGUID* guid)
     newSlot->pList = pInfo->pList;
     newSlot->context = pInfo->context;
     newSlot->pKvpValue = pInfo->pKvpValue;
-    newSlot->path = g_string_new (pInfo->path->str);
+    newSlot->path.clear();
     return newSlot;
 }
 
 static void
-save_slot (const gchar* key, KvpValue* value, gpointer data)
+save_slot (const char* key, KvpValue* value, gpointer data)
 {
     slot_info_t* pSlot_info = (slot_info_t*)data;
-    gsize curlen;
 
-    g_return_if_fail (key != NULL);
     g_return_if_fail (value != NULL);
     g_return_if_fail (data != NULL);
 
@@ -641,14 +594,12 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
     {
         return;
     }
-
-    curlen = pSlot_info->path->len;
+    auto curlen = pSlot_info->path.length();
     pSlot_info->pKvpValue = value;
     if (curlen != 0)
-    {
-        (void)g_string_append (pSlot_info->path, "/");
-    }
-    (void)g_string_append (pSlot_info->path, key);
+        pSlot_info->path += "/";
+
+    pSlot_info->path += key;
     pSlot_info->value_type = value->get_type ();
 
     switch (pSlot_info->value_type)
@@ -669,8 +620,7 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
         pKvpFrame->for_each_slot (save_slot, pNewInfo);
         delete pSlot_info->pKvpValue;
         pSlot_info->pKvpValue = oldValue;
-        g_string_free (pNewInfo->path, TRUE);
-        g_slice_free (slot_info_t, pNewInfo);
+        delete pNewInfo;
     }
     break;
     case KvpValue::Type::GLIST:
@@ -692,8 +642,7 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
         }
         delete pSlot_info->pKvpValue;
         pSlot_info->pKvpValue = oldValue;
-        g_string_free (pNewInfo->path, TRUE);
-        g_slice_free (slot_info_t, pNewInfo);
+        delete pNewInfo;
     }
     break;
     default:
@@ -707,14 +656,15 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
     break;
     }
 
-    (void)g_string_truncate (pSlot_info->path, curlen);
+    pSlot_info->path.erase(curlen);
 }
 
 gboolean
 gnc_sql_slots_save (GncSqlBackend* sql_be, const GncGUID* guid, gboolean is_infant,
                     QofInstance* inst)
 {
-    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
+    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID,
+                              NULL, FRAME, NULL, "" };
     KvpFrame* pFrame = qof_instance_get_slots (inst);
 
     g_return_val_if_fail (sql_be != NULL, FALSE);
@@ -730,7 +680,6 @@ gnc_sql_slots_save (GncSqlBackend* sql_be, const GncGUID* guid, gboolean is_infa
     slot_info.be = sql_be;
     slot_info.guid = guid;
     pFrame->for_each_slot (save_slot, &slot_info);
-    (void)g_string_free (slot_info.path, TRUE);
 
     return slot_info.is_ok;
 }
@@ -740,7 +689,8 @@ gnc_sql_slots_delete (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     gchar* buf;
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
-    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
+    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID,
+                              NULL, FRAME, NULL, "" };
 
     g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
@@ -792,15 +742,9 @@ load_slot (slot_info_t* pInfo, GncSqlRow& row)
     g_return_if_fail (pInfo->pKvpFrame != NULL);
 
     slot_info = slot_info_copy (pInfo, NULL);
-    g_string_free (slot_info->path, TRUE);
-    slot_info->path = NULL;
 
     gnc_sql_load_object (pInfo->be, row, TABLE_NAME, slot_info, col_table);
 
-    if (slot_info->path != NULL)
-    {
-        (void)g_string_free (slot_info->path, TRUE);
-    }
     if (slot_info->pList != pInfo->pList)
     {
         if (pInfo->pList != NULL)
@@ -812,13 +756,14 @@ load_slot (slot_info_t* pInfo, GncSqlRow& row)
             pInfo->pList = slot_info->pList;
         }
     }
-    g_slice_free (slot_info_t, slot_info);
+    delete slot_info;
 }
 
 void
 gnc_sql_slots_load (GncSqlBackend* sql_be, QofInstance* inst)
 {
-    slot_info_t info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
+    slot_info_t info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID,
+                         NULL, FRAME, NULL, "" };
     g_return_if_fail (sql_be != NULL);
     g_return_if_fail (inst != NULL);
 
@@ -870,7 +815,8 @@ static void
 load_slot_for_list_item (GncSqlBackend* sql_be, GncSqlRow& row,
                          QofCollection* coll)
 {
-    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL };
+    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID,
+                              NULL, FRAME, NULL, "" };
     const GncGUID* guid;
     QofInstance* inst;
 
@@ -887,10 +833,7 @@ load_slot_for_list_item (GncSqlBackend* sql_be, GncSqlRow& row,
 
     gnc_sql_load_object (sql_be, row, TABLE_NAME, &slot_info, col_table);
 
-    if (slot_info.path != NULL)
-    {
-        (void)g_string_free (slot_info.path, TRUE);
-    }
+
 }
 
 void
@@ -935,7 +878,8 @@ static void
 load_slot_for_book_object (GncSqlBackend* sql_be, GncSqlRow& row,
                            BookLookupFn lookup_fn)
 {
-    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL };
+    slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID,
+                              NULL, FRAME, NULL, "" };
     const GncGUID* guid;
     QofInstance* inst;
 
@@ -949,14 +893,9 @@ load_slot_for_book_object (GncSqlBackend* sql_be, GncSqlRow& row,
 
     slot_info.be = sql_be;
     slot_info.pKvpFrame = qof_instance_get_slots (inst);
-    slot_info.path = NULL;
+    slot_info.path.clear();
 
     gnc_sql_load_object (sql_be, row, TABLE_NAME, &slot_info, col_table);
-
-    if (slot_info.path != NULL)
-    {
-        (void)g_string_free (slot_info.path, TRUE);
-    }
 }
 
 /**
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 1fbdf94..cb25055 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -49,6 +49,9 @@ extern "C"
 #endif
 }
 
+#include <string>
+#include <sstream>
+
 #include "escape.h"
 
 #include <gnc-datetime.hpp>
@@ -780,54 +783,41 @@ GncSqlTransBackend::load_all (GncSqlBackend* sql_be)
 
 static void
 convert_query_comparison_to_sql (QofQueryPredData* pPredData,
-                                 gboolean isInverted, GString* sql)
+                                 gboolean isInverted, std::stringstream& sql)
 {
     if (pPredData->how == QOF_COMPARE_LT
         || (isInverted && pPredData->how == QOF_COMPARE_GTE))
-    {
-        g_string_append (sql, "<");
-    }
+        sql << "<";
     else if (pPredData->how == QOF_COMPARE_LTE
              || (isInverted && pPredData->how == QOF_COMPARE_GT))
-    {
-        g_string_append (sql, "<=");
-    }
+        sql << "<=";
     else if (pPredData->how == QOF_COMPARE_EQUAL
              || (isInverted && pPredData->how == QOF_COMPARE_NEQ))
-    {
-        g_string_append (sql, "=");
-    }
+        sql << "=";
     else if (pPredData->how == QOF_COMPARE_GT
              || (isInverted && pPredData->how == QOF_COMPARE_LTE))
-    {
-        g_string_append (sql, ">");
-    }
+        sql << ">";
     else if (pPredData->how == QOF_COMPARE_GTE
              || (isInverted && pPredData->how == QOF_COMPARE_LT))
-    {
-        g_string_append (sql, ">=");
-    }
+        sql << ">=";
     else if (pPredData->how == QOF_COMPARE_NEQ
              || (isInverted && pPredData->how == QOF_COMPARE_EQUAL))
-    {
-        g_string_append (sql, "~=");
-    }
+        sql <<  "~=";
     else
     {
         PERR ("Unknown comparison type\n");
-        g_string_append (sql, "??");
+        sql << "??";
     }
 }
 
 static void
 convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
-                           QofQueryTerm* pTerm, GString* sql)
+                           QofQueryTerm* pTerm, std::stringstream& sql)
 {
     QofQueryPredData* pPredData;
     gboolean isInverted;
 
     g_return_if_fail (pTerm != NULL);
-    g_return_if_fail (sql != NULL);
 
     pPredData = qof_query_term_get_pred_data (pTerm);
     isInverted = qof_query_term_is_inverted (pTerm);
@@ -836,20 +826,16 @@ convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
     {
         query_guid_t guid_data = (query_guid_t)pPredData;
         GList* guid_entry;
-
-        g_string_append (sql, "(");
-        g_string_append (sql, fieldName);
+        sql << "(" << fieldName;
 
         switch (guid_data->options)
         {
         case QOF_GUID_MATCH_ANY:
-            if (isInverted) g_string_append (sql, " NOT IN (");
-            else g_string_append (sql, " IN (");
+            sql << (isInverted ? " NOT IN (" : " IN (");
             break;
 
         case QOF_GUID_MATCH_NONE:
-            if (isInverted) g_string_append (sql, " IN (");
-            else g_string_append (sql, " NOT IN (");
+            sql << (isInverted ? " IN (" : " NOT IN (");
             break;
 
         default:
@@ -861,12 +847,12 @@ convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
         {
             gchar guid_buf[GUID_ENCODING_LENGTH + 1];
 
-            if (guid_entry != guid_data->guids) g_string_append (sql, ",");
+            if (guid_entry != guid_data->guids) sql << ",";
             (void)guid_to_string_buff (static_cast<GncGUID*> (guid_entry->data),
                                        guid_buf);
-            g_string_append_printf (sql, "'%s'", guid_buf);
+            sql << guid_buf;
         }
-        g_string_append (sql, "))");
+        sql << "))";
 
     }
     else if (g_strcmp0 (pPredData->type_name, QOF_TYPE_CHAR) == 0)
@@ -874,130 +860,86 @@ convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
         query_char_t char_data = (query_char_t)pPredData;
         int i;
 
-        if (isInverted)
-        {
-            g_string_append (sql, "NOT(");
-        }
-        if (char_data->options == QOF_CHAR_MATCH_NONE)
-        {
-            g_string_append (sql, "NOT ");
-        }
-        g_string_append (sql, "(");
+        if (isInverted) sql <<  "NOT(";
+        if (char_data->options == QOF_CHAR_MATCH_NONE) sql << "NOT ";
+        sql << "(";
         for (i = 0; char_data->char_list[i] != '\0'; i++)
         {
-            if (i != 0)
-            {
-                g_string_append (sql, " OR ");
-            }
-            g_string_append (sql, fieldName);
-            g_string_append (sql, " = '");
-            g_string_append_c (sql, char_data->char_list[i]);
-            g_string_append (sql, "'");
-        }
-        g_string_append (sql, ") ");
-        if (isInverted)
-        {
-            g_string_append (sql, ") ");
+            if (i != 0) sql << " OR ";
+            sql << fieldName << " = '" << char_data->char_list[i] << "'";
         }
-
+        sql << ") ";
+        if (isInverted) sql << ") ";
     }
     else if (g_strcmp0 (pPredData->type_name, QOF_TYPE_STRING) == 0)
     {
         query_string_t string_data = (query_string_t)pPredData;
         sqlEscape* escape = sqlEscape_new ();
 
-        if (isInverted)
-        {
-            g_string_append (sql, "NOT(");
-        }
-        if (pPredData->how == QOF_COMPARE_NEQ)
-        {
-            g_string_append (sql, "NOT(");
-        }
-        g_string_append (sql, fieldName);
+        if (isInverted ||  pPredData->how == QOF_COMPARE_NEQ)
+            sql << "NOT(";
+        sql << fieldName;
         if (string_data->is_regex ||
             string_data->options == QOF_STRING_MATCH_CASEINSENSITIVE)
         {
             PWARN ("String is_regex || option = QOF_STRING_MATCH_INSENSITIVE\n");
         }
-//          g_string_append( sql, " ~" );
+//          sql << " ~" ;
 //      } else {
-        g_string_append (sql, " =");
+        sql << " =";
 //      }
 //      if( string_data->options == QOF_STRING_MATCH_CASEINSENSITIVE ) {
-//          g_string_append( sql, "*" );
+//          sql+= "*";
 //      }
-        g_string_append (sql, "'");
-        g_string_append (sql, sqlEscapeString (escape, string_data->matchstring));
-        g_string_append (sql, "'");
-        if (pPredData->how == QOF_COMPARE_NEQ)
-        {
-            g_string_append (sql, ")");
-        }
-        if (isInverted)
-        {
-            g_string_append (sql, ")");
-        }
+        sql << "'" << sqlEscapeString (escape, string_data->matchstring) << "'";
+        if (pPredData->how == QOF_COMPARE_NEQ) sql << ")";
+        if (isInverted) sql << ")";
         sqlEscape_destroy (escape);
 
     }
     else
     {
-        g_string_append (sql, "(");
-        g_string_append (sql, fieldName);
+        sql << "(" << fieldName;
         convert_query_comparison_to_sql (pPredData, isInverted, sql);
 
         if (strcmp (pPredData->type_name, QOF_TYPE_NUMERIC) == 0)
         {
             query_numeric_t pData = (query_numeric_t)pPredData;
-            double d = gnc_numeric_to_double (pData->amount);
-
-            g_string_append_printf (sql, "%f", d);
-
+            sql << gnc_numeric_to_double (pData->amount);
         }
         else if (g_strcmp0 (pPredData->type_name, QOF_TYPE_DATE) == 0)
         {
             query_date_t date_data = (query_date_t)pPredData;
 
             GncDateTime time(date_data->date.tv_sec);
-            auto datebuf = time.format_zulu ("%Y-%m-%d %H:%M%S");
-            g_string_append_printf (sql, "'%s'", datebuf.c_str());
-
+            sql << time.format_zulu ("%Y-%m-%d %H:%M%S");
         }
         else if (strcmp (pPredData->type_name, QOF_TYPE_INT32) == 0)
         {
             query_int32_t pData = (query_int32_t)pPredData;
-
-            g_string_append_printf (sql, "%d", pData->val);
-
+            sql << pData->val;
         }
         else if (strcmp (pPredData->type_name, QOF_TYPE_INT64) == 0)
         {
             query_int64_t pData = (query_int64_t)pPredData;
-
-            g_string_append_printf (sql, "%" G_GINT64_FORMAT, pData->val);
-
+            sql << pData->val;
         }
         else if (strcmp (pPredData->type_name, QOF_TYPE_DOUBLE) == 0)
         {
             query_double_t pData = (query_double_t)pPredData;
-
-            g_string_append_printf (sql, "%f", pData->val);
-
+            sql << pData->val;
         }
         else if (strcmp (pPredData->type_name, QOF_TYPE_BOOLEAN) == 0)
         {
             query_boolean_t pData = (query_boolean_t)pPredData;
-
-            g_string_append_printf (sql, "%d", pData->val);
-
+            sql << pData->val;
         }
         else
         {
             PERR ("Unknown query predicate type: %s\n", pPredData->type_name);
         }
 
-        g_string_append (sql, ")");
+        sql << ")";
     }
 }
 
@@ -1027,7 +969,7 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
     {
         GList* orterms = qof_query_get_terms (query);
         GList* orTerm;
-        GString* sql = g_string_new ("");
+        std::stringstream sql;
         gboolean need_OR = FALSE;
 
         for (orTerm = orterms; orTerm != NULL; orTerm = orTerm->next)
@@ -1040,9 +982,9 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
 #endif
             if (need_OR)
             {
-                g_string_append (sql, " OR ");
+                sql << " OR ";
             }
-            g_string_append (sql, "(");
+            sql << "(";
             for (andTerm = andterms; andTerm != NULL; andTerm = andTerm->next)
             {
                 QofQueryTerm* term;
@@ -1061,12 +1003,13 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
                     strcmp (next_path, QOF_PARAM_GUID) != 0) continue;
 #endif
 
-                if (need_AND) g_string_append (sql, " AND ");
+                if (need_AND) sql<< " AND ";
 
                 if (strcmp (path, SPLIT_ACCOUNT) == 0 &&
                     strcmp (next_path, QOF_PARAM_GUID) == 0)
                 {
-                    convert_query_term_to_sql (sql_be, "s.account_guid", term, sql);
+                    convert_query_term_to_sql (sql_be, "s.account_guid", term,
+                                               sql);
 #if SIMPLE_QUERY_COMPILATION
                     goto done_compiling_query;
 #endif
@@ -1074,7 +1017,8 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
                 }
                 else if (strcmp (path, SPLIT_RECONCILE) == 0)
                 {
-                    convert_query_term_to_sql (sql_be, "s.reconcile_state", term, sql);
+                    convert_query_term_to_sql (sql_be, "s.reconcile_state",
+                                               term, sql);
 
                 }
                 else if (strcmp (path, SPLIT_TRANS) == 0)
@@ -1082,17 +1026,19 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
 #if TX_GUID_CHECK
                     if (!has_tx_guid_check)
                     {
-                        g_string_append (sql, "(splits.tx_guid = transactions.guid) AND ");
+                        sql << "(splits.tx_guid = transactions.guid) AND ");
                         has_tx_guid_check = TRUE;
                     }
 #endif
                     if (strcmp (next_path, TRANS_DATE_POSTED) == 0)
                     {
-                        convert_query_term_to_sql (sql_be, "t.post_date", term, sql);
+                        convert_query_term_to_sql (sql_be, "t.post_date", term,
+                                                   sql);
                     }
                     else if (strcmp (next_path, TRANS_DESCRIPTION) == 0)
                     {
-                        convert_query_term_to_sql (sql_be, "t.description", term, sql);
+                        convert_query_term_to_sql (sql_be, "t.description",
+                                                   term, sql);
                     }
                     else
                     {
@@ -1102,8 +1048,9 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
                 }
                 else if (strcmp (path, SPLIT_VALUE) == 0)
                 {
-                    convert_query_term_to_sql (sql_be, "s.value_num/s.value_denom", term, sql);
-
+                    convert_query_term_to_sql (sql_be,
+                                               "s.value_num/s.value_denom",
+                                               term, sql);
                 }
                 else
                 {
@@ -1112,29 +1059,30 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
 
                 if (unknownPath)
                 {
-                    GString* name = g_string_new ((gchar*)paramPath->data);
-                    while (paramPath->next != NULL)
+                    std::stringstream name;
+                    name << static_cast<char*>(paramPath->data);
+                    for (;paramPath->next != NULL; paramPath = paramPath->next)
                     {
-                        g_string_append (name, ".");
-                        g_string_append (name, next_path);
-                        paramPath = paramPath->next;
+                        next_path =
+                            static_cast<decltype (next_path)>(paramPath->next->data);
+                        name << "." << next_path;
                     }
-                    PERR ("Unknown SPLIT query field: %s\n", name->str);
-                    g_string_free (name, TRUE);
+                    PERR ("Unknown SPLIT query field: %s\n",
+                          name.str().c_str());
                 }
                 need_AND = TRUE;
             }
 
             /* If the last char in the string is a '(', then for some reason, there were
                no terms added to the SQL.  If so, remove it and ignore the OR term. */
-            if (sql->str[sql->len - 1] == '(')
+        if (!sql.str().empty() && sql.str().back() == '(')
             {
-                g_string_truncate (sql, sql->len - 1);
+                sql.str().erase(sql.str().back());
                 need_OR = FALSE;
             }
             else
             {
-                g_string_append (sql, ")");
+                sql << ")";
                 need_OR = TRUE;
             }
         }
@@ -1142,22 +1090,20 @@ compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
 #if SIMPLE_QUERY_COMPILATION
 done_compiling_query:
 #endif
-        if (sql->len != 0)
+    if (!sql.str().empty())
         {
 #if SIMPLE_QUERY_COMPILATION
-            g_string_append (sql, ")");
+            sql<< ")";
 #endif
             query_sql = g_strdup_printf (
                             "SELECT DISTINCT t.* FROM %s AS t, %s AS s WHERE s.tx_guid=t.guid AND %s",
-                            TRANSACTION_TABLE, SPLIT_TABLE, sql->str);
+                            TRANSACTION_TABLE, SPLIT_TABLE, sql.str().c_str());
         }
         else
         {
             query_sql = g_strdup_printf ("SELECT * FROM %s", TRANSACTION_TABLE);
         }
         query_info->stmt = sql_be->create_statement_from_sql(query_sql);
-
-        g_string_free (sql, TRUE);
         g_free (query_sql);
 
     }

commit 2c01bfba1359b3b6437b02511777e2d12d05d069
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 13 17:21:06 2016 -0800

    Move gnc_sql_save_commodity to GncSqlBackend, with some restructuring.

diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 6e37c42..6d2cba1 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -352,7 +352,7 @@ GncSqlAccountBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     // If not deleting the account, ensure the commodity is in the db
     if (op != OP_DB_DELETE && commodity != NULL)
     {
-        is_ok = gnc_sql_save_commodity (sql_be, commodity);
+        is_ok = sql_be->save_commodity(commodity);
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index 2904cfc..9c88801 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -221,41 +221,6 @@ GncSqlCommodityBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     return do_commit_commodity (sql_be, inst, FALSE);
 }
 
-static gboolean
-is_commodity_in_db (GncSqlBackend* sql_be, gnc_commodity* pCommodity)
-{
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-    g_return_val_if_fail (pCommodity != NULL, FALSE);
-
-    return sql_be->object_in_db (COMMODITIES_TABLE, GNC_ID_COMMODITY,
-                                 pCommodity, col_table);
-}
-
-gboolean
-gnc_sql_save_commodity (GncSqlBackend* sql_be, gnc_commodity* pCommodity)
-{
-    gboolean is_ok = TRUE;
-
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-    g_return_val_if_fail (pCommodity != NULL, FALSE);
-
-    if (!is_commodity_in_db (sql_be, pCommodity))
-    {
-        is_ok = do_commit_commodity (sql_be, QOF_INSTANCE (pCommodity), TRUE);
-    }
-
-    return is_ok;
-}
-
-void
-gnc_sql_commit_commodity (gnc_commodity* pCommodity)
-{
-    g_return_if_fail (pCommodity != NULL);
-    g_return_if_fail (GNC_IS_COMMODITY (pCommodity));
-    gnc_commodity_begin_edit (pCommodity);
-    gnc_commodity_commit_edit (pCommodity);
-}
-
 /* ----------------------------------------------------------------- */
 template<> void
 GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::load (const GncSqlBackend* sql_be,
diff --git a/src/backend/sql/gnc-commodity-sql.h b/src/backend/sql/gnc-commodity-sql.h
index 41f4ad1..ba32b3f 100644
--- a/src/backend/sql/gnc-commodity-sql.h
+++ b/src/backend/sql/gnc-commodity-sql.h
@@ -45,9 +45,4 @@ public:
     bool commit(GncSqlBackend*, QofInstance*) override;
 };
 
-
-gboolean gnc_sql_save_commodity (GncSqlBackend* sql_be,
-                                 gnc_commodity* pCommodity);
-void gnc_sql_commit_commodity (gnc_commodity* pCommodity);
-
 #endif /* GNC_COMMODITY_SQL_H */
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index f616577..9382be7 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -181,7 +181,7 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (sql_be, gncEmployeeGetCurrency (emp));
+        is_ok = sql_be->save_commodity(gncEmployeeGetCurrency (emp));
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index 033dce4..518caa0 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -205,7 +205,7 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (sql_be, gncInvoiceGetCurrency (invoice));
+        is_ok = sql_be->save_commodity(gncInvoiceGetCurrency(invoice));
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 928f2ae..d8e952e 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -187,8 +187,8 @@ GncSqlPriceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         /* Ensure commodity and currency are in the db */
-        (void)gnc_sql_save_commodity (sql_be, gnc_price_get_commodity (pPrice));
-        is_ok = gnc_sql_save_commodity (sql_be, gnc_price_get_currency (pPrice));
+        (void)sql_be->save_commodity(gnc_price_get_commodity(pPrice));
+        is_ok = sql_be->save_commodity(gnc_price_get_currency(pPrice));
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 24129c2..9dd8064 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -314,7 +314,10 @@ GncSqlBackend::load (QofBook* book, QofBackendLoadType loadType)
 
     m_loading = FALSE;
     std::for_each(m_postload_commodities.begin(), m_postload_commodities.end(),
-                 [](gnc_commodity* comm) { gnc_sql_commit_commodity (comm); });
+                 [](gnc_commodity* comm) {
+                      gnc_commodity_begin_edit(comm);
+                      gnc_commodity_commit_edit(comm);
+                  });
     m_postload_commodities.empty();
 
     /* Mark the sessoion as clean -- though it should never be marked
@@ -847,6 +850,17 @@ GncSqlBackend::do_db_operation (E_DB_OPERATION op, const char* table_name,
     return (execute_nonselect_statement(stmt) != -1);
 }
 
+bool
+GncSqlBackend::save_commodity(gnc_commodity* comm) noexcept
+{
+    if (comm == nullptr) return false;
+    QofInstance* inst = QOF_INSTANCE(comm);
+    auto obe = m_backend_registry.get_object_backend(std::string(inst->e_type));
+    if (obe && !obe->instance_in_db(this, inst))
+        return obe->commit(this, inst);
+    return true;
+}
+
 GncSqlStatementPtr
 GncSqlBackend::build_insert_statement (const char* table_name,
                                        QofIdTypeConst obj_name,
diff --git a/src/backend/sql/gnc-sql-backend.hpp b/src/backend/sql/gnc-sql-backend.hpp
index 41aaf4d..3146960 100644
--- a/src/backend/sql/gnc-sql-backend.hpp
+++ b/src/backend/sql/gnc-sql-backend.hpp
@@ -225,7 +225,14 @@ public:
     bool do_db_operation (E_DB_OPERATION op, const char* table_name,
                           QofIdTypeConst obj_name, gpointer pObject,
                           const EntryVec& table) const noexcept;
-
+    /**
+     * Ensure that a commodity referenced in another object is in fact saved
+     * in the database.
+     *
+     * @param comm The commodity in question
+     * @return true if the commodity needed to be saved.
+     */
+    bool save_commodity(gnc_commodity* comm) noexcept;
     QofBook* book() const noexcept { return m_book; }
     void set_loading(bool loading) noexcept { m_loading = loading; }
     bool pristine() const noexcept { return m_is_pristine_db; }
diff --git a/src/backend/sql/gnc-sql-object-backend.cpp b/src/backend/sql/gnc-sql-object-backend.cpp
index c3d325e..dbaeaed 100644
--- a/src/backend/sql/gnc-sql-object-backend.cpp
+++ b/src/backend/sql/gnc-sql-object-backend.cpp
@@ -87,3 +87,11 @@ GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
         PERR("Version mismatch in table %s, expecting %d but backend is %d."
              "Table creation aborted.", m_table_name.c_str(), m_version, version);
 }
+
+bool
+GncSqlObjectBackend::instance_in_db(const GncSqlBackend* sql_be,
+                                    QofInstance* inst) const noexcept
+{
+    return sql_be->object_in_db(m_table_name.c_str(), m_type_name.c_str(),
+                                inst, m_col_table);
+}
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
index 17bf6ea..20b392e 100644
--- a/src/backend/sql/gnc-sql-object-backend.hpp
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -97,6 +97,14 @@ public:
     const bool is_version (int version) const noexcept {
         return version == m_version;
     }
+    /**
+     * Check the presence of an object in the backend's database.
+     *
+     * @param sql_be Backend owning the database
+     * @param inst QofInstance to be checked.
+     */
+    bool instance_in_db(const GncSqlBackend* sql_be,
+                        QofInstance* inst) const noexcept;
 protected:
     const std::string m_table_name;
     const int m_version;
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 84f598a..1fbdf94 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -657,7 +657,7 @@ GncSqlTransBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     {
         gnc_commodity* commodity = xaccTransGetCurrency (pTx);
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (sql_be, commodity);
+        is_ok = sql_be->save_commodity(commodity);
         if (! is_ok)
         {
             err = "Commodity save failed: Probably an invalid or missing currency";
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index d801987..db443ca 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -160,7 +160,7 @@ GncSqlVendorBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (sql_be, gncVendorGetCurrency (v));
+        is_ok = sql_be->save_commodity (gncVendorGetCurrency(v));
     }
     if (is_ok)
     {

commit b683878a2511f1024fe39c0b150ab910ce4cdefe
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 13 15:17:09 2016 -0800

    Remove gnc-backend-sql.h and gnc-backend-sql.cpp.
    
    Having removed all of their code to somewhere else.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index dd4a7c9..8c00ec5 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -80,7 +80,6 @@ extern "C"
 #include "gnc-backend-dbi.hpp"
 
 #include <gnc-sql-object-backend.hpp>
-#include <gnc-backend-sql.h>
 #include "gnc-dbisqlresult.hpp"
 #include "gnc-dbisqlconnection.hpp"
 
diff --git a/src/backend/dbi/gnc-dbisqlresult.cpp b/src/backend/dbi/gnc-dbisqlresult.cpp
index 56e32bd..6ceb595 100644
--- a/src/backend/dbi/gnc-dbisqlresult.cpp
+++ b/src/backend/dbi/gnc-dbisqlresult.cpp
@@ -31,7 +31,6 @@ extern "C"
 #include <dbi/dbi-dev.h>
 }
 #include <gnc-datetime.hpp>
-#include <gnc-backend-sql.h>
 #include "gnc-dbisqlresult.hpp"
 #include "gnc-dbisqlconnection.hpp"
 
diff --git a/src/backend/sql/CMakeLists.txt b/src/backend/sql/CMakeLists.txt
index 925befe..f1f92d9 100644
--- a/src/backend/sql/CMakeLists.txt
+++ b/src/backend/sql/CMakeLists.txt
@@ -3,7 +3,6 @@
 ADD_SUBDIRECTORY(test)
 
 SET (backend_sql_SOURCES
-  gnc-backend-sql.cpp
   gnc-account-sql.cpp
   gnc-address-sql.cpp
   gnc-bill-term-sql.cpp
@@ -33,7 +32,6 @@ SET (backend_sql_SOURCES
 )
 SET (backend_sql_noinst_HEADERS
   gnc-account-sql.h
-  gnc-backend-sql.h
   gnc-bill-term-sql.h
   gnc-book-sql.h
   gnc-budget-sql.h
diff --git a/src/backend/sql/Makefile.am b/src/backend/sql/Makefile.am
index 7e8d845..787f936 100644
--- a/src/backend/sql/Makefile.am
+++ b/src/backend/sql/Makefile.am
@@ -21,7 +21,6 @@ AM_CPPFLAGS = \
   ${BOOST_CPPFLAGS}
 
 libgnc_backend_sql_la_SOURCES = \
-  gnc-backend-sql.cpp \
   gnc-account-sql.cpp \
   gnc-address-sql.cpp \
   gnc-bill-term-sql.cpp \
@@ -51,7 +50,6 @@ libgnc_backend_sql_la_SOURCES = \
 
 noinst_HEADERS = \
   gnc-account-sql.h \
-  gnc-backend-sql.h \
   gnc-bill-term-sql.h \
   gnc-book-sql.h \
   gnc-budget-sql.h \
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
deleted file mode 100644
index ad1d64b..0000000
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ /dev/null
@@ -1,477 +0,0 @@
-/********************************************************************
- * gnc-backend-sql.c: load and save data to SQL                     *
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-/** @file gnc-backend-sql.c
- *  @brief load and save data to SQL
- *  @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff at rogers.com>
- *
- * This file implements the top-level QofBackend API for saving/
- * restoring data to/from an SQL db
- */
-#include <guid.hpp>
-extern "C"
-{
-#include <stdlib.h>
-#include "config.h"
-
-#include <errno.h>
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib/gstdio.h>
-
-#include <qof.h>
-#include <qofbackend-p.h>
-#include <qofquery-p.h>
-#include <qofquerycore-p.h>
-#include <Account.h>
-#include <TransLog.h>
-#include <gnc-engine.h>
-#include <SX-book.h>
-#include <Recurrence.h>
-#include <gncBillTerm.h>
-#include <gncTaxTable.h>
-#include <gncInvoice.h>
-#include "gnc-pricedb.h"
-
-
-#if defined( S_SPLINT_S )
-#include "splint-defs.h"
-#endif
-}
-
-#include <tuple>
-#include <iomanip>
-
-#include "gnc-sql-connection.hpp"
-#include "gnc-sql-backend.hpp"
-#include "gnc-sql-object-backend.hpp"
-#include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
-
-#include "gnc-account-sql.h"
-#include "gnc-book-sql.h"
-#include "gnc-budget-sql.h"
-#include "gnc-commodity-sql.h"
-#include "gnc-lots-sql.h"
-#include "gnc-price-sql.h"
-#include "gnc-recurrence-sql.h"
-#include "gnc-schedxaction-sql.h"
-#include "gnc-slots-sql.h"
-#include "gnc-transaction-sql.h"
-
-#include "gnc-bill-term-sql.h"
-#include "gnc-customer-sql.h"
-#include "gnc-employee-sql.h"
-#include "gnc-entry-sql.h"
-#include "gnc-invoice-sql.h"
-#include "gnc-job-sql.h"
-#include "gnc-order-sql.h"
-#include "gnc-tax-table-sql.h"
-#include "gnc-vendor-sql.h"
-
-static void gnc_sql_init_object_handlers (void);
-
-#define TRANSACTION_NAME "trans"
-
-static QofLogModule log_module = G_LOG_DOMAIN;
-
-#define SQLITE_PROVIDER_NAME "SQLite"
-
-/* ---------------------------------------------------------------------- */
-
-/* Query processing */
-static void
-handle_and_term (QofQueryTerm* pTerm, GString* sql)
-{
-    GSList* pParamPath;
-    QofQueryPredData* pPredData;
-    gboolean isInverted;
-    GSList* name;
-    gchar val[G_ASCII_DTOSTR_BUF_SIZE];
-
-    g_return_if_fail (pTerm != NULL);
-    g_return_if_fail (sql != NULL);
-
-    pParamPath = qof_query_term_get_param_path (pTerm);
-    pPredData = qof_query_term_get_pred_data (pTerm);
-    isInverted = qof_query_term_is_inverted (pTerm);
-
-    if (strcmp (pPredData->type_name, QOF_TYPE_GUID) == 0)
-    {
-        query_guid_t guid_data = (query_guid_t)pPredData;
-        GList* guid_entry;
-
-        for (name = pParamPath; name != NULL; name = name->next)
-        {
-            if (name != pParamPath) g_string_append (sql, ".");
-            g_string_append (sql, static_cast<char*> (name->data));
-        }
-
-        if (guid_data->options == QOF_GUID_MATCH_ANY)
-        {
-            if (isInverted) g_string_append (sql, " NOT ");
-            g_string_append (sql, " IN (");
-        }
-        for (guid_entry = guid_data->guids; guid_entry != NULL;
-             guid_entry = guid_entry->next)
-        {
-            if (guid_entry != guid_data->guids) g_string_append (sql, ".");
-            (void)guid_to_string_buff (static_cast<GncGUID*> (guid_entry->data),
-                                       val);
-            g_string_append (sql, "'");
-            g_string_append (sql, val);
-            g_string_append (sql, "'");
-        }
-        if (guid_data->options == QOF_GUID_MATCH_ANY)
-        {
-            g_string_append (sql, ")");
-        }
-    }
-
-    g_string_append (sql, "(");
-    if (isInverted)
-    {
-        g_string_append (sql, "!");
-    }
-
-    for (name = pParamPath; name != NULL; name = name->next)
-    {
-        if (name != pParamPath) g_string_append (sql, ".");
-        g_string_append (sql, static_cast<char*> (name->data));
-    }
-
-    if (pPredData->how == QOF_COMPARE_LT)
-    {
-        g_string_append (sql, "<");
-    }
-    else if (pPredData->how == QOF_COMPARE_LTE)
-    {
-        g_string_append (sql, "<=");
-    }
-    else if (pPredData->how == QOF_COMPARE_EQUAL)
-    {
-        g_string_append (sql, "=");
-    }
-    else if (pPredData->how == QOF_COMPARE_GT)
-    {
-        g_string_append (sql, ">");
-    }
-    else if (pPredData->how == QOF_COMPARE_GTE)
-    {
-        g_string_append (sql, ">=");
-    }
-    else if (pPredData->how == QOF_COMPARE_NEQ)
-    {
-        g_string_append (sql, "~=");
-    }
-    else
-    {
-        g_string_append (sql, "??");
-    }
-
-    if (strcmp (pPredData->type_name, "string") == 0)
-    {
-        query_string_t pData = (query_string_t)pPredData;
-        g_string_append (sql, "'");
-        g_string_append (sql, pData->matchstring);
-        g_string_append (sql, "'");
-    }
-    else if (strcmp (pPredData->type_name, "date") == 0)
-    {
-        query_date_t pData = (query_date_t)pPredData;
-
-        (void)gnc_timespec_to_iso8601_buff (pData->date, val);
-        g_string_append (sql, "'");
-        //g_string_append( sql, val, 4+1+2+1+2 );
-        g_string_append (sql, "'");
-    }
-    else if (strcmp (pPredData->type_name, "numeric") == 0)
-    {
-        /* query_numeric_t pData = (query_numeric_t)pPredData; */
-
-        g_string_append (sql, "numeric");
-    }
-    else if (strcmp (pPredData->type_name, QOF_TYPE_GUID) == 0)
-    {
-    }
-    else if (strcmp (pPredData->type_name, "gint32") == 0)
-    {
-        query_int32_t pData = (query_int32_t)pPredData;
-
-        sprintf (val, "%d", pData->val);
-        g_string_append (sql, val);
-    }
-    else if (strcmp (pPredData->type_name, "gint64") == 0)
-    {
-        query_int64_t pData = (query_int64_t)pPredData;
-
-        sprintf (val, "%" G_GINT64_FORMAT, pData->val);
-        g_string_append (sql, val);
-    }
-    else if (strcmp (pPredData->type_name, "double") == 0)
-    {
-        query_double_t pData = (query_double_t)pPredData;
-
-        g_ascii_dtostr (val, sizeof (val), pData->val);
-        g_string_append (sql, val);
-    }
-    else if (strcmp (pPredData->type_name, "boolean") == 0)
-    {
-        query_boolean_t pData = (query_boolean_t)pPredData;
-
-        sprintf (val, "%d", pData->val);
-        g_string_append (sql, val);
-    }
-    else
-    {
-        g_assert (FALSE);
-    }
-
-    g_string_append (sql, ")");
-}
-#if 0 //The query compilation code was never tested so it isn't implemnted for GncSqlObjectBackend.
-static void
-compile_query(const OBEEntry& entry, sql_backend* be_data)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe = nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail (obe->is_version (GNC_SQL_BACKEND_VERSION));
-
-    // Is this the right item?
-    if (type != std::string{be_data->pQueryInfo->searchObj}) return;
-    if (be_data->is_ok) return;
-
-    be_data->pQueryInfo->pCompiledQuery = (obe->compile_query)(
-        be_data->be,
-        be_data->pQuery);
-    be_data->is_ok = TRUE;
-}
-
-gchar* gnc_sql_compile_query_to_sql (GncSqlBackend* sql_be, QofQuery* query);
-
-gpointer
-gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery)
-{
-    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
-    QofIdType searchObj;
-    sql_backend be_data;
-    gnc_sql_query_info* pQueryInfo;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (pQuery != NULL, NULL);
-
-    ENTER (" ");
-
-//gnc_sql_compile_query_to_sql( sql_be, pQuery );
-    searchObj = qof_query_get_search_for (pQuery);
-
-    pQueryInfo = static_cast<decltype (pQueryInfo)> (
-        g_malloc (sizeof (gnc_sql_query_info)));
-    g_assert (pQueryInfo != NULL);
-    pQueryInfo->pCompiledQuery = NULL;
-    pQueryInfo->searchObj = searchObj;
-
-    // Try various objects first
-    be_data.is_ok = FALSE;
-    be_data.be = sql_be;
-    be_data.pQuery = pQuery;
-    be_data.pQueryInfo = pQueryInfo;
-
-    for (auto entry : backend_registry)
-        compile_query(entry, &be_data);
-    if (be_data.is_ok)
-    {
-        LEAVE ("");
-        return be_data.pQueryInfo;
-    }
-
-    LEAVE ("");
-
-    return pQueryInfo;
-}
-
-static const gchar*
-convert_search_obj (QofIdType objType)
-{
-    return (gchar*)objType;
-}
-
-gchar*
-gnc_sql_compile_query_to_sql (GncSqlBackend* sql_be, QofQuery* query)
-{
-    QofIdType searchObj;
-    GString* sql;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (query != NULL, NULL);
-
-    searchObj = qof_query_get_search_for (query);
-
-    /* Convert search object type to table name */
-    sql = g_string_new ("");
-    g_string_append (sql, "SELECT * FROM ");
-    g_string_append (sql, convert_search_obj (searchObj));
-    if (!qof_query_has_terms (query))
-    {
-        g_string_append (sql, ";");
-    }
-    else
-    {
-        GList* orterms = qof_query_get_terms (query);
-        GList* orTerm;
-
-        g_string_append (sql, " WHERE ");
-
-        for (orTerm = orterms; orTerm != NULL; orTerm = orTerm->next)
-        {
-            GList* andterms = (GList*)orTerm->data;
-            GList* andTerm;
-
-            if (orTerm != orterms) g_string_append (sql, " OR ");
-            g_string_append (sql, "(");
-            for (andTerm = andterms; andTerm != NULL; andTerm = andTerm->next)
-            {
-                if (andTerm != andterms) g_string_append (sql, " AND ");
-                handle_and_term ((QofQueryTerm*)andTerm->data, sql);
-            }
-            g_string_append (sql, ")");
-        }
-    }
-
-    DEBUG ("Compiled: %s\n", sql->str);
-    return g_string_free (sql, FALSE);
-}
-
-static void
-free_query(const OBEEntry& entry, sql_backend* be_data)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe= nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail (obe->version == GNC_SQL_BACKEND_VERSION);
-    if (be_data->is_ok) return;
-    if (type != std::string{be_data->pQueryInfo->searchObj}) return;
-
-    if (obe->free_query != nullptr)
-    {
-        (obe->free_query)(be_data->be, be_data->pCompiledQuery);
-        be_data->is_ok = TRUE;
-    }
-}
-
-void
-gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery)
-{
-    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
-    gnc_sql_query_info* pQueryInfo = (gnc_sql_query_info*)pQuery;
-    sql_backend be_data;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (pQuery != NULL);
-
-    ENTER (" ");
-
-    // Try various objects first
-    be_data.is_ok = FALSE;
-    be_data.be = sql_be;
-    be_data.pCompiledQuery = pQuery;
-    be_data.pQueryInfo = pQueryInfo;
-
-    for (auto entry : backend_registry)
-        free_query(entry, &be_data);
-    if (be_data.is_ok)
-    {
-        LEAVE ("");
-        return;
-    }
-
-    if (pQueryInfo->pCompiledQuery != NULL)
-    {
-        DEBUG ("%s\n", (gchar*)pQueryInfo->pCompiledQuery);
-        g_free (pQueryInfo->pCompiledQuery);
-    }
-    g_free (pQueryInfo);
-
-    LEAVE ("");
-}
-
-static void
-run_query(const OBEEntry& entry, sql_backend* be_data)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe = nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail (obe->version == GNC_SQL_BACKEND_VERSION);
-    if (be_data->is_ok) return;
-
-    // Is this the right item?
-    if (type != std::string{be_data->pQueryInfo->searchObj}) return;
-
-    if (obe->run_query != nullptr)
-    {
-        (obe->run_query)(be_data->be, be_data->pCompiledQuery);
-        be_data->is_ok = TRUE;
-    }
-}
-
-void
-gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery)
-{
-    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
-    gnc_sql_query_info* pQueryInfo = (gnc_sql_query_info*)pQuery;
-    sql_backend be_data;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (pQuery != NULL);
-    g_return_if_fail (!sql_be->in_query);
-
-    ENTER (" ");
-
-    sql_be->loading = TRUE;
-    sql_be->in_query = TRUE;
-
-    qof_event_suspend ();
-
-    // Try various objects first
-    be_data.is_ok = FALSE;
-    be_data.be = sql_be;
-    be_data.pCompiledQuery = pQueryInfo->pCompiledQuery;
-    be_data.pQueryInfo = pQueryInfo;
-    for (auto entry : backend_registry)
-        run_query(entry, &be_data);
-    sql_be->loading = FALSE;
-    sql_be->in_query = FALSE;
-    qof_event_resume ();
-//    if( be_data.is_ok ) {
-//        LEAVE( "" );
-//        return;
-//    }
-
-    // Mark the book as clean
-    qof_instance_mark_clean (QOF_INSTANCE (sql_be->book()));
-
-//    DEBUG( "%s\n", (gchar*)pQueryInfo->pCompiledQuery );
-
-    LEAVE ("");
-}
-#endif //if 0: query creation isn't used yet, code never tested.
-
-/* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
deleted file mode 100644
index 3c1db97..0000000
--- a/src/backend/sql/gnc-backend-sql.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/********************************************************************
- * gnc-backend-sql.h: load and save data to SQL                     *
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-
-/**
- * @defgroup SQLBE SQL Backend Core
- @{
-*/
-
-/** @addtogroup Columns Columns
-    @ingroup SQLBE
-*/
-
-/** The SQL backend core is a library which can form the core for a QOF
- *  backend based on an SQL library.
- *
- *  @file gnc-backend-sql.h
- *  @brief load and save data to SQL
- *  @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff at rogers.com>
- */
-
-#ifndef GNC_BACKEND_SQL_H
-#define GNC_BACKEND_SQL_H
-extern "C"
-{
-#include <qof.h>
-#include <qofbackend-p.h>
-#include <gmodule.h>
-}
-
-#include <string>
-#include <vector>
-
-#include "gnc-sql-object-backend.hpp"
-
-using StrVec = std::vector<std::string>;
-using PairVec = std::vector<std::pair<std::string, std::string>>;
-class GncSqlRow;
-
-#define GNC_SQL_BACKEND             "gnc:sql:1"
-#define GNC_SQL_BACKEND_VERSION 1
-
-
-gpointer gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery);
-void gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery);
-void gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery);
-
-#endif /* GNC_BACKEND_SQL_H */
-
-/**
-   @}  end of the SQL Backend Core doxygen group
-*/
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index 5d326a3..b95a902 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -45,7 +45,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-bill-term-sql.h"
 
diff --git a/src/backend/sql/gnc-book-sql.cpp b/src/backend/sql/gnc-book-sql.cpp
index 39ffa18..d8a0be3 100644
--- a/src/backend/sql/gnc-book-sql.cpp
+++ b/src/backend/sql/gnc-book-sql.cpp
@@ -46,7 +46,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-book-sql.h"
 #include "gnc-slots-sql.h"
 
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index af3904b..c8d3ff2 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -45,7 +45,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-budget-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-recurrence-sql.h"
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index d58bb0f..2904cfc 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -40,7 +40,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
 
diff --git a/src/backend/sql/gnc-customer-sql.cpp b/src/backend/sql/gnc-customer-sql.cpp
index c6ad33d..68aa165 100644
--- a/src/backend/sql/gnc-customer-sql.cpp
+++ b/src/backend/sql/gnc-customer-sql.cpp
@@ -44,7 +44,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-customer-sql.h"
 #include "gnc-bill-term-sql.h"
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index bc16d3a..f616577 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -43,7 +43,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-employee-sql.h"
diff --git a/src/backend/sql/gnc-entry-sql.cpp b/src/backend/sql/gnc-entry-sql.cpp
index 1d5dfdb..a6f76e9 100644
--- a/src/backend/sql/gnc-entry-sql.cpp
+++ b/src/backend/sql/gnc-entry-sql.cpp
@@ -45,7 +45,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-bill-term-sql.h"
 #include "gnc-entry-sql.h"
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index da7cab0..033dce4 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -46,7 +46,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-invoice-sql.h"
diff --git a/src/backend/sql/gnc-job-sql.cpp b/src/backend/sql/gnc-job-sql.cpp
index c78c154..7c386d7 100644
--- a/src/backend/sql/gnc-job-sql.cpp
+++ b/src/backend/sql/gnc-job-sql.cpp
@@ -42,7 +42,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-job-sql.h"
 
diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp
index 63d34e2..d5f839f 100644
--- a/src/backend/sql/gnc-lots-sql.cpp
+++ b/src/backend/sql/gnc-lots-sql.cpp
@@ -46,7 +46,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include "gnc-lots-sql.h"
diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp
index 5d0aa5c..9bc92f8 100644
--- a/src/backend/sql/gnc-order-sql.cpp
+++ b/src/backend/sql/gnc-order-sql.cpp
@@ -43,7 +43,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-order-sql.h"
 
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 4dfbfea..928f2ae 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -43,7 +43,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-price-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp
index 3488f77..36fcd75 100644
--- a/src/backend/sql/gnc-recurrence-sql.cpp
+++ b/src/backend/sql/gnc-recurrence-sql.cpp
@@ -44,7 +44,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-recurrence-sql.h"
 
 G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp
index ef68397..53de624 100644
--- a/src/backend/sql/gnc-schedxaction-sql.cpp
+++ b/src/backend/sql/gnc-schedxaction-sql.cpp
@@ -45,7 +45,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-schedxaction-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-recurrence-sql.h"
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index f32a206..068ca38 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -44,7 +44,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
 #include <kvp_frame.hpp>
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 62431c0..24129c2 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -42,7 +42,6 @@ extern "C"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
 #include "gnc-sql-result.hpp"
-#include "gnc-backend-sql.h"
 
 #include "gnc-account-sql.h"
 #include "gnc-book-sql.h"
@@ -71,6 +70,8 @@ static QofLogModule log_module = G_LOG_DOMAIN;
 #define TABLE_COL_NAME "table_name"
 #define VERSION_COL_NAME "table_version"
 
+using StrVec = std::vector<std::string>;
+
 static EntryVec version_table
 {
     gnc_sql_make_table_entry<CT_STRING>(
diff --git a/src/backend/sql/gnc-sql-column-table-entry.cpp b/src/backend/sql/gnc-sql-column-table-entry.cpp
index 4e0bf3c..0fd6fd0 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.cpp
@@ -33,7 +33,6 @@ extern "C"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
 #include "gnc-sql-result.hpp"
-#include "gnc-backend-sql.h"
 
 static QofLogModule log_module = G_LOG_DOMAIN;
 
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
index 32a62d2..17bf6ea 100644
--- a/src/backend/sql/gnc-sql-object-backend.hpp
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -37,6 +37,9 @@ class GncSqlColumnTableEntry;
 using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
 using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
 
+#define GNC_SQL_BACKEND "gnc:sql:1"
+#define GNC_SQL_BACKEND_VERSION 1
+
 /**
  * Encapsulates per-class table schema with functions to load, create a table,
  * commit a changed front-end object (note that database transaction semantics
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index e217933..3737440 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -44,7 +44,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-tax-table-sql.h"
 
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 5d35051..84f598a 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -56,7 +56,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
-#include "gnc-backend-sql.h"
 #include "gnc-transaction-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-transaction-sql.h b/src/backend/sql/gnc-transaction-sql.h
index b0f270f..f1b11cd 100644
--- a/src/backend/sql/gnc-transaction-sql.h
+++ b/src/backend/sql/gnc-transaction-sql.h
@@ -29,7 +29,6 @@
 #ifndef GNC_TRANSACTION_SQL_H
 #define GNC_TRANSACTION_SQL_H
 
-#include "gnc-backend-sql.h"
 extern "C"
 {
 #include "Transaction.h"
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index 1c0a6b1..d801987 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -48,7 +48,6 @@ extern "C"
 #include "gnc-vendor-sql.h"
 #include "gnc-bill-term-sql.h"
 #include "gnc-tax-table-sql.h"
-#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
 
diff --git a/src/backend/sql/test/Makefile.am b/src/backend/sql/test/Makefile.am
index cfa3516..2e396a3 100644
--- a/src/backend/sql/test/Makefile.am
+++ b/src/backend/sql/test/Makefile.am
@@ -56,9 +56,6 @@ test_sqlbe_SOURCES = \
 	test-sqlbe.cpp \
 	utest-gnc-backend-sql.cpp
 
-#test_sqlbe_HEADERS = \
-#	$(top_srcdir)/$(MODULEPATH)/gnc-backend-sql.h
-
 test_sqlbe_LDADD = \
 	$(top_builddir)/$(MODULEPATH)/libgnc-backend-sql.la \
 	$(top_builddir)/src/libqof/qof/libgnc-qof.la \
diff --git a/src/backend/sql/test/test-column-types.cpp b/src/backend/sql/test/test-column-types.cpp
index e03dd82..b8f9b53 100644
--- a/src/backend/sql/test/test-column-types.cpp
+++ b/src/backend/sql/test/test-column-types.cpp
@@ -28,7 +28,6 @@ extern "C"
 #include "config.h"
 #include "qof.h"
 }
-#include "gnc-backend-sql.h"
 extern "C"
 {
 #include "cashobjects.h"
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index eba4a24..cd7107b 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -31,7 +31,6 @@ extern "C"
 #include "../gnc-sql-connection.hpp"
 #include "../gnc-sql-backend.hpp"
 #include "../gnc-sql-result.hpp"
-#include "../gnc-backend-sql.h"
 
 static const gchar* suitename = "/backend/sql/gnc-backend-sql";
 void test_suite_gnc_backend_sql (void);

commit 00950e9724071f319da12ed586cc32089bcec262
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 13 14:52:03 2016 -0800

    Move 3 utility functions from gnc-backend-sql to gnc-sql-column-table-entry.
    
    gnc_sql_load_object, gnc_sql_load_guid, and gnc_sql_append_guids_to_sql.

diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index 93e0082..ad1d64b 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -474,79 +474,4 @@ gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery)
 }
 #endif //if 0: query creation isn't used yet, code never tested.
 
-/* ================================================================= */
-
-void
-_retrieve_guid_ (gpointer pObject,  gpointer pValue)
-{
-    GncGUID* pGuid = (GncGUID*)pObject;
-    GncGUID* guid = (GncGUID*)pValue;
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (pValue != NULL);
-
-    memcpy (pGuid, guid, sizeof (GncGUID));
-}
-
-
-// Table to retrieve just the guid
-static EntryVec guid_table
-{
-    gnc_sql_make_table_entry<CT_GUID>("guid", 0, 0, nullptr, _retrieve_guid_)
-};
-
-const GncGUID*
-gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row)
-{
-    static GncGUID guid;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-
-    gnc_sql_load_object (sql_be, row, NULL, &guid, guid_table);
-
-    return &guid;
-}
-
-// Table to retrieve just the guid
-static EntryVec tx_guid_table
-{
-    gnc_sql_make_table_entry<CT_GUID>("tx_guid", 0, 0, nullptr, _retrieve_guid_)
- };
-
-void
-gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
-                     QofIdTypeConst obj_name, gpointer pObject,
-                     const EntryVec& table)
-{
-    QofSetterFunc setter;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (pObject != NULL);
-
-    for (auto const& table_row : table)
-    {
-        table_row->load (sql_be, row, obj_name, pObject);
-    }
-}
-
-/* ================================================================= */
-
-uint_t
-gnc_sql_append_guids_to_sql (std::stringstream& sql, const InstanceVec& instances)
-{
-    char guid_buf[GUID_ENCODING_LENGTH + 1];
-
-    for (auto inst : instances)
-    {
-        (void)guid_to_string_buff (qof_instance_get_guid (inst), guid_buf);
-
-        if (inst != *(instances.begin()))
-        {
-            sql << ",";
-        }
-        sql << "'" << guid_buf << "'";
-    }
-
-    return instances.size();
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
index bc89d5f..3c1db97 100644
--- a/src/backend/sql/gnc-backend-sql.h
+++ b/src/backend/sql/gnc-backend-sql.h
@@ -52,52 +52,12 @@ extern "C"
 
 using StrVec = std::vector<std::string>;
 using PairVec = std::vector<std::pair<std::string, std::string>>;
-using uint_t = unsigned int;
 class GncSqlRow;
 
 #define GNC_SQL_BACKEND             "gnc:sql:1"
 #define GNC_SQL_BACKEND_VERSION 1
 
 
-
-/**
- * Loads a Gnucash object from the database.
- *
- * @param sql_be SQL backend struct
- * @param row DB result row
- * @param obj_name QOF object type name
- * @param pObject Object to be loaded
- * @param table DB table description
- */
-void gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
-                          QofIdTypeConst obj_name, gpointer pObject,
-                          const EntryVec& table);
-
-/**
- * Loads the object guid from a database row.  The table must have a column
- * named "guid" with type CT_GUID.
- *
- * @param sql_be SQL backend struct
- * @param row Database row
- * @return GncGUID
- */
-
-const GncGUID* gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row);
-
-
-/**
- * Appends the ascii strings for a list of GUIDs to the end of an SQL string.
- *
- * @param str SQL string
- * @param list List of GUIDs
- * @param maxCount Max # of GUIDs to append
- * @return Number of GUIDs appended
- */
-uint_t gnc_sql_append_guids_to_sql (std::stringstream& sql,
-                                    const InstanceVec& instances);
-
-void _retrieve_guid_ (gpointer pObject,  gpointer pValue);
-
 gpointer gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery);
 void gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery);
 void gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery);
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index 2b021c4..f32a206 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -151,6 +151,18 @@ static const EntryVec col_table
                                        (QofSetterFunc)set_gdate_val),
 };
 
+static void
+_retrieve_guid_ (gpointer pObject,  gpointer pValue)
+{
+    GncGUID* pGuid = (GncGUID*)pObject;
+    GncGUID* guid = (GncGUID*)pValue;
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (pValue != NULL);
+
+    memcpy (pGuid, guid, sizeof (GncGUID));
+}
+
 /* Special column table because we need to be able to access the table by
 a column other than the primary key */
 static const EntryVec obj_guid_col_table
diff --git a/src/backend/sql/gnc-sql-column-table-entry.cpp b/src/backend/sql/gnc-sql-column-table-entry.cpp
index 24ecabe..4e0bf3c 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.cpp
@@ -617,6 +617,71 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(QofIdTypeConst obj_name,
     vec.emplace_back (denom_col, buf.str ());
 }
 
+static void
+_retrieve_guid_ (gpointer pObject,  gpointer pValue)
+{
+    GncGUID* pGuid = (GncGUID*)pObject;
+    GncGUID* guid = (GncGUID*)pValue;
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (pValue != NULL);
+
+    memcpy (pGuid, guid, sizeof (GncGUID));
+}
+
+// Table to retrieve just the guid
+static EntryVec guid_table
+{
+    gnc_sql_make_table_entry<CT_GUID>("guid", 0, 0, nullptr, _retrieve_guid_)
+};
+
+const GncGUID*
+gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row)
+{
+    static GncGUID guid;
+
+    g_return_val_if_fail (sql_be != NULL, NULL);
+
+    gnc_sql_load_object (sql_be, row, NULL, &guid, guid_table);
+
+    return &guid;
+}
+
+void
+gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
+                     QofIdTypeConst obj_name, gpointer pObject,
+                     const EntryVec& table)
+{
+    QofSetterFunc setter;
+
+    g_return_if_fail (sql_be != NULL);
+    g_return_if_fail (pObject != NULL);
+
+    for (auto const& table_row : table)
+    {
+        table_row->load (sql_be, row, obj_name, pObject);
+    }
+}
+
+uint_t
+gnc_sql_append_guids_to_sql (std::stringstream& sql,
+                             const InstanceVec& instances)
+{
+    char guid_buf[GUID_ENCODING_LENGTH + 1];
+
+    for (auto inst : instances)
+    {
+        (void)guid_to_string_buff (qof_instance_get_guid (inst), guid_buf);
+
+        if (inst != *(instances.begin()))
+        {
+            sql << ",";
+        }
+        sql << "'" << guid_buf << "'";
+    }
+
+    return instances.size();
+}
 
 /* This is necessary for 64-bit builds because g++ complains
  * that reinterpret_casting a void* (64 bits) to an int (32 bits)
diff --git a/src/backend/sql/gnc-sql-column-table-entry.hpp b/src/backend/sql/gnc-sql-column-table-entry.hpp
index 579c549..26b9271 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.hpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.hpp
@@ -36,6 +36,8 @@ extern "C"
 struct GncSqlColumnInfo;
 using ColVec = std::vector<GncSqlColumnInfo>;
 using PairVec = std::vector<std::pair<std::string, std::string>>;
+using InstanceVec = std::vector<QofInstance*>;
+using uint_t = unsigned int;
 class GncSqlBackend;
 
 /**
@@ -176,6 +178,7 @@ public:
             catch (std::invalid_argument) {}
         }
 
+
 protected:
     template <typename T> T
     get_row_value_from_object(QofIdTypeConst obj_name, const void* pObject) const;
@@ -371,6 +374,37 @@ GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
 }
 
 /**
+ * Load an arbitrary object from a result row.
+ *
+ * @param sql_be: GncSqlBackend*, pass-through to the implementation loader.
+ * @param row: The GncSqlResult
+ * @param obj_name: The object-name with which to retrieve the setter func.
+ * @param pObject: The target object being loaded.
+ * @param table: The table description to interpret the row.
+ */
+void gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
+                          QofIdTypeConst obj_name, gpointer pObject,
+                          const EntryVec& table);
+/**
+ * Create a GncGUID from a guid stored in a row.
+ *
+ * @param sql_be: The active GncSqlBackend. Pass-throug to gnc_sql_load_object.
+ * @param row: The GncSqlResult row.
+ */
+const GncGUID*
+gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row);
+
+/**
+ * Append the GUIDs of QofInstances to a SQL query.
+ *
+ * @param sql: The SQL Query in progress to which the GncGUIDS should be appended.
+ * @param instances: The QofInstances
+ * @return The number of instances
+ */
+uint_t gnc_sql_append_guids_to_sql (std::stringstream& sql,
+                                    const InstanceVec& instances);
+
+/**
  *  information required to create a column in a table.
  */
 struct GncSqlColumnInfo
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
index 70e3ea9..32a62d2 100644
--- a/src/backend/sql/gnc-sql-object-backend.hpp
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -36,7 +36,6 @@ class GncSqlBackend;
 class GncSqlColumnTableEntry;
 using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
 using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
-using InstanceVec = std::vector<QofInstance*>;
 
 /**
  * Encapsulates per-class table schema with functions to load, create a table,

commit b838c1ebf3942199a4b6f46e093eef4f61db2da1
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 13 12:41:32 2016 -0800

    Move gnc_sql_do_db_operation and gnc_sql_object_is_it_in_db into GncSqlBackend.

diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 508b304..6e37c42 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -357,7 +357,7 @@ GncSqlAccountBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc,
+        is_ok = sql_be->do_db_operation (op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc,
                                          col_table);
     }
 
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index 759c868..93e0082 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -87,21 +87,6 @@ extern "C"
 #include "gnc-vendor-sql.h"
 
 static void gnc_sql_init_object_handlers (void);
-static GncSqlStatementPtr build_insert_statement (GncSqlBackend* sql_be,
-                                                  const gchar* table_name,
-                                                  QofIdTypeConst obj_name,
-                                                  gpointer pObject,
-                                                  const EntryVec& table);
-static GncSqlStatementPtr build_update_statement (GncSqlBackend* sql_be,
-                                                  const gchar* table_name,
-                                                  QofIdTypeConst obj_name,
-                                                  gpointer pObject,
-                                                  const EntryVec& table);
-static GncSqlStatementPtr build_delete_statement (GncSqlBackend* sql_be,
-                                                  const gchar* table_name,
-                                                  QofIdTypeConst obj_name,
-                                                  gpointer pObject,
-                                                  const EntryVec& table);
 
 #define TRANSACTION_NAME "trans"
 
@@ -545,19 +530,6 @@ gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
 }
 
 /* ================================================================= */
-static GncSqlStatementPtr
-create_single_col_select_statement (GncSqlBackend* sql_be,
-                                    const gchar* table_name,
-                                    const GncSqlColumnTableEntryPtr table_row)
-{
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (table_name != NULL, NULL);
-
-    auto sql = std::string{"SELECT "} + table_row->name() + " FROM " + table_name;
-    return sql_be->create_statement_from_sql(sql.c_str());
-}
-
-/* ================================================================= */
 
 uint_t
 gnc_sql_append_guids_to_sql (std::stringstream& sql, const InstanceVec& instances)
@@ -577,184 +549,4 @@ gnc_sql_append_guids_to_sql (std::stringstream& sql, const InstanceVec& instance
 
     return instances.size();
 }
-/* ================================================================= */
-static PairVec
-get_object_values (QofIdTypeConst obj_name,
-                   gpointer pObject, const EntryVec& table)
-{
-    PairVec vec;
-
-    for (auto const& table_row : table)
-    {
-        if (!(table_row->is_autoincr()))
-        {
-            table_row->add_to_query (obj_name, pObject, vec);
-        }
-    }
-    return vec;
-}
-
-gboolean
-gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be, const gchar* table_name,
-                            QofIdTypeConst obj_name, gpointer pObject,
-                            const EntryVec& table)
-{
-    guint count;
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-    g_return_val_if_fail (table_name != NULL, FALSE);
-    g_return_val_if_fail (obj_name != NULL, FALSE);
-    g_return_val_if_fail (pObject != NULL, FALSE);
-
-    /* SELECT * FROM */
-    auto stmt = create_single_col_select_statement (sql_be, table_name, table[0]);
-    g_assert (stmt != NULL);
-
-    /* WHERE */
-    PairVec values{get_object_values(obj_name, pObject, table)};
-    stmt->add_where_cond(obj_name, values);
-    auto result = sql_be->execute_select_statement (stmt);
-    if (result != NULL)
-    {
-        auto retval = result->size() > 0;
-        return retval;
-    }
-    return false;
-}
-
-gboolean
-gnc_sql_do_db_operation (GncSqlBackend* sql_be,
-                         E_DB_OPERATION op,
-                         const gchar* table_name,
-                         QofIdTypeConst obj_name, gpointer pObject,
-                         const EntryVec& table)
-{
-    GncSqlStatementPtr stmt;
-    bool ok = false;
-
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-    g_return_val_if_fail (table_name != NULL, FALSE);
-    g_return_val_if_fail (obj_name != NULL, FALSE);
-    g_return_val_if_fail (pObject != NULL, FALSE);
-
-    if (op == OP_DB_INSERT)
-    {
-        stmt = build_insert_statement (sql_be, table_name, obj_name, pObject, table);
-    }
-    else if (op == OP_DB_UPDATE)
-    {
-        stmt = build_update_statement (sql_be, table_name, obj_name, pObject, table);
-    }
-    else if (op == OP_DB_DELETE)
-    {
-        stmt = build_delete_statement (sql_be, table_name, obj_name, pObject, table);
-    }
-    else
-    {
-        g_assert (FALSE);
-    }
-    if (sql_be->execute_nonselect_statement (stmt) != -1)
-        ok = true;
-
-    return ok;
-}
-
-static GncSqlStatementPtr
-build_insert_statement (GncSqlBackend* sql_be,
-                        const gchar* table_name,
-                        QofIdTypeConst obj_name, gpointer pObject,
-                        const EntryVec& table)
-{
-    GncSqlStatementPtr stmt;
-    PairVec col_values;
-    std::ostringstream sql;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (table_name != NULL, NULL);
-    g_return_val_if_fail (obj_name != NULL, NULL);
-    g_return_val_if_fail (pObject != NULL, NULL);
-    PairVec values{get_object_values(obj_name, pObject, table)};
-
-    sql << "INSERT INTO " << table_name <<"(";
-    for (auto const& col_value : values)
-    {
-        if (col_value != *values.begin())
-            sql << ",";
-        sql << col_value.first;
-    }
-
-    sql << ") VALUES(";
-    for (auto col_value : values)
-    {
-        if (col_value != *values.begin())
-            sql << ",";
-        sql << sql_be->quote_string(col_value.second);
-    }
-    sql << ")";
-
-    stmt = sql_be->create_statement_from_sql(sql.str());
-    return stmt;
-}
-
-static GncSqlStatementPtr
-build_update_statement (GncSqlBackend* sql_be,
-                        const gchar* table_name,
-                        QofIdTypeConst obj_name, gpointer pObject,
-                        const EntryVec& table)
-{
-    GncSqlStatementPtr stmt;
-    std::ostringstream sql;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (table_name != NULL, NULL);
-    g_return_val_if_fail (obj_name != NULL, NULL);
-    g_return_val_if_fail (pObject != NULL, NULL);
-
-
-    PairVec values{get_object_values (obj_name, pObject, table)};
-
-    // Create the SQL statement
-    sql <<  "UPDATE " << table_name << " SET ";
-
-    for (auto const& col_value : values)
-    {
-        if (col_value != *values.begin())
-            sql << ",";
-        sql << col_value.first << "=" <<
-            sql_be->quote_string(col_value.second);
-    }
-
-    stmt = sql_be->create_statement_from_sql(sql.str());
-    /* We want our where condition to be just the first column and
-     * value, i.e. the guid of the object.
-     */
-    values.erase(values.begin() + 1, values.end());
-    stmt->add_where_cond(obj_name, values);
-    return stmt;
-}
-
-static GncSqlStatementPtr
-build_delete_statement (GncSqlBackend* sql_be,
-                        const gchar* table_name,
-                        QofIdTypeConst obj_name, gpointer pObject,
-                        const EntryVec& table)
-{
-    std::ostringstream sql;
-
-    g_return_val_if_fail (sql_be != NULL, NULL);
-    g_return_val_if_fail (table_name != NULL, NULL);
-    g_return_val_if_fail (obj_name != NULL, NULL);
-    g_return_val_if_fail (pObject != NULL, NULL);
-
-    sql << "DELETE FROM " << table_name;
-    auto stmt = sql_be->create_statement_from_sql (sql.str());
-
-    /* WHERE */
-    PairVec values;
-    table[0]->add_to_query (obj_name, pObject, values);
-    PairVec col_values{values[0]};
-    stmt->add_where_cond (obj_name, col_values);
-
-    return stmt;
-}
-
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
index b96e234..bc89d5f 100644
--- a/src/backend/sql/gnc-backend-sql.h
+++ b/src/backend/sql/gnc-backend-sql.h
@@ -58,23 +58,6 @@ class GncSqlRow;
 #define GNC_SQL_BACKEND             "gnc:sql:1"
 #define GNC_SQL_BACKEND_VERSION 1
 
-/**
- * Performs an operation on the database.
- *
- * @param sql_be SQL backend struct
- * @param op Operation type
- * @param table_name SQL table name
- * @param obj_name QOF object type name
- * @param pObject Gnucash object
- * @param table DB table description
- * @return TRUE if successful, FALSE if not
- */
-gboolean gnc_sql_do_db_operation (GncSqlBackend* sql_be,
-                                  E_DB_OPERATION op,
-                                  const gchar* table_name,
-                                  QofIdTypeConst obj_name,
-                                  gpointer pObject,
-                                  const EntryVec& table);
 
 
 /**
@@ -91,21 +74,6 @@ void gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
                           const EntryVec& table);
 
 /**
- * Checks whether an object is in the database or not.
- *
- * @param sql_be SQL backend struct
- * @param table_name DB table name
- * @param obj_name QOF object type name
- * @param pObject Object to be checked
- * @param table DB table description
- * @return TRUE if the object is in the database, FALSE otherwise
- */
-gboolean gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be,
-                                     const gchar* table_name,
-                                     QofIdTypeConst obj_name,
-                                     const gpointer pObject,
-                                     const EntryVec& table );
-/**
  * Loads the object guid from a database row.  The table must have a column
  * named "guid" with type CT_GUID.
  *
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index a9e0245..af3904b 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -281,7 +281,8 @@ save_budget_amounts (GncSqlBackend* sql_be, GncBudget* budget)
             if (gnc_budget_is_account_period_value_set (budget, info.account, i))
             {
                 info.period_num = i;
-                is_ok = gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, AMOUNTS_TABLE, "", &info,
+                is_ok = sql_be->do_db_operation(OP_DB_INSERT, AMOUNTS_TABLE,
+                                                "", &info,
                                                  budget_amounts_col_table);
             }
         }
@@ -394,8 +395,8 @@ GncSqlBudgetBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget,
-                                     col_table);
+    is_ok = sql_be->do_db_operation(op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget,
+                                    col_table);
 
     // Now, commit any slots and recurrence
     if (is_ok)
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index 4f50a6e..d58bb0f 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -192,8 +192,8 @@ do_commit_commodity (GncSqlBackend* sql_be, QofInstance* inst,
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, COMMODITIES_TABLE, GNC_ID_COMMODITY,
-                                     inst, col_table);
+    is_ok = sql_be->do_db_operation(op, COMMODITIES_TABLE, GNC_ID_COMMODITY,
+                                    inst, col_table);
 
     if (is_ok)
     {
@@ -228,8 +228,8 @@ is_commodity_in_db (GncSqlBackend* sql_be, gnc_commodity* pCommodity)
     g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (pCommodity != NULL, FALSE);
 
-    return gnc_sql_object_is_it_in_db (sql_be, COMMODITIES_TABLE, GNC_ID_COMMODITY,
-                                       pCommodity, col_table);
+    return sql_be->object_in_db (COMMODITIES_TABLE, GNC_ID_COMMODITY,
+                                 pCommodity, col_table);
 }
 
 gboolean
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index f1f7598..bc16d3a 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -187,8 +187,8 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_EMPLOYEE, emp,
-                                         col_table);
+        is_ok = sql_be->do_db_operation(op, TABLE_NAME, GNC_ID_EMPLOYEE, emp,
+                                        col_table);
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index 6e69090..da7cab0 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -211,8 +211,8 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_INVOICE, inst,
-                                         col_table);
+        is_ok = sql_be->do_db_operation(op, TABLE_NAME, GNC_ID_INVOICE, inst,
+                                        col_table);
     }
 
     if (is_ok)
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 2a27a58..4dfbfea 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -194,8 +194,8 @@ GncSqlPriceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_PRICE, pPrice,
-                                         col_table);
+        is_ok = sql_be->do_db_operation(op, TABLE_NAME, GNC_ID_PRICE, pPrice,
+                                        col_table);
     }
 
     return is_ok;
diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp
index b77aa76..3488f77 100644
--- a/src/backend/sql/gnc-recurrence-sql.cpp
+++ b/src/backend/sql/gnc-recurrence-sql.cpp
@@ -251,8 +251,8 @@ gnc_sql_recurrence_save (GncSqlBackend* sql_be, const GncGUID* guid,
     recurrence_info.be = sql_be;
     recurrence_info.guid = guid;
     recurrence_info.pRecurrence = (Recurrence*)r;
-    return gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, TABLE_NAME,
-                                    TABLE_NAME, &recurrence_info, col_table);
+    return sql_be->do_db_operation(OP_DB_INSERT, TABLE_NAME,
+                                   TABLE_NAME, &recurrence_info, col_table);
 }
 
 void
@@ -272,8 +272,8 @@ gnc_sql_recurrence_save_list (GncSqlBackend* sql_be, const GncGUID* guid,
     for (l = schedule; l != NULL; l = g_list_next (l))
     {
         recurrence_info.pRecurrence = (Recurrence*)l->data;
-        (void)gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, TABLE_NAME,
-                                       TABLE_NAME, &recurrence_info, col_table);
+        (void)sql_be->do_db_operation(OP_DB_INSERT, TABLE_NAME,
+                                      TABLE_NAME, &recurrence_info, col_table);
     }
 }
 
@@ -287,8 +287,8 @@ gnc_sql_recurrence_delete (GncSqlBackend* sql_be, const GncGUID* guid)
 
     recurrence_info.be = sql_be;
     recurrence_info.guid = guid;
-    return gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TABLE_NAME,
-                                    TABLE_NAME, &recurrence_info, guid_col_table);
+    return sql_be->do_db_operation(OP_DB_DELETE, TABLE_NAME,
+                                   TABLE_NAME, &recurrence_info, guid_col_table);
 }
 
 static void
diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp
index f0d0f4d..ef68397 100644
--- a/src/backend/sql/gnc-schedxaction-sql.cpp
+++ b/src/backend/sql/gnc-schedxaction-sql.cpp
@@ -176,8 +176,8 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx,
-                                     col_table);
+    is_ok = sql_be->do_db_operation(op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx,
+                                    col_table);
     guid = qof_instance_get_guid (inst);
     if (op == OP_DB_INSERT || op == OP_DB_UPDATE)
     {
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index aec445d..2b021c4 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -649,10 +649,11 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
         slot_info_t* pNewInfo = slot_info_copy (pSlot_info, guid);
         KvpValue* oldValue = pSlot_info->pKvpValue;
         pSlot_info->pKvpValue = new KvpValue {guid};
-        pSlot_info->is_ok = gnc_sql_do_db_operation (pSlot_info->be,
-                                                     OP_DB_INSERT, TABLE_NAME,
-                                                     TABLE_NAME, pSlot_info,
-                                                     col_table);
+        pSlot_info->is_ok = pSlot_info->be->do_db_operation(OP_DB_INSERT,
+                                                            TABLE_NAME,
+                                                            TABLE_NAME,
+                                                            pSlot_info,
+                                                            col_table);
         g_return_if_fail (pSlot_info->is_ok);
         pKvpFrame->for_each_slot (save_slot, pNewInfo);
         delete pSlot_info->pKvpValue;
@@ -667,10 +668,11 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
         slot_info_t* pNewInfo = slot_info_copy (pSlot_info, guid);
         KvpValue* oldValue = pSlot_info->pKvpValue;
         pSlot_info->pKvpValue = new KvpValue {guid};  // Transfer ownership!
-        pSlot_info->is_ok = gnc_sql_do_db_operation (pSlot_info->be,
-                                                     OP_DB_INSERT, TABLE_NAME,
-                                                     TABLE_NAME, pSlot_info,
-                                                     col_table);
+        pSlot_info->is_ok = pSlot_info->be->do_db_operation(OP_DB_INSERT,
+                                                            TABLE_NAME,
+                                                            TABLE_NAME,
+                                                            pSlot_info,
+                                                            col_table);
         g_return_if_fail (pSlot_info->is_ok);
         for (auto cursor = value->get<GList*> (); cursor; cursor = cursor->next)
         {
@@ -685,10 +687,11 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
     break;
     default:
     {
-        pSlot_info->is_ok = gnc_sql_do_db_operation (pSlot_info->be,
-                                                     OP_DB_INSERT, TABLE_NAME,
-                                                     TABLE_NAME, pSlot_info,
-                                                     col_table);
+        pSlot_info->is_ok = pSlot_info->be->do_db_operation (OP_DB_INSERT,
+                                                             TABLE_NAME,
+                                                             TABLE_NAME,
+                                                             pSlot_info,
+                                                             col_table);
     }
     break;
     }
@@ -761,8 +764,9 @@ gnc_sql_slots_delete (GncSqlBackend* sql_be, const GncGUID* guid)
     slot_info.be = sql_be;
     slot_info.guid = guid;
     slot_info.is_ok = TRUE;
-    slot_info.is_ok = gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TABLE_NAME,
-                                               TABLE_NAME, &slot_info, obj_guid_col_table);
+    slot_info.is_ok = sql_be->do_db_operation(OP_DB_DELETE, TABLE_NAME,
+                                              TABLE_NAME, &slot_info,
+                                              obj_guid_col_table);
 
     return slot_info.is_ok;
 }
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 5c72b75..62431c0 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -781,6 +781,166 @@ GncSqlBackend::upgrade_table (const std::string& table_name,
     execute_nonselect_statement(stmt);
 }
 
+static inline PairVec
+get_object_values (QofIdTypeConst obj_name,
+                   gpointer pObject, const EntryVec& table)
+{
+    PairVec vec;
+
+    for (auto const& table_row : table)
+    {
+        if (!(table_row->is_autoincr()))
+        {
+            table_row->add_to_query (obj_name, pObject, vec);
+        }
+    }
+    return vec;
+}
+
+bool
+GncSqlBackend::object_in_db (const char* table_name, QofIdTypeConst obj_name,
+                             const gpointer pObject, const EntryVec& table) const noexcept
+{
+    guint count;
+    g_return_val_if_fail (table_name != nullptr, false);
+    g_return_val_if_fail (obj_name != nullptr, false);
+    g_return_val_if_fail (pObject != nullptr, false);
+
+    /* SELECT * FROM */
+    auto sql = std::string{"SELECT "} + table[0]->name() + " FROM " + table_name;
+    auto stmt = create_statement_from_sql(sql.c_str());
+    assert (stmt != nullptr);
+
+    /* WHERE */
+    PairVec values{get_object_values(obj_name, pObject, table)};
+    stmt->add_where_cond(obj_name, values);
+    auto result = execute_select_statement (stmt);
+    return (result != nullptr && result->size() > 0);
+}
+
+bool
+GncSqlBackend::do_db_operation (E_DB_OPERATION op, const char* table_name,
+                                QofIdTypeConst obj_name, gpointer pObject,
+                                const EntryVec& table) const noexcept
+{
+    GncSqlStatementPtr stmt;
+
+    g_return_val_if_fail (table_name != nullptr, false);
+    g_return_val_if_fail (obj_name != nullptr, false);
+    g_return_val_if_fail (pObject != nullptr, false);
+
+    switch(op)
+    {
+        case  OP_DB_INSERT:
+        stmt = build_insert_statement (table_name, obj_name, pObject, table);
+        break;
+        case OP_DB_UPDATE:
+        stmt = build_update_statement (table_name, obj_name, pObject, table);
+        break;
+        case OP_DB_DELETE:
+        stmt = build_delete_statement (table_name, obj_name, pObject, table);
+        break;
+    }
+    if (stmt == nullptr)
+        return false;
+    return (execute_nonselect_statement(stmt) != -1);
+}
+
+GncSqlStatementPtr
+GncSqlBackend::build_insert_statement (const char* table_name,
+                                       QofIdTypeConst obj_name,
+                                       gpointer pObject,
+                                       const EntryVec& table) const noexcept
+{
+    GncSqlStatementPtr stmt;
+    PairVec col_values;
+    std::ostringstream sql;
+
+    g_return_val_if_fail (table_name != nullptr, nullptr);
+    g_return_val_if_fail (obj_name != nullptr, nullptr);
+    g_return_val_if_fail (pObject != nullptr, nullptr);
+    PairVec values{get_object_values(obj_name, pObject, table)};
+
+    sql << "INSERT INTO " << table_name <<"(";
+    for (auto const& col_value : values)
+    {
+        if (col_value != *values.begin())
+            sql << ",";
+        sql << col_value.first;
+    }
+
+    sql << ") VALUES(";
+    for (auto col_value : values)
+    {
+        if (col_value != *values.begin())
+            sql << ",";
+        sql << quote_string(col_value.second);
+    }
+    sql << ")";
+
+    stmt = create_statement_from_sql(sql.str());
+    return stmt;
+}
+
+GncSqlStatementPtr
+GncSqlBackend::build_update_statement(const gchar* table_name,
+                                      QofIdTypeConst obj_name, gpointer pObject,
+                                      const EntryVec& table) const noexcept
+{
+    GncSqlStatementPtr stmt;
+    std::ostringstream sql;
+
+    g_return_val_if_fail (table_name != nullptr, nullptr);
+    g_return_val_if_fail (obj_name != nullptr, nullptr);
+    g_return_val_if_fail (pObject != nullptr, nullptr);
+
+
+    PairVec values{get_object_values (obj_name, pObject, table)};
+
+    // Create the SQL statement
+    sql <<  "UPDATE " << table_name << " SET ";
+
+    for (auto const& col_value : values)
+    {
+        if (col_value != *values.begin())
+            sql << ",";
+        sql << col_value.first << "=" <<
+            quote_string(col_value.second);
+    }
+
+    stmt = create_statement_from_sql(sql.str());
+    /* We want our where condition to be just the first column and
+     * value, i.e. the guid of the object.
+     */
+    values.erase(values.begin() + 1, values.end());
+    stmt->add_where_cond(obj_name, values);
+    return stmt;
+}
+
+GncSqlStatementPtr
+GncSqlBackend::build_delete_statement(const gchar* table_name,
+                                      QofIdTypeConst obj_name,
+                                      gpointer pObject,
+                                      const EntryVec& table) const noexcept
+{
+    std::ostringstream sql;
+
+    g_return_val_if_fail (table_name != nullptr, nullptr);
+    g_return_val_if_fail (obj_name != nullptr, nullptr);
+    g_return_val_if_fail (pObject != nullptr, nullptr);
+
+    sql << "DELETE FROM " << table_name;
+    auto stmt = create_statement_from_sql (sql.str());
+
+    /* WHERE */
+    PairVec values;
+    table[0]->add_to_query (obj_name, pObject, values);
+    PairVec col_values{values[0]};
+    stmt->add_where_cond (obj_name, col_values);
+
+    return stmt;
+}
+
 GncSqlBackend::ObjectBackendRegistry::ObjectBackendRegistry()
 {
     register_backend(std::make_shared<GncSqlBookBackend>());
diff --git a/src/backend/sql/gnc-sql-backend.hpp b/src/backend/sql/gnc-sql-backend.hpp
index 0b899d8..41aaf4d 100644
--- a/src/backend/sql/gnc-sql-backend.hpp
+++ b/src/backend/sql/gnc-sql-backend.hpp
@@ -50,6 +50,13 @@ using VersionPair = std::pair<const std::string, unsigned int>;
 using VersionVec = std::vector<VersionPair>;
 using uint_t = unsigned int;
 
+typedef enum
+{
+    OP_DB_INSERT,
+    OP_DB_UPDATE,
+    OP_DB_DELETE
+} E_DB_OPERATION;
+
 /**
  *
  * Main SQL backend structure.
@@ -194,6 +201,31 @@ public:
      * @param type: The QofInstance type constant to select the object backend.
      */
     GncSqlObjectBackendPtr get_object_backend(const std::string& type) const noexcept;
+    /**
+     * Checks whether an object is in the database or not.
+     *
+     * @param table_name DB table name
+     * @param obj_name QOF object type name
+     * @param pObject Object to be checked
+     * @param table DB table description
+     * @return TRUE if the object is in the database, FALSE otherwise
+     */
+    bool object_in_db (const char* table_name, QofIdTypeConst obj_name,
+                       const gpointer pObject, const EntryVec& table ) const noexcept;
+    /**
+     * Performs an operation on the database.
+     *
+     * @param op Operation type
+     * @param table_name SQL table name
+     * @param obj_name QOF object type name
+     * @param pObject Gnucash object
+     * @param table DB table description
+     * @return TRUE if successful, FALSE if not
+     */
+    bool do_db_operation (E_DB_OPERATION op, const char* table_name,
+                          QofIdTypeConst obj_name, gpointer pObject,
+                          const EntryVec& table) const noexcept;
+
     QofBook* book() const noexcept { return m_book; }
     void set_loading(bool loading) noexcept { m_loading = loading; }
     bool pristine() const noexcept { return m_is_pristine_db; }
@@ -215,6 +247,19 @@ private:
     bool write_transactions();
     bool write_template_transactions();
     bool write_schedXactions();
+    GncSqlStatementPtr build_insert_statement (const char* table_name,
+                                               QofIdTypeConst obj_name,
+                                               gpointer pObject,
+                                               const EntryVec& table) const noexcept;
+    GncSqlStatementPtr build_update_statement (const gchar* table_name,
+                                               QofIdTypeConst obj_name,
+                                               gpointer pObject,
+                                               const EntryVec& table) const noexcept;
+    GncSqlStatementPtr build_delete_statement (const char* table_name,
+                                               QofIdTypeConst obj_name,
+                                               gpointer pObject,
+                                               const EntryVec& table) const noexcept;
+
     class ObjectBackendRegistry
     {
     public:
diff --git a/src/backend/sql/gnc-sql-object-backend.cpp b/src/backend/sql/gnc-sql-object-backend.cpp
index bf643db..c3d325e 100644
--- a/src/backend/sql/gnc-sql-object-backend.cpp
+++ b/src/backend/sql/gnc-sql-object-backend.cpp
@@ -29,7 +29,6 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
 #include "gnc-slots-sql.h"
-#include "gnc-backend-sql.h" //for gnc_sql_do_db_operation
 
 static QofLogModule log_module = G_LOG_DOMAIN;
 
@@ -54,8 +53,8 @@ GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
-                                     m_type_name.c_str(), inst, m_col_table);
+    is_ok = sql_be->do_db_operation(op, m_table_name.c_str(),
+                                    m_type_name.c_str(), inst, m_col_table);
 
     if (is_ok)
     {
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
index 6e53093..70e3ea9 100644
--- a/src/backend/sql/gnc-sql-object-backend.hpp
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -38,13 +38,6 @@ using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
 using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
 using InstanceVec = std::vector<QofInstance*>;
 
-typedef enum
-{
-    OP_DB_INSERT,
-    OP_DB_UPDATE,
-    OP_DB_DELETE
-} E_DB_OPERATION;
-
 /**
  * Encapsulates per-class table schema with functions to load, create a table,
  * commit a changed front-end object (note that database transaction semantics
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index ab26d27..e217933 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -372,8 +372,8 @@ delete_all_tt_entries (GncSqlBackend* sql_be, const GncGUID* guid)
 
     guid_info.be = sql_be;
     guid_info.guid = guid;
-    return gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TTENTRIES_TABLE_NAME,
-                                    TTENTRIES_TABLE_NAME, &guid_info, guid_col_table);
+    return sql_be->do_db_operation(OP_DB_DELETE, TTENTRIES_TABLE_NAME,
+                                   TTENTRIES_TABLE_NAME, &guid_info, guid_col_table);
 }
 
 static gboolean
@@ -391,11 +391,9 @@ save_tt_entries (GncSqlBackend* sql_be, const GncGUID* guid, GList* entries)
     for (entry = entries; entry != NULL && is_ok; entry = entry->next)
     {
         GncTaxTableEntry* e = (GncTaxTableEntry*)entry->data;
-        is_ok = gnc_sql_do_db_operation (sql_be,
-                                         OP_DB_INSERT,
-                                         TTENTRIES_TABLE_NAME,
-                                         GNC_ID_TAXTABLE, e,
-                                         ttentries_col_table);
+        is_ok = sql_be->do_db_operation(OP_DB_INSERT, TTENTRIES_TABLE_NAME,
+                                        GNC_ID_TAXTABLE, e,
+                                        ttentries_col_table);
     }
 
     return is_ok;
@@ -429,8 +427,8 @@ GncSqlTaxTableBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, TT_TABLE_NAME, GNC_ID_TAXTABLE, tt,
-                                     tt_col_table);
+    is_ok = sql_be->do_db_operation(op, TT_TABLE_NAME, GNC_ID_TAXTABLE, tt,
+                                    tt_col_table);
 
     if (is_ok)
     {
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 1b77403..5d35051 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -565,8 +565,8 @@ delete_splits (GncSqlBackend* sql_be, Transaction* pTx)
     g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (pTx != NULL, FALSE);
 
-    if (!gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, SPLIT_TABLE,
-                                  SPLIT_TABLE, pTx, tx_guid_col_table))
+    if (!sql_be->do_db_operation(OP_DB_DELETE, SPLIT_TABLE,
+                                 SPLIT_TABLE, pTx, tx_guid_col_table))
     {
         return FALSE;
     }
@@ -617,8 +617,8 @@ GncSqlSplitBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
         qof_instance_set_guid (inst, guid);
     }
 
-    is_ok = gnc_sql_do_db_operation (sql_be, op, SPLIT_TABLE, GNC_ID_SPLIT,
-                                     inst, split_col_table);
+    is_ok = sql_be->do_db_operation(op, SPLIT_TABLE, GNC_ID_SPLIT,
+                                    inst, split_col_table);
 
     if (is_ok && !qof_instance_get_destroying (inst))
     {
@@ -668,8 +668,8 @@ GncSqlTransBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx,
-                                         tx_col_table);
+        is_ok = sql_be->do_db_operation(op, TRANSACTION_TABLE, GNC_ID_TRANS,
+                                        pTx, tx_col_table);
         if (! is_ok)
         {
             err = "Transaction header save failed. Check trace log for SQL errors";
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index 3910243..1c0a6b1 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -165,8 +165,8 @@ GncSqlVendorBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     }
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_VENDOR, v,
-                                         col_table);
+        is_ok = sql_be->do_db_operation(op, TABLE_NAME, GNC_ID_VENDOR, v,
+                                        col_table);
     }
 
     if (is_ok)
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index fd42ee2..eba4a24 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -748,9 +748,9 @@ gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be, const gchar* table_name,// C:
 test_gnc_sql_object_is_it_in_db (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* gnc_sql_do_db_operation
+/* GncSqlBackend::do_db_operation
 gboolean
-gnc_sql_do_db_operation (GncSqlBackend* sql_be,// C: 22 in 12 */
+GncSqlBackend::do_db_operation (GncSqlBackend* sql_be,// C: 22 in 12 */
 /* static void
 test_gnc_sql_do_db_operation (Fixture *fixture, gconstpointer pData)
 {

commit f2eb13fc55e2b9c988aead25cd0218ae97a8a9df
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 13 12:41:56 2016 -0800

    Remove unused duplicate source file.

diff --git a/src/backend/sql/gnc-object-backend.cpp b/src/backend/sql/gnc-object-backend.cpp
deleted file mode 100644
index a27283c..0000000
--- a/src/backend/sql/gnc-object-backend.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/***********************************************************************\
- * gnc-sql-object-backend.hpp: Encapsulate per-class table schema.     *
- *                                                                     *
- * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
- *                                                                     *
- * This program is free software; you can redistribute it and/or       *
- * modify it under the terms of the GNU General Public License as      *
- * published by the Free Software Foundation; either version 2 of      *
- * the License, or (at your option) any later version.                 *
- *                                                                     *
- * This program is distributed in the hope that it will be useful,     *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
- * GNU General Public License for more details.                        *
- *                                                                     *
- * You should have received a copy of the GNU General Public License   *
- * along with this program; if not, contact:                           *
- *                                                                     *
- * Free Software Foundation           Voice:  +1-617-542-5942          *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
-\***********************************************************************/
-
-extern "C"
-{
-#include <config.h>
-}
-#include "gnc-sql-object-backend.hpp"
-#include "gnc-sql-backend.hpp"
-#include "gnc-sql-column-table-entry.hpp"
-
-bool
-GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
-{
-    const GncGUID* guid;
-    gboolean is_infant;
-    E_DB_OPERATION op;
-    gboolean is_ok;
-
-    is_infant = qof_instance_get_infant (inst);
-    if (qof_instance_get_destroying (inst))
-    {
-        op = OP_DB_DELETE;
-    }
-    else if (sql_be->pristine() || is_infant)
-    {
-        op = OP_DB_INSERT;
-    }
-    else
-    {
-        op = OP_DB_UPDATE;
-    }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
-                                     m_type_name.c_str(), inst, m_col_table);
-
-    if (is_ok)
-    {
-        // Now, commit any slots
-        guid = qof_instance_get_guid (inst);
-        if (!qof_instance_get_destroying (inst))
-        {
-            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
-        }
-        else
-        {
-            is_ok = gnc_sql_slots_delete (sql_be, guid);
-        }
-    }
-
-    return is_ok;
-}
-
-void
-GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
-{
-    g_return_if_fail (sql_be != nullptr);
-    int version = sql_be->get_table_version (m_table_name);
-    if (version == 0) //No tables, otherwise version will sql_be >= 1.
-    {
-        sql_be->create_table(m_table_name, m_col_table);
-        sql_be->set_table_version(m_table_name, m_version);
-    }
-    else if (version != m_version)
-        PERR("Version mismatch in table %s, expecting %d but backend is %d."
-             "Table creation aborted.", m_table_name.c_str(), m_version, version);
-}

commit ada3a312165965e3cd2ab39a6ebaed6b29170540
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 6 14:41:40 2016 -0800

    Fix DBI crash when URL lacks user and password.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index 0acb6e4..dd4a7c9 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -179,8 +179,10 @@ UriStrings::UriStrings(const std::string& uri)
     m_protocol = std::string{protocol};
     m_host = std::string{host};
     m_dbname = std::string{dbname};
-    m_username = std::string{username};
-    m_password = std::string{password};
+    if (username)
+	m_username = std::string{username};
+    if (password)
+	m_password = std::string{password};
     m_portnum = portnum;
     g_free(protocol);
     g_free(host);

commit c470d006ee3d182d173e64048ef420ae29f34a8d
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 6 10:06:24 2016 -0800

    Remove no-longer-necessary GncSqlBackend parameter.
    
    Where it was required only to pass down to the CT_TIMESPEC specialization
    of template<GncSqlObjectType Type>GncSqlColumnTableEntryImpl::add_to_query().

diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 52ddd00..508b304 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -395,19 +395,18 @@ GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_query(QofIdTypeConst obj_name,
+                                                        const gpointer pObject,
+                                                        PairVec& vec)
+    const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-address-sql.cpp b/src/backend/sql/gnc-address-sql.cpp
index 5effac3..2f2e521 100644
--- a/src/backend/sql/gnc-address-sql.cpp
+++ b/src/backend/sql/gnc-address-sql.cpp
@@ -109,10 +109,8 @@ GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(const GncSqlBackend* sql_be,
-                                                  ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
     for (auto const& subtable_row : col_table)
     {
         auto buf = std::string{m_col_name} + "_" + subtable_row->m_col_name;
@@ -126,8 +124,7 @@ GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(const GncSqlBackend* sql_be
  * it to operator<<().
  */
 template<> void
-GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index cf7bdea..759c868 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -579,7 +579,7 @@ gnc_sql_append_guids_to_sql (std::stringstream& sql, const InstanceVec& instance
 }
 /* ================================================================= */
 static PairVec
-get_object_values (GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+get_object_values (QofIdTypeConst obj_name,
                    gpointer pObject, const EntryVec& table)
 {
     PairVec vec;
@@ -588,7 +588,7 @@ get_object_values (GncSqlBackend* sql_be, QofIdTypeConst obj_name,
     {
         if (!(table_row->is_autoincr()))
         {
-            table_row->add_to_query (sql_be, obj_name, pObject, vec);
+            table_row->add_to_query (obj_name, pObject, vec);
         }
     }
     return vec;
@@ -610,7 +610,7 @@ gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be, const gchar* table_name,
     g_assert (stmt != NULL);
 
     /* WHERE */
-    PairVec values{get_object_values(sql_be, obj_name, pObject, table)};
+    PairVec values{get_object_values(obj_name, pObject, table)};
     stmt->add_where_cond(obj_name, values);
     auto result = sql_be->execute_select_statement (stmt);
     if (result != NULL)
@@ -672,7 +672,7 @@ build_insert_statement (GncSqlBackend* sql_be,
     g_return_val_if_fail (table_name != NULL, NULL);
     g_return_val_if_fail (obj_name != NULL, NULL);
     g_return_val_if_fail (pObject != NULL, NULL);
-    PairVec values{get_object_values(sql_be, obj_name, pObject, table)};
+    PairVec values{get_object_values(obj_name, pObject, table)};
 
     sql << "INSERT INTO " << table_name <<"(";
     for (auto const& col_value : values)
@@ -710,7 +710,7 @@ build_update_statement (GncSqlBackend* sql_be,
     g_return_val_if_fail (pObject != NULL, NULL);
 
 
-    PairVec values{get_object_values (sql_be, obj_name, pObject, table)};
+    PairVec values{get_object_values (obj_name, pObject, table)};
 
     // Create the SQL statement
     sql <<  "UPDATE " << table_name << " SET ";
@@ -750,7 +750,7 @@ build_delete_statement (GncSqlBackend* sql_be,
 
     /* WHERE */
     PairVec values;
-    table[0]->add_to_query (sql_be, obj_name, pObject, values);
+    table[0]->add_to_query (obj_name, pObject, values);
     PairVec col_values{values[0]};
     stmt->add_where_cond (obj_name, col_values);
 
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index 4a14a62..5d326a3 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -337,19 +337,17 @@ GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index a3b29bb..a9e0245 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -472,19 +472,17 @@ GncSqlColumnTableEntryImpl<CT_BUDGETREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index f3c1060..4f50a6e 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -271,19 +271,17 @@ GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index 0f78f76..6e69090 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -290,19 +290,17 @@ GncSqlColumnTableEntryImpl<CT_INVOICEREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp
index 27c6765..63d34e2 100644
--- a/src/backend/sql/gnc-lots-sql.cpp
+++ b/src/backend/sql/gnc-lots-sql.cpp
@@ -208,19 +208,17 @@ GncSqlColumnTableEntryImpl<CT_LOTREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp
index 46012ea..5d0aa5c 100644
--- a/src/backend/sql/gnc-order-sql.cpp
+++ b/src/backend/sql/gnc-order-sql.cpp
@@ -179,19 +179,17 @@ GncSqlColumnTableEntryImpl<CT_ORDERREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-owner-sql.cpp b/src/backend/sql/gnc-owner-sql.cpp
index 69f32fa..25ebf71 100644
--- a/src/backend/sql/gnc-owner-sql.cpp
+++ b/src/backend/sql/gnc-owner-sql.cpp
@@ -155,11 +155,8 @@ GncSqlColumnTableEntryImpl<CT_OWNERREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                      ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     auto buf = g_strdup_printf ("%s_type", m_col_name);
     GncSqlColumnInfo info(buf, BCT_INT, 0, false, false,
                           m_flags & COL_PKEY, m_flags & COL_NNUL);
@@ -172,12 +169,10 @@ GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(const GncSqlBackend* sql_b
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                      QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_query(QofIdTypeConst obj_name,
                                                       const gpointer pObject,
                                                       PairVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 1421bf6..5c72b75 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -148,7 +148,7 @@ GncSqlBackend::create_table(const std::string& table_name,
 
     for (auto const& table_row : col_table)
     {
-        table_row->add_to_table (this, info_vec);
+        table_row->add_to_table (info_vec);
     }
     return m_conn->create_table (table_name, info_vec);
 
@@ -179,7 +179,7 @@ GncSqlBackend::add_columns_to_table(const std::string& table_name,
 
     for (auto const& table_row : col_table)
     {
-        table_row->add_to_table (this, info_vec);
+        table_row->add_to_table (info_vec);
     }
     return m_conn->add_columns_to_table(table_name, info_vec);
 }
diff --git a/src/backend/sql/gnc-sql-column-table-entry.cpp b/src/backend/sql/gnc-sql-column-table-entry.cpp
index 1e7b3f0..24ecabe 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.cpp
@@ -95,8 +95,7 @@ GncSqlColumnTableEntry::get_setter(QofIdTypeConst obj_name) const noexcept
 }
 
 void
-GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* sql_be,
-                                                     QofIdTypeConst obj_name,
+GncSqlColumnTableEntry::add_objectref_guid_to_query (QofIdTypeConst obj_name,
                                                      const void* pObject,
                                                      PairVec& vec) const noexcept
 {
@@ -109,11 +108,8 @@ GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* sql_be
 }
 
 void
-GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* sql_be,
-                                                     ColVec& vec) const noexcept
+GncSqlColumnTableEntry::add_objectref_guid_to_table (ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
     vec.emplace_back(std::move(info));
 }
@@ -138,11 +134,8 @@ GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* sql_be,
-                                                  ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_STRING, m_size, TRUE};
     vec.emplace_back(std::move(info));
 }
@@ -151,8 +144,7 @@ GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* sql_be,
  * it to operator<<().
  */
 template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
@@ -187,22 +179,18 @@ GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(QofIdTypeConst obj_name,
+                                                 const gpointer pObject,
+                                                 PairVec& vec) const noexcept
 {
-    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
+    add_value_to_vec<int>(obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
@@ -226,22 +214,18 @@ GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
+    add_value_to_vec<int>(obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
@@ -264,22 +248,19 @@ GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(const GncSqlBackend* sql_be,
-                                                   ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_INT64, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(const GncSqlBackend* sql_be,
-                                                   QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(QofIdTypeConst obj_name,
                                                    const gpointer pObject,
                                                    PairVec& vec) const noexcept
 {
-    add_value_to_vec<int64_t>(sql_be, obj_name, pObject, vec);
+    add_value_to_vec<int64_t>(obj_name, pObject, vec);
 }
 /* ----------------------------------------------------------------- */
 
@@ -319,22 +300,18 @@ GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_DOUBLE, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_value_to_vec<double*>(sql_be, obj_name, pObject, vec);
+    add_value_to_vec<double*>(obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
@@ -367,20 +344,16 @@ GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(QofIdTypeConst obj_name,
+                                                  const gpointer pObject,
+                                                  PairVec& vec) const noexcept
 {
     auto s = get_row_value_from_object<GncGUID*>(obj_name, pObject);
 
@@ -436,18 +409,14 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
  }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != nullptr);
-
     GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_be,
-                                                      QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(QofIdTypeConst obj_name,
                                                       const gpointer pObject,
                                                       PairVec& vec) const noexcept
 {
@@ -457,7 +426,6 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_b
  * Timespec* and the getter returns a Timespec. Will be fixed by the
  * replacement of timespecs with time64s.
  */
-    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
@@ -537,8 +505,8 @@ GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(ColVec& vec) const noexcept
 
 template<> void
 GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
+                                                   const gpointer pObject,
+                                                   PairVec& vec) const noexcept
 {
     GDate *date = get_row_value_from_object<GDate*>(obj_name, pObject);
 
@@ -593,10 +561,8 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* sql_be,
-                                                     ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
 
     for (auto const& subtable_row : numeric_col_table)
     {
@@ -609,8 +575,7 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* sql_be
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* sql_be,
-                                                     QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(QofIdTypeConst obj_name,
                                                      const gpointer pObject,
                                                      PairVec& vec) const noexcept
 {
@@ -618,7 +583,6 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* sql_be
     NumericGetterFunc getter;
     gnc_numeric n;
 
-    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
diff --git a/src/backend/sql/gnc-sql-column-table-entry.hpp b/src/backend/sql/gnc-sql-column-table-entry.hpp
index 69710fd..579c549 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.hpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.hpp
@@ -124,13 +124,13 @@ public:
      * Add a GncSqlColumnInfo structure for the column type to a
      * ColVec.
      */
-    virtual void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept = 0;
+    virtual void add_to_table(ColVec& vec) const noexcept = 0;
     /**
      * Add a pair of the table column heading and object's value's string
      * representation to a PairVec; used for constructing WHERE clauses and
      * UPDATE statements.
      */
-    virtual void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+    virtual void add_to_query(QofIdTypeConst obj_name,
                               void* pObject, PairVec& vec) const noexcept = 0;
     /**
      * Retrieve the getter function depending on whether it's an auto-increment
@@ -180,7 +180,7 @@ protected:
     template <typename T> T
     get_row_value_from_object(QofIdTypeConst obj_name, const void* pObject) const;
     template <typename T> void
-    add_value_to_vec(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+    add_value_to_vec(QofIdTypeConst obj_name,
                      const void* pObject, PairVec& vec) const;
 /**
  * Adds a name/guid std::pair to a PairVec for creating a query.
@@ -190,8 +190,7 @@ protected:
  * @param pObject Object
  * @param pList List
  */
-    void add_objectref_guid_to_query (const GncSqlBackend* sql_be,
-                                      QofIdTypeConst obj_name,
+    void add_objectref_guid_to_query (QofIdTypeConst obj_name,
                                       const void* pObject,
                                       PairVec& vec) const noexcept;
 /**
@@ -200,8 +199,7 @@ protected:
  * @param sql_be SQL backend struct
  * @param pList List
  */
-    void add_objectref_guid_to_table (const GncSqlBackend* sql_be,
-                                      ColVec& vec) const noexcept;
+    void add_objectref_guid_to_table (ColVec& vec) const noexcept;
 private:
     const char* m_col_name;        /**< Column name */
     const GncSqlObjectType m_col_type;        /**< Column type */
@@ -217,12 +215,10 @@ private:
     template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
                                                       const void* pObject,
                                                       std::false_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
-                                                QofIdTypeConst obj_name,
+    template <typename T> void add_value_to_vec(QofIdTypeConst obj_name,
                                                 const void* pObject,
                                                 PairVec& vec, std::true_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
-                                                QofIdTypeConst obj_name,
+    template <typename T> void add_value_to_vec(QofIdTypeConst obj_name,
                                                 const void* pObject,
                                                 PairVec& vec, std::false_type) const;
 
@@ -242,9 +238,9 @@ public:
         {}
     void load(const GncSqlBackend* sql_be, GncSqlRow& row,  QofIdTypeConst obj_name,
               void* pObject) const noexcept override;
-    void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept override;
-    void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
-                      void* pObject, PairVec& vec) const noexcept override;
+    void add_to_table(ColVec& vec) const noexcept override;
+    void add_to_query(QofIdTypeConst obj_name, void* pObject, PairVec& vec)
+        const noexcept override;
 };
 
 using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
@@ -338,17 +334,15 @@ GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
+GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
                                          const void* pObject,
                                          PairVec& vec) const
 {
-    add_value_to_vec<T>(sql_be, obj_name, pObject, vec, std::is_pointer<T>());
+    add_value_to_vec<T>(obj_name, pObject, vec, std::is_pointer<T>());
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
+GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
                                          const void* pObject,
                                          PairVec& vec, std::true_type) const
 {
@@ -364,8 +358,7 @@ GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
+GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
                                          const void* pObject,
                                          PairVec& vec, std::false_type) const
 {
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index 8679b0e..ab26d27 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -494,19 +494,17 @@ GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                         ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                         QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_query(QofIdTypeConst obj_name,
                                                          const gpointer pObject,
                                                          PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index a630e65..1b77403 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -1385,19 +1385,17 @@ GncSqlColumnTableEntryImpl<CT_TXREF>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_table(const GncSqlBackend* sql_be,
-                                                   ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_table(ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(sql_be, vec);
+    add_objectref_guid_to_table(vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_query(const GncSqlBackend* sql_be,
-                                                   QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_query(QofIdTypeConst obj_name,
                                                    const gpointer pObject,
                                                    PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(obj_name, pObject, vec);
 }
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index 059959a..fd42ee2 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -570,7 +570,7 @@ test_add_gvalue_guid_to_slist (Fixture *fixture, gconstpointer pData)
 // Not Used
 /* gnc_sql_add_objectref_guid_to_vec
 void
-gnc_sql_add_objectref_guid_to_vec (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 1
+gnc_sql_add_objectref_guid_to_vec (QofIdTypeConst obj_name,// 1
 */
 /* static void
 test_gnc_sql_add_objectref_guid_to_vec (Fixture *fixture, gconstpointer pData)
@@ -579,38 +579,12 @@ test_gnc_sql_add_objectref_guid_to_vec (Fixture *fixture, gconstpointer pData)
 // Not Used
 /* gnc_sql_add_objectref_guid_col_info_to_list
 void
-gnc_sql_add_objectref_guid_col_info_to_list (const GncSqlBackend* sql_be,// 1
+gnc_sql_add_objectref_guid_col_info_to_list (,// 1
 */
 /* static void
 test_gnc_sql_add_objectref_guid_col_info_to_list (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* GncDbiBackend::time64_to_string
-std::string
-GncDbiBackend::time64_to_string (time64 t)// C: 1 */
-
-#define numtests 6
-static void
-test_time64_to_string ()
-{
-    GncSqlBackend sql_be {nullptr, nullptr, "%4d-%02d-%02d %02d:%02d:%02d"};
-    const char* dates[numtests] = {"1995-03-11 19:17:26",
-                                  "2001-04-20 11:44:07",
-                                  "1964-02-29 09:15:23",
-                                  "1959-04-02 00:00:00",
-                                  "2043-11-22 05:32:45",
-                                  "2153-12-18 01:15:30"
-                                 };
-    
-    for (auto date : dates)
-    {
-
-        Timespec ts = gnc_iso8601_to_timespec_gmt (date);
-        auto datestr = sql_be.time64_to_string (ts.tv_sec);
-        g_assert_cmpstr (date, == , datestr.c_str());
-    }
-
-}
 /* load_timespec
 static void
 load_timespec (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
@@ -929,8 +903,6 @@ test_suite_gnc_backend_sql (void)
 // GNC_TEST_ADD (suitename, "add value guid to vec", Fixture, nullptr, test_add_value_guid_to_vec,  teardown);
 // GNC_TEST_ADD (suitename, "gnc sql add gvalue objectref guid to slist", Fixture, nullptr, test_gnc_sql_add_objectref_guid_to_vec,  teardown);
 // GNC_TEST_ADD (suitename, "gnc sql add objectref guid col info to list", Fixture, nullptr, test_gnc_sql_add_objectref_guid_col_info_to_list,  teardown);
-    GNC_TEST_ADD_FUNC (suitename, "GncDbiBackend time64 to string",
-                       test_time64_to_string);
 // GNC_TEST_ADD (suitename, "load timespec", Fixture, nullptr, test_load_timespec,  teardown);
 // GNC_TEST_ADD (suitename, "add timespec col info to list", Fixture, nullptr, test_add_timespec_col_info_to_list,  teardown);
 // GNC_TEST_ADD (suitename, "add value timespec to vec", Fixture, nullptr, test_add_value_timespec_to_vec,  teardown);

commit 10b006fdc1fe67c6caff7efca163406c89e78187
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 6 09:50:15 2016 -0800

    Replace GncSqlBackend::time64_to_string() with GncDateTime::format_zulu().
    
    The primary motivation was to enable removing the sql_be parameter from
    get_object_values and all of the templates it calls for the sole purpose
    of using a customized per-server time output format (next commit). All
    known sql servers/libraries can ingest GMT in ISO form (yyyy-mm-dd hh:mm:ss)
    so there's no reason not to use a single standard format.
    
    This has the secondary benefit of also removing an ugly character-by-character
    formatting routine.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index 9a749fd..0acb6e4 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -110,10 +110,6 @@ static QofLogModule log_module = G_LOG_DOMAIN;
 #define SQLITE3_URI_PREFIX (SQLITE3_URI_TYPE "://")
 #define PGSQL_DEFAULT_PORT 5432
 
-constexpr const char* SQLITE3_TIMESPEC_STR_FORMAT = "%04d%02d%02d%02d%02d%02d";
-constexpr const char* MYSQL_TIMESPEC_STR_FORMAT =   "%04d%02d%02d%02d%02d%02d";
-constexpr const char* PGSQL_TIMESPEC_STR_FORMAT =   "%04d%02d%02d %02d%02d%02d";
-
 static void adjust_sql_options (dbi_conn connection);
 static bool save_may_clobber_data (dbi_conn conn, const std::string& dbname);
 static void init_sql_backend (GncDbiBackend* dbi_be);
@@ -128,20 +124,7 @@ template <DbType T> void gnc_dbi_session_begin(QofBackend* qof_be,
 template <DbType Type> QofBackend*
 new_backend ()
 {
-    const char* format;
-    switch (Type)
-    {
-        case (DbType::DBI_SQLITE):
-            format = SQLITE3_TIMESPEC_STR_FORMAT;
-            break;
-        case (DbType::DBI_MYSQL):
-            format = MYSQL_TIMESPEC_STR_FORMAT;
-            break;
-        case (DbType::DBI_PGSQL):
-            format = PGSQL_TIMESPEC_STR_FORMAT;
-            break;
-    }
-    auto dbi_be = new GncDbiBackend(nullptr, nullptr, format);
+    auto dbi_be = new GncDbiBackend(nullptr, nullptr);
     assert (dbi_be != nullptr);
 
     QofBackend* qof_be = reinterpret_cast<decltype(qof_be)>(dbi_be);
diff --git a/src/backend/dbi/gnc-backend-dbi.hpp b/src/backend/dbi/gnc-backend-dbi.hpp
index 07ab675..0a571d1 100644
--- a/src/backend/dbi/gnc-backend-dbi.hpp
+++ b/src/backend/dbi/gnc-backend-dbi.hpp
@@ -87,9 +87,8 @@ enum class DbType
 class GncDbiBackend : public GncSqlBackend
 {
 public:
-    GncDbiBackend(GncSqlConnection *conn, QofBook* book,
-                  const char* format = nullptr) :
-        GncSqlBackend(conn, book, format), m_exists{false} {}
+    GncDbiBackend(GncSqlConnection *conn, QofBook* book) :
+        GncSqlBackend(conn, book), m_exists{false} {}
     bool connected() const noexcept { return m_conn != nullptr; }
     /** FIXME: Just a pass-through to m_conn: */
     void set_error(int error, unsigned int repeat,  bool retry) noexcept
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 385db81..1421bf6 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -78,12 +78,11 @@ static EntryVec version_table
     gnc_sql_make_table_entry<CT_INT>(VERSION_COL_NAME, 0, COL_NNUL)
 };
 
-GncSqlBackend::GncSqlBackend(GncSqlConnection *conn, QofBook* book,
-                             const char* format) :
+GncSqlBackend::GncSqlBackend(GncSqlConnection *conn, QofBook* book) :
     qof_be {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
             nullptr, nullptr, nullptr, nullptr, ERR_BACKEND_NO_ERR, nullptr, 0,
             nullptr}, m_conn{conn}, m_book{book}, m_loading{false},
-        m_in_query{false}, m_is_pristine_db{false}, m_timespec_format{format}
+        m_in_query{false}, m_is_pristine_db{false}
 {
     if (conn != nullptr)
         connect (conn);
@@ -782,26 +781,6 @@ GncSqlBackend::upgrade_table (const std::string& table_name,
     execute_nonselect_statement(stmt);
 }
 
-/* This is required because we're passing be->timespace_format to
- * g_strdup_printf.
- */
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
-std::string
-GncSqlBackend::time64_to_string (time64 t) const noexcept
-{
-    auto tm = gnc_gmtime (&t);
-
-    auto year = tm->tm_year + 1900;
-
-    auto datebuf = g_strdup_printf (m_timespec_format,
-                                    year, tm->tm_mon + 1, tm->tm_mday,
-                                    tm->tm_hour, tm->tm_min, tm->tm_sec);
-    gnc_tm_free (tm);
-    std::string date{datebuf};
-    g_free(datebuf);
-    return date;
-}
-
 GncSqlBackend::ObjectBackendRegistry::ObjectBackendRegistry()
 {
     register_backend(std::make_shared<GncSqlBookBackend>());
diff --git a/src/backend/sql/gnc-sql-backend.hpp b/src/backend/sql/gnc-sql-backend.hpp
index 8ccab9a..0b899d8 100644
--- a/src/backend/sql/gnc-sql-backend.hpp
+++ b/src/backend/sql/gnc-sql-backend.hpp
@@ -57,8 +57,7 @@ using uint_t = unsigned int;
 class GncSqlBackend
 {
 public:
-    GncSqlBackend(GncSqlConnection *conn, QofBook* book,
-                  const char* format = nullptr);
+    GncSqlBackend(GncSqlConnection *conn, QofBook* book);
     virtual ~GncSqlBackend() = default;
     /** Connect the backend to a GncSqlConnection.
      * Sets up version info. Calling with nullptr clears the connection and
@@ -151,13 +150,6 @@ public:
     uint_t get_table_version(const std::string& table_name) const noexcept;
     bool set_table_version (const std::string& table_name, uint_t version) noexcept;
     /**
-     * Converts a time64 value to a string value for the database.
-     *
-     * @param t time64 to be converted.
-     * @return String representation of the Timespec
-     */
-    std::string time64_to_string (time64 t) const noexcept;
-    /**
      * Load the contents of an SQL database into a book.
      *
      * @param book Book to be loaded
diff --git a/src/backend/sql/gnc-sql-column-table-entry.cpp b/src/backend/sql/gnc-sql-column-table-entry.cpp
index ea536a2..1e7b3f0 100644
--- a/src/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/src/backend/sql/gnc-sql-column-table-entry.cpp
@@ -28,7 +28,7 @@ extern "C"
 }
 #include <sstream>
 #include <iomanip>
-
+#include <gnc-datetime.hpp>
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
@@ -396,8 +396,7 @@ GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* sql_be,
 typedef Timespec (*TimespecAccessFunc) (const gpointer);
 typedef void (*TimespecSetterFunc) (const gpointer, Timespec*);
 
-#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
-#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
+#define TIMESPEC_COL_SIZE (4+3+3+3+3+3)
 
 template<> void
 GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
@@ -423,13 +422,8 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
         try
         {
             auto val = row.get_string_at_col(m_col_name);
-            auto s = val.c_str();
-            auto buf = g_strdup_printf ("%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
-                                        s[0], s[1], s[2], s[3], s[4], s[5],
-                                        s[6], s[7], s[8], s[9], s[10], s[11],
-                                        s[12], s[13]);
-            ts = gnc_iso8601_to_timespec_gmt (buf);
-            g_free (buf);
+            GncDateTime time(val);
+            ts.tv_sec = static_cast<time64>(time);
         }
         catch (std::invalid_argument)
         {
@@ -480,12 +474,9 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_b
         ts = (*ts_getter) (pObject);
     }
 
-    if (ts.tv_sec != 0 || ts.tv_nsec != 0)
-    {
-        auto datebuf = sql_be->time64_to_string (ts.tv_sec);
-        vec.emplace_back (std::make_pair (std::string{m_col_name}, datebuf));
-        return;
-    }
+    GncDateTime time(ts.tv_sec);
+    vec.emplace_back (std::make_pair (std::string{m_col_name},
+                                      time.format_zulu ("%Y-%m-%d %H:%M:%S")));
 }
 
 /* ----------------------------------------------------------------- */
@@ -538,18 +529,14 @@ GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* sql_be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(ColVec& vec) const noexcept
 {
-    g_return_if_fail (sql_be != NULL);
-
     GncSqlColumnInfo info{*this,  BCT_DATE, DATE_COL_SIZE, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index c29f4b8..a630e65 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -51,6 +51,7 @@ extern "C"
 
 #include "escape.h"
 
+#include <gnc-datetime.hpp>
 #include "gnc-sql-connection.hpp"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-object-backend.hpp"
@@ -959,7 +960,8 @@ convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
         {
             query_date_t date_data = (query_date_t)pPredData;
 
-            auto datebuf = sql_be->time64_to_string (date_data->date.tv_sec);
+            GncDateTime time(date_data->date.tv_sec);
+            auto datebuf = time.format_zulu ("%Y-%m-%d %H:%M%S");
             g_string_append_printf (sql, "'%s'", datebuf.c_str());
 
         }

commit db719191a1319d5ef00e1337f4aa43013fff2645
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Nov 6 09:39:21 2016 -0800

    New function GncDateTime::format_zulu(), makes time string in GMT.
    
    Required to ensure that date-times stored in SQL backend are in GMT for
    backward compatibility.

diff --git a/src/libqof/qof/gnc-datetime.cpp b/src/libqof/qof/gnc-datetime.cpp
index a96d3c4..ab3803c 100644
--- a/src/libqof/qof/gnc-datetime.cpp
+++ b/src/libqof/qof/gnc-datetime.cpp
@@ -71,6 +71,7 @@ public:
     void today() { m_greg = boost::gregorian::day_clock::local_day(); }
     ymd year_month_day() const;
     std::string format(const char* format) const;
+    std::string format_zulu(const char* format) const;
 private:
     Date m_greg;
 };
@@ -147,6 +148,7 @@ public:
     struct tm utc_tm() const { return to_tm(m_time.utc_time()); }
     std::unique_ptr<GncDateImpl> date() const;
     std::string format(const char* format) const;
+    std::string format_zulu(const char* format) const;
 private:
     LDT m_time;
 };
@@ -256,6 +258,18 @@ GncDateTimeImpl::format(const char* format) const
     return ss.str();
 }
 
+std::string
+GncDateTimeImpl::format_zulu(const char* format) const
+{
+    using Facet = boost::posix_time::time_facet;
+    std::stringstream ss;
+    //The stream destructor frees the facet, so it must be heap-allocated.
+    auto output_facet(new Facet(format));
+    ss.imbue(std::locale(std::locale(), output_facet));
+    ss << m_time.utc_time();
+    return ss.str();
+}
+
 /* =================== Presentation-class Implementations ====================*/
 /* GncDate */
 GncDate::GncDate() : m_impl{new GncDateImpl} {}
@@ -337,3 +351,9 @@ GncDateTime::format(const char* format) const
 {
     return m_impl->format(format);
 }
+
+std::string
+GncDateTime::format_zulu(const char* format) const
+{
+    return m_impl->format_zulu(format);
+}
diff --git a/src/libqof/qof/gnc-datetime.hpp b/src/libqof/qof/gnc-datetime.hpp
index 058f50c..3942c4b 100644
--- a/src/libqof/qof/gnc-datetime.hpp
+++ b/src/libqof/qof/gnc-datetime.hpp
@@ -157,10 +157,19 @@ public:
  *  presented. Code letters preceded with % stand in for arguments;
  *  most are the same as described in strftime(3), but there are a few
  *  differences. Consult the boost::date_time documentation.
- *  @return a std::string containing a representation of the date
- *  according to the format.
+ *  @return a std::string containing a representation of the date and time in
+ *  the locale's time zone according to the format.
  */
     std::string format(const char* format) const;
+/** Format the GncDateTime into a std::string in GMT
+ *  @param format: A cstr describing the way the date and time are
+ *  presented. Code letters preceded with % stand in for arguments;
+ *  most are the same as described in strftime(3), but there are a few
+ *  differences. Consult the boost::date_time documentation.
+ *  @return a std::string containing a representation of the date and time in
+ *  GMT (timezone Z) according to the format.
+ */
+    std::string format_zulu(const char* format) const;
 
 private:
     std::unique_ptr<GncDateTimeImpl> m_impl;
diff --git a/src/libqof/qof/test/gtest-gnc-datetime.cpp b/src/libqof/qof/test/gtest-gnc-datetime.cpp
index 9d1b3cf..6d378a8 100644
--- a/src/libqof/qof/test/gtest-gnc-datetime.cpp
+++ b/src/libqof/qof/test/gtest-gnc-datetime.cpp
@@ -77,6 +77,13 @@ TEST(gnc_datetime_functions, test_format)
     EXPECT_EQ(atime.format("%d-%m-%Y"), "13-11-2045");
 }
 
+TEST(gnc_datetime_functions, test_format_zulu)
+{
+    GncDateTime atime(2394187200); //2045-11-13 12:00:00 Z
+    //Date only to finesse timezone issues. It will still fail in +12 DST.
+    EXPECT_EQ(atime.format_zulu("%d-%m-%Y %H:%M:%S"), "13-11-2045 12:00:00");
+}
+
 //This is a bit convoluted because it uses GncDate's GncDateImpl constructor and year_month_day() function. There's no good way to test the former without violating the privacy of the implementation.
 TEST(gnc_datetime_functions, test_date)
 {

commit ee0e61a07e36921097d585b1ccb1b40357fb91b3
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Nov 3 14:21:11 2016 -0700

    Replace C API with C++ API for functions used by GncSqlDbiBackend.
    
    Since these are now parent-class member functions they can be called
    directly from dbi_be without any casting gymnastics.
    
    Also: Move the GncSqlObjectBackend registry to its own class, a private
    member of GncSqlBackend. This eliminates a static variable in gnc-backend-sql.cpp
    and allows the GncSqlBackend::ObjectRegistry constructor to insert all of
    the backends into the list, eliminating gnc_sql_init() and all of the
    gnc_sql_init_foo_handler() functions. The cost of this is that the objects
    are now created on the free store instead of the text segment.
    
    Because the object backends are created at GncSqlBackend construction
    there is now a GncSqlBookBackend in the registry and the second error
    message in test_gnc_sql_commit_edit is no longer emitted; instead, the
    object is properly committed.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index f832a11..9a749fd 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -231,17 +231,6 @@ UriStrings::quote_dbname(DbType t) const noexcept
 }
 
 static void
-create_tables(const OBEEntry& entry, GncDbiBackend* dbi_be)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe = nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail(obe->is_version (GNC_SQL_BACKEND_VERSION));
-
-    obe->create_tables (dbi_be);
-}
-
-static void
 set_options(dbi_conn conn, const PairVec& options)
 {
     for (auto option : options)
@@ -872,14 +861,10 @@ gnc_dbi_load (QofBackend* qof_be,  QofBook* book, QofBackendLoadType loadType)
         // Set up table version information
         dbi_be->init_version_info ();
         assert (dbi_be->m_book == nullptr);
-
-        // Call all object backends to create any required tables
-        auto registry = gnc_sql_get_backend_registry();
-        for (auto entry : registry)
-            create_tables(entry, dbi_be);
+        dbi_be->create_tables();
     }
 
-    gnc_sql_load (dbi_be, book, loadType);
+    dbi_be->load(book, loadType);
 
     if (GNUCASH_RESAVE_VERSION > dbi_be->get_table_version("Gnucash"))
     {
@@ -961,7 +946,7 @@ gnc_dbi_safe_sync_all (QofBackend* qof_be, QofBook* book)
         }
     }
 
-    gnc_sql_sync_all (dbi_be, book);
+    dbi_be->sync_all(book);
     if (qof_backend_check_error (qof_be))
     {
         conn->table_operation (table_list, rollback);
@@ -980,7 +965,7 @@ gnc_dbi_begin_edit (QofBackend* qof_be, QofInstance* inst)
     g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_begin_edit (dbi_be, inst);
+    dbi_be->begin_edit(inst);
 }
 
 static void
@@ -991,7 +976,7 @@ gnc_dbi_rollback_edit (QofBackend* qof_be, QofInstance* inst)
     g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_rollback_edit (dbi_be, inst);
+    dbi_be->rollback_edit(inst);
 }
 
 static void
@@ -1002,7 +987,7 @@ gnc_dbi_commit_edit (QofBackend* qof_be, QofInstance* inst)
     g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_commit_edit (dbi_be, inst);
+    dbi_be->commit_edit(inst);
 }
 
 /* ================================================================= */
@@ -1028,13 +1013,11 @@ init_sql_backend (GncDbiBackend* dbi_be)
     qof_be->safe_sync = gnc_dbi_safe_sync_all;
     /* CoA Export function not implemented for the SQL backend. */
     qof_be->export_fn = nullptr;
-
-    gnc_sql_init (dbi_be);
 }
 
 /*
  * Checks to see whether the file is an sqlite file or not
- *1980
+ *
  */
 template<> bool
 QofDbiBackendProvider<DbType::DBI_SQLITE>::type_check(const char *uri)
diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 7908a45..52ddd00 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -94,17 +94,9 @@ static EntryVec parent_col_table
         "parent_guid", 0, 0, nullptr, (QofSetterFunc)set_parent_guid),
 });
 
-class GncSqlAccountBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlAccountBackend(int version, const std::string& type,
-                         const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override;
-};
-
-
+GncSqlAccountBackend::GncSqlAccountBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT,
+                        TABLE_NAME, col_table) {}
 
 typedef struct
 {
@@ -417,12 +409,5 @@ GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_query(const GncSqlBackend* sql
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_sql_init_account_handler (void)
-{
-    static GncSqlAccountBackend be_data{
-        GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-account-sql.h b/src/backend/sql/gnc-account-sql.h
index 84c01d8..8d544e6 100644
--- a/src/backend/sql/gnc-account-sql.h
+++ b/src/backend/sql/gnc-account-sql.h
@@ -29,12 +29,14 @@
 #ifndef GNC_ACCOUNT_SQL_H
 #define GNC_ACCOUNT_SQL_H
 
-#include "gnc-backend-sql.h"
-extern "C"
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlAccountBackend : public GncSqlObjectBackend
 {
-#include "qof.h"
-}
-void gnc_sql_init_account_handler (void);
-gboolean gnc_sql_save_account (GncSqlBackend* sql_be, QofInstance* inst);
+public:
+    GncSqlAccountBackend();
+    void load_all(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override;
+};
 
 #endif /* GNC_ACCOUNT_SQL_H */
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index c426015..cf7bdea 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -103,531 +103,12 @@ static GncSqlStatementPtr build_delete_statement (GncSqlBackend* sql_be,
                                                   gpointer pObject,
                                                   const EntryVec& table);
 
-static GList* post_load_commodities = NULL;
-
 #define TRANSACTION_NAME "trans"
 
-typedef struct
-{
-    QofIdType searchObj;
-    gpointer pCompiledQuery;
-} gnc_sql_query_info;
-
-/* callback structure */
-typedef struct
-{
-    gboolean is_known;
-    gboolean is_ok;
-    GncSqlBackend* sql_be;
-    QofInstance* inst;
-    QofQuery* pQuery;
-    gpointer pCompiledQuery;
-    gnc_sql_query_info* pQueryInfo;
-} sql_backend;
-
 static QofLogModule log_module = G_LOG_DOMAIN;
 
 #define SQLITE_PROVIDER_NAME "SQLite"
 
-/* ================================================================= */
-static OBEVec backend_registry;
-void
-gnc_sql_register_backend(OBEEntry&& entry)
-{
-    backend_registry.emplace_back(entry);
-}
-
-void
-gnc_sql_register_backend(GncSqlObjectBackendPtr obe)
-{
-    backend_registry.emplace_back(make_tuple(std::string{obe->type()}, obe));
-}
-
-const OBEVec&
-gnc_sql_get_backend_registry()
-{
-    return backend_registry;
-}
-
-GncSqlObjectBackendPtr
-gnc_sql_get_object_backend(const std::string& type)
-{
-    auto entry = std::find_if(backend_registry.begin(),
-                              backend_registry.end(),
-                              [type](const OBEEntry& entry){
-                                  return type == std::get<0>(entry);
-                              });
-    if (entry == backend_registry.end())
-        return nullptr;
-
-    return std::get<1>(*entry);
-}
-
-void
-gnc_sql_init(GncSqlBackend* sql_be)
-{
-    static gboolean initialized = FALSE;
-
-    if (!initialized)
-    {
-        gnc_sql_init_object_handlers ();
-        initialized = TRUE;
-    }
-}
-
-/* ================================================================= */
-
-static void
-create_tables(const OBEEntry& entry, GncSqlBackend* sql_be)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe = nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail (obe->is_version (GNC_SQL_BACKEND_VERSION));
-    sql_be->update_progress();
-    obe->create_tables(sql_be);
-}
-
-/* ================================================================= */
-
-/* Main object load order */
-static const StrVec fixed_load_order
-{ GNC_ID_BOOK, GNC_ID_COMMODITY, GNC_ID_ACCOUNT, GNC_ID_LOT };
-
-/* Order in which business objects need to be loaded */
-static const StrVec business_fixed_load_order =
-{ GNC_ID_BILLTERM, GNC_ID_TAXTABLE, GNC_ID_INVOICE };
-
-static void
-initial_load(const OBEEntry& entry, GncSqlBackend* sql_be)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe = nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail(obe->is_version (GNC_SQL_BACKEND_VERSION));
-
-    /* Don't need to load anything if it has already been loaded with
-     * the fixed order.
-     */
-    if (std::find(fixed_load_order.begin(), fixed_load_order.end(),
-                  type) != fixed_load_order.end()) return;
-    if (std::find(business_fixed_load_order.begin(), business_fixed_load_order.end(),
-                  type) != business_fixed_load_order.end()) return;
-
-    obe->load_all (sql_be);
-}
-
-void
-gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* sql_be,
-                                                gpointer comm)
-{
-    post_load_commodities = g_list_prepend (post_load_commodities, comm);
-}
-
-static void
-commit_commodity (gpointer data)
-{
-    gnc_commodity* comm = GNC_COMMODITY (data);
-    gnc_sql_commit_commodity (comm);
-}
-
-void
-gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book, QofBackendLoadType loadType)
-{
-    Account* root;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (book != NULL);
-
-    ENTER ("sql_be=%p, book=%p", sql_be, book);
-
-    sql_be->m_loading = TRUE;
-
-    if (loadType == LOAD_TYPE_INITIAL_LOAD)
-    {
-        g_assert (sql_be->m_book == NULL);
-        sql_be->m_book = book;
-
-        /* Load any initial stuff. Some of this needs to happen in a certain order */
-        for (auto type : fixed_load_order)
-        {
-            auto obe = gnc_sql_get_object_backend(type);
-            if (obe)
-            {
-                sql_be->update_progress();
-                obe->load_all (sql_be);
-            }
-        }
-        for (auto type : business_fixed_load_order)
-        {
-            auto obe = gnc_sql_get_object_backend(type);
-            if (obe)
-            {
-                sql_be->update_progress();
-                obe->load_all (sql_be);
-            }
-        }
-
-        root = gnc_book_get_root_account( book );
-        gnc_account_foreach_descendant(root, (AccountCb)xaccAccountBeginEdit,
-                                       nullptr);
-
-        for (auto entry : backend_registry)
-            initial_load(entry, sql_be);
-
-        gnc_account_foreach_descendant(root, (AccountCb)xaccAccountCommitEdit,
-                                       nullptr);
-    }
-    else if (loadType == LOAD_TYPE_LOAD_ALL)
-    {
-        // Load all transactions
-        auto obe = gnc_sql_get_object_backend (GNC_ID_TRANS);
-        obe->load_all (sql_be);
-    }
-
-    sql_be->m_loading = FALSE;
-    g_list_free_full (post_load_commodities, commit_commodity);
-    post_load_commodities = NULL;
-
-    /* Mark the sessoion as clean -- though it should never be marked
-     * dirty with this backend
-     */
-    qof_book_mark_session_saved (book);
-    sql_be->finish_progress();
-
-    LEAVE ("");
-}
-
-/* ================================================================= */
-
-static gboolean
-write_account_tree (GncSqlBackend* sql_be, Account* root)
-{
-    GList* descendants;
-    GList* node;
-    gboolean is_ok = TRUE;
-
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-    g_return_val_if_fail (root != NULL, FALSE);
-
-    auto obe = gnc_sql_get_object_backend (GNC_ID_ACCOUNT);
-    is_ok = obe->commit (sql_be, QOF_INSTANCE (root));
-    if (is_ok)
-    {
-        descendants = gnc_account_get_descendants (root);
-        for (node = descendants; node != NULL && is_ok; node = g_list_next (node))
-        {
-            is_ok = obe->commit(sql_be, QOF_INSTANCE (GNC_ACCOUNT (node->data)));
-            if (!is_ok) break;
-        }
-        g_list_free (descendants);
-    }
-    sql_be->update_progress();
-
-    return is_ok;
-}
-
-static gboolean
-write_accounts (GncSqlBackend* sql_be)
-{
-    gboolean is_ok;
-
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-
-    sql_be->update_progress();
-    is_ok = write_account_tree (sql_be, gnc_book_get_root_account (sql_be->book()));
-    if (is_ok)
-    {
-        sql_be->update_progress();
-        is_ok = write_account_tree (sql_be, gnc_book_get_template_root (sql_be->book()));
-    }
-
-    return is_ok;
-}
-
-static gboolean
-write_tx (Transaction* tx, gpointer data)
-{
-    auto s = static_cast<write_objects_t*>(data);
-
-    g_return_val_if_fail (tx != NULL, 0);
-    g_return_val_if_fail (data != NULL, 0);
-
-    s->commit (QOF_INSTANCE (tx));
-    auto splitbe = gnc_sql_get_object_backend (GNC_ID_SPLIT);
-    for (auto split_node = xaccTransGetSplitList (tx);
-         split_node != nullptr && s->is_ok;
-         split_node = g_list_next (split_node))
-    {
-        s->is_ok = splitbe->commit(s->be, QOF_INSTANCE(split_node->data));
-    }
-    s->be->update_progress ();
-    return (s->is_ok ? 0 : 1);
-}
-
-static gboolean
-write_transactions (GncSqlBackend* sql_be)
-{
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-
-    auto obe = gnc_sql_get_object_backend(GNC_ID_TRANS);
-    write_objects_t data{sql_be, true, obe};
-
-    (void)xaccAccountTreeForEachTransaction (
-        gnc_book_get_root_account (sql_be->book()), write_tx, &data);
-    sql_be->update_progress();
-    return data.is_ok;
-}
-
-static gboolean
-write_template_transactions (GncSqlBackend* sql_be)
-{
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-
-    auto obe = gnc_sql_get_object_backend(GNC_ID_TRANS);
-    write_objects_t data{sql_be, true, obe};
-    auto ra = gnc_book_get_template_root (sql_be->book());
-    if (gnc_account_n_descendants (ra) > 0)
-    {
-        (void)xaccAccountTreeForEachTransaction (ra, write_tx, &data);
-        sql_be->update_progress();
-    }
-
-    return data.is_ok;
-}
-
-static gboolean
-write_schedXactions (GncSqlBackend* sql_be)
-{
-    GList* schedXactions;
-    SchedXaction* tmpSX;
-    gboolean is_ok = TRUE;
-
-    g_return_val_if_fail (sql_be != NULL, FALSE);
-
-    schedXactions = gnc_book_get_schedxactions (sql_be->book())->sx_list;
-    auto obe = gnc_sql_get_object_backend(GNC_ID_SCHEDXACTION);
-
-    for (; schedXactions != NULL && is_ok; schedXactions = schedXactions->next)
-    {
-        tmpSX = static_cast<decltype (tmpSX)> (schedXactions->data);
-        is_ok = obe->commit (sql_be, QOF_INSTANCE (tmpSX));
-    }
-    sql_be->update_progress();
-
-    return is_ok;
-}
-
-#pragma GCC diagnostic warning "-Wformat-nonliteral"
-
-void
-gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book)
-{
-    gboolean is_ok;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (book != NULL);
-
-    sql_be->reset_version_info();
-    ENTER ("book=%p, sql_be->book=%p", book, sql_be->book());
-    sql_be->update_progress();
-
-    /* Create new tables */
-    sql_be->m_is_pristine_db = true;
-    for(auto entry : backend_registry)
-        create_tables(entry, sql_be);
-
-    /* Save all contents */
-    sql_be->m_book = book;
-    is_ok = sql_be->m_conn->begin_transaction ();
-
-    // FIXME: should write the set of commodities that are used
-    //write_commodities( sql_be, book );
-    if (is_ok)
-    {
-        auto obe = gnc_sql_get_object_backend(GNC_ID_BOOK);
-        is_ok = obe->commit (sql_be, QOF_INSTANCE (book));
-    }
-    if (is_ok)
-    {
-        is_ok = write_accounts (sql_be);
-    }
-    if (is_ok)
-    {
-        is_ok = write_transactions (sql_be);
-    }
-    if (is_ok)
-    {
-        is_ok = write_template_transactions (sql_be);
-    }
-    if (is_ok)
-    {
-        is_ok = write_schedXactions (sql_be);
-    }
-    if (is_ok)
-    {
-        for (auto entry : backend_registry)
-            std::get<1>(entry)->write (sql_be);
-    }
-    if (is_ok)
-    {
-        is_ok = sql_be->m_conn->commit_transaction ();
-    }
-    if (is_ok)
-    {
-        sql_be->m_is_pristine_db = false;
-
-        /* Mark the session as clean -- though it shouldn't ever get
-         * marked dirty with this backend
-         */
-        qof_book_mark_session_saved (book);
-    }
-    else
-    {
-        if (!qof_backend_check_error ((QofBackend*)sql_be))
-            qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_SERVER_ERR);
-        is_ok = sql_be->m_conn->rollback_transaction ();
-    }
-    sql_be->finish_progress();
-    LEAVE ("book=%p", book);
-}
-
-/* ================================================================= */
-/* Routines to deal with the creation of multiple books. */
-
-void
-gnc_sql_begin_edit (GncSqlBackend* sql_be, QofInstance* inst)
-{
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (inst != NULL);
-
-    ENTER (" ");
-    LEAVE ("");
-}
-
-void
-gnc_sql_rollback_edit (GncSqlBackend* sql_be, QofInstance* inst)
-{
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (inst != NULL);
-
-    ENTER (" ");
-    LEAVE ("");
-}
-
-static void
-commit(const OBEEntry& entry, sql_backend* be_data)
-{
-    std::string type;
-    GncSqlObjectBackendPtr obe= nullptr;
-    std::tie(type, obe) = entry;
-    g_return_if_fail (obe->is_version (GNC_SQL_BACKEND_VERSION));
-
-    /* If this has already been handled, or is not the correct
-     * handler, return
-     */
-    if (type != std::string{be_data->inst->e_type}) return;
-    if (be_data->is_known) return;
-
-    be_data->is_ok = obe->commit (be_data->sql_be, be_data->inst);
-    be_data->is_known = TRUE;
-}
-
-/* Commit_edit handler - find the correct backend handler for this object
- * type and call its commit handler
- */
-void
-gnc_sql_commit_edit (GncSqlBackend* sql_be, QofInstance* inst)
-{
-    sql_backend be_data;
-    gboolean is_dirty;
-    gboolean is_destroying;
-    gboolean is_infant;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (inst != NULL);
-
-    if (qof_book_is_readonly (sql_be->book()))
-    {
-        qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_READONLY);
-        (void)sql_be->m_conn->rollback_transaction ();
-        return;
-    }
-    /* During initial load where objects are being created, don't commit
-    anything, but do mark the object as clean. */
-    if (sql_be->m_loading)
-    {
-        qof_instance_mark_clean (inst);
-        return;
-    }
-
-    // The engine has a PriceDB object but it isn't in the database
-    if (strcmp (inst->e_type, "PriceDB") == 0)
-    {
-        qof_instance_mark_clean (inst);
-        qof_book_mark_session_saved (sql_be->book());
-        return;
-    }
-
-    ENTER (" ");
-
-    is_dirty = qof_instance_get_dirty_flag (inst);
-    is_destroying = qof_instance_get_destroying (inst);
-    is_infant = qof_instance_get_infant (inst);
-
-    DEBUG ("%s dirty = %d, do_free = %d, infant = %d\n",
-           (inst->e_type ? inst->e_type : "(null)"),
-           is_dirty, is_destroying, is_infant);
-
-    if (!is_dirty && !is_destroying)
-    {
-        LEAVE ("!dirty OR !destroying");
-        return;
-    }
-
-    if (!sql_be->m_conn->begin_transaction ())
-    {
-        PERR ("gnc_sql_commit_edit(): begin_transaction failed\n");
-        LEAVE ("Rolled back - database transaction begin error");
-        return;
-    }
-
-    be_data.is_known = FALSE;
-    be_data.sql_be = sql_be;
-    be_data.inst = inst;
-    be_data.is_ok = TRUE;
-
-    for (auto entry : backend_registry)
-        commit(entry, &be_data);
-
-    if (!be_data.is_known)
-    {
-        PERR ("gnc_sql_commit_edit(): Unknown object type '%s'\n", inst->e_type);
-        (void)sql_be->m_conn->rollback_transaction ();
-
-        // Don't let unknown items still mark the book as being dirty
-        qof_book_mark_session_saved (sql_be->book());
-        qof_instance_mark_clean (inst);
-        LEAVE ("Rolled back - unknown object type");
-        return;
-    }
-    if (!be_data.is_ok)
-    {
-        // Error - roll it back
-        (void)sql_be->m_conn->rollback_transaction ();
-
-        // This *should* leave things marked dirty
-        LEAVE ("Rolled back - database error");
-        return;
-    }
-
-    (void)sql_be->m_conn->commit_transaction ();
-
-    qof_book_mark_session_saved (sql_be->book());
-    qof_instance_mark_clean (inst);
-
-    LEAVE ("");
-}
 /* ---------------------------------------------------------------------- */
 
 /* Query processing */
@@ -1276,43 +757,4 @@ build_delete_statement (GncSqlBackend* sql_be,
     return stmt;
 }
 
-/* ================================================================= */
-
-/* ================================================================= */
-
-/* ================================================================= */
-
-static void
-business_core_sql_init (void)
-{
-    /* Initialize our pointers into the backend subsystem */
-    gnc_billterm_sql_initialize ();
-    gnc_customer_sql_initialize ();
-    gnc_employee_sql_initialize ();
-    gnc_entry_sql_initialize ();
-    gnc_invoice_sql_initialize ();
-    gnc_job_sql_initialize ();
-    gnc_order_sql_initialize ();
-    gnc_taxtable_sql_initialize ();
-    gnc_vendor_sql_initialize ();
-}
-
-static void
-gnc_sql_init_object_handlers (void)
-{
-    gnc_sql_init_book_handler ();
-    gnc_sql_init_commodity_handler ();
-    gnc_sql_init_account_handler ();
-    gnc_sql_init_budget_handler ();
-    gnc_sql_init_price_handler ();
-    gnc_sql_init_transaction_handler ();
-    gnc_sql_init_slots_handler ();
-    gnc_sql_init_recurrence_handler ();
-    gnc_sql_init_schedxaction_handler ();
-    gnc_sql_init_lot_handler ();
-
-    /* And the business objects */
-    business_core_sql_init ();
-}
-
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
index 7d47233..b96e234 100644
--- a/src/backend/sql/gnc-backend-sql.h
+++ b/src/backend/sql/gnc-backend-sql.h
@@ -51,101 +51,13 @@ extern "C"
 #include "gnc-sql-object-backend.hpp"
 
 using StrVec = std::vector<std::string>;
-using InstanceVec = std::vector<QofInstance*>;
 using PairVec = std::vector<std::pair<std::string, std::string>>;
 using uint_t = unsigned int;
 class GncSqlRow;
 
-/**
- * Initialize the SQL backend.
- *
- * @param sql_be SQL backend
- */
-void gnc_sql_init (GncSqlBackend* sql_be);
-
-/**
- * Load the contents of an SQL database into a book.
- *
- * @param sql_be SQL backend
- * @param book Book to be loaded
- */
-void gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book,
-                   QofBackendLoadType loadType);
-
-/**
- * Register a commodity to be committed after loading is complete.
- *
- * Necessary to save corrections made while loading.
- * @param sql_be SQL backend
- * @param comm The commodity item to be committed.
- */
-void gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* sql_be,
-                                                     gpointer comm);
-
-/**
- * Save the contents of a book to an SQL database.
- *
- * @param sql_be SQL backend
- * @param book Book to be saved
- */
-void gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book);
-
-/**
- * An object is about to be edited.
- *
- * @param sql_be SQL backend
- * @param inst Object being edited
- */
-void gnc_sql_begin_edit (GncSqlBackend* sql_be, QofInstance* inst);
-
-/**
- * Object editing has been cancelled.
- *
- * @param qsql_be SQL backend
- * @param inst Object being edited
- */
-void gnc_sql_rollback_edit (GncSqlBackend* qsql_be, QofInstance* inst);
-
-/**
- * Object editting is complete and the object should be saved.
- *
- * @param qsql_be SQL backend
- * @param inst Object being edited
- */
-void gnc_sql_commit_edit (GncSqlBackend* qsql_be, QofInstance* inst);
-
-/**
- */
-
 #define GNC_SQL_BACKEND             "gnc:sql:1"
 #define GNC_SQL_BACKEND_VERSION 1
 
-void gnc_sql_register_backend(OBEEntry&&);
-void gnc_sql_register_backend(GncSqlObjectBackendPtr);
-const OBEVec& gnc_sql_get_backend_registry();
-GncSqlObjectBackendPtr gnc_sql_get_object_backend(const std::string& table_name);
-
-/**
- * Data-passing struct for callbacks to qof_object_foreach() used in
- * GncSqlObjectBackend::write(). Once QofCollection is rewritten to use C++
- * containers we'll use std::foreach() and lambdas instead of callbacks and this
- * can go away.
- */
-struct write_objects_t
-{
-    write_objects_t() = default;
-    write_objects_t (GncSqlBackend* sql_be, bool o, GncSqlObjectBackendPtr e) :
-        be{sql_be}, is_ok{o}, obe{e} {}
-    void commit (QofInstance* inst) {
-        if (is_ok) is_ok = obe->commit (be, inst);
-    }
-    GncSqlBackend* be;
-    bool is_ok;
-    GncSqlObjectBackendPtr obe;
-};
-
-
-
 /**
  * Performs an operation on the database.
  *
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index 70073f2..4a14a62 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -99,16 +99,9 @@ static EntryVec billterm_parent_col_table
                                        bt_set_parent_guid),
 };
 
-class GncSqlBillTermBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlBillTermBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlBillTermBackend::GncSqlBillTermBackend() :
+        GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_BILLTERM,
+                            TABLE_NAME, col_table) {}
 
 typedef struct
 {
@@ -358,12 +351,5 @@ GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_query(const GncSqlBackend* sq
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_billterm_sql_initialize (void)
-{
-    static GncSqlBillTermBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_BILLTERM, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-bill-term-sql.h b/src/backend/sql/gnc-bill-term-sql.h
index af6cced..9a06646 100644
--- a/src/backend/sql/gnc-bill-term-sql.h
+++ b/src/backend/sql/gnc-bill-term-sql.h
@@ -30,11 +30,15 @@
 #ifndef GNC_BILLTERM_SQL_H
 #define GNC_BILLTERM_SQL_H
 
-#include "gnc-backend-sql.h"
-extern "C"
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlBillTermBackend : public GncSqlObjectBackend
 {
-#include "qof.h"
-}
-void gnc_billterm_sql_initialize (void);
+public:
+    GncSqlBillTermBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_BILLTERM_SQL_H */
diff --git a/src/backend/sql/gnc-book-sql.cpp b/src/backend/sql/gnc-book-sql.cpp
index 36fd79b..39ffa18 100644
--- a/src/backend/sql/gnc-book-sql.cpp
+++ b/src/backend/sql/gnc-book-sql.cpp
@@ -73,14 +73,9 @@ static const EntryVec col_table
                                       set_root_template_guid)
 };
 
-class GncSqlBookBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlBookBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-};
+GncSqlBookBackend::GncSqlBookBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_BOOK,
+                        BOOK_TABLE, col_table) {}
 
 /* ================================================================= */
 static  gpointer
@@ -201,12 +196,4 @@ GncSqlBookBackend::load_all (GncSqlBackend* sql_be)
     }
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_book_handler (void)
-{
-    static GncSqlBookBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_BOOK, BOOK_TABLE, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-book-sql.h b/src/backend/sql/gnc-book-sql.h
index b1afb3e..7703ba5 100644
--- a/src/backend/sql/gnc-book-sql.h
+++ b/src/backend/sql/gnc-book-sql.h
@@ -29,11 +29,14 @@
 #ifndef GNC_BOOK_SQL_H
 #define GNC_BOOK_SQL_H
 
-#include "gnc-backend-sql.h"
-extern "C"
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlBookBackend : public GncSqlObjectBackend
 {
-#include "qof.h"
-}
-void gnc_sql_init_book_handler (void);
+public:
+    GncSqlBookBackend();
+    void load_all(GncSqlBackend*) override;
+};
+
 
 #endif /* GNC_BOOK_SQL_H */
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index c3aff03..a3b29bb 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -81,19 +81,9 @@ static void set_period_num (gpointer pObj, gpointer val);
 static gnc_numeric get_amount (gpointer pObj);
 static void set_amount (gpointer pObj, gnc_numeric value);
 
-class GncSqlBudgetBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlBudgetBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-    bool write(GncSqlBackend*) override;
-private:
-    static void save(QofInstance*, void*);
-};
+GncSqlBudgetBackend::GncSqlBudgetBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_BUDGET,
+                        BUDGET_TABLE, col_table) {}
 
 typedef struct
 {
@@ -496,12 +486,5 @@ GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_query(const GncSqlBackend* sql_
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_sql_init_budget_handler (void)
-{
-    static GncSqlBudgetBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_BUDGET, BUDGET_TABLE, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-budget-sql.h b/src/backend/sql/gnc-budget-sql.h
index 1856993..51cebe0 100644
--- a/src/backend/sql/gnc-budget-sql.h
+++ b/src/backend/sql/gnc-budget-sql.h
@@ -29,6 +29,18 @@
 #ifndef GNC_BUDGET_SQL_H
 #define GNC_BUDGET_SQL_H
 
-void gnc_sql_init_budget_handler (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlBudgetBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlBudgetBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+    bool write(GncSqlBackend*) override;
+private:
+    static void save(QofInstance*, void*);
+};
 
 #endif /* GNC_BUDGET_SQL_H */
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index b1e47fc..f3c1060 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -88,16 +88,9 @@ static const EntryVec col_table
         "quote_tz", COMMODITY_MAX_QUOTE_TZ_LEN, 0, "quote-tz"),
 };
 
-class GncSqlCommodityBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlCommodityBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override;
-};
-
+GncSqlCommodityBackend::GncSqlCommodityBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_COMMODITY,
+                        COMMODITIES_TABLE, col_table) {}
 /* ================================================================= */
 
 static  gpointer
@@ -166,7 +159,7 @@ GncSqlCommodityBackend::load_all (GncSqlBackend* sql_be)
             guid = *qof_instance_get_guid (QOF_INSTANCE (pCommodity));
             pCommodity = gnc_commodity_table_insert (pTable, pCommodity);
             if (qof_instance_is_dirty (QOF_INSTANCE (pCommodity)))
-                gnc_sql_push_commodity_for_postload_processing (sql_be, (gpointer)pCommodity);
+                sql_be->commodity_for_postload_processing(pCommodity);
             qof_instance_set_guid (QOF_INSTANCE (pCommodity), &guid);
         }
 
@@ -292,13 +285,5 @@ GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_query(const GncSqlBackend* s
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_sql_init_commodity_handler (void)
-{
-    static GncSqlCommodityBackend be_data =
-    {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_COMMODITY, COMMODITIES_TABLE, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-commodity-sql.h b/src/backend/sql/gnc-commodity-sql.h
index 4e42572..41f4ad1 100644
--- a/src/backend/sql/gnc-commodity-sql.h
+++ b/src/backend/sql/gnc-commodity-sql.h
@@ -29,12 +29,23 @@
 #ifndef GNC_COMMODITY_SQL_H
 #define GNC_COMMODITY_SQL_H
 
-#include "gnc-backend-sql.h"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+
 extern "C"
 {
 #include "gnc-commodity.h"
 }
-void gnc_sql_init_commodity_handler (void);
+
+class GncSqlCommodityBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlCommodityBackend();
+    void load_all(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override;
+};
+
+
 gboolean gnc_sql_save_commodity (GncSqlBackend* sql_be,
                                  gnc_commodity* pCommodity);
 void gnc_sql_commit_commodity (gnc_commodity* pCommodity);
diff --git a/src/backend/sql/gnc-customer-sql.cpp b/src/backend/sql/gnc-customer-sql.cpp
index 76bc7d4..c6ad33d 100644
--- a/src/backend/sql/gnc-customer-sql.cpp
+++ b/src/backend/sql/gnc-customer-sql.cpp
@@ -94,16 +94,9 @@ static EntryVec col_table
                                          (QofSetterFunc)gncCustomerSetTaxTable),
 });
 
-class GncSqlCustomerBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlCustomerBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlCustomerBackend::GncSqlCustomerBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_CUSTOMER,
+                        TABLE_NAME, col_table) {}
 
 static GncCustomer*
 load_single_customer (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -219,12 +212,4 @@ GncSqlCustomerBackend::write (GncSqlBackend* sql_be)
     return data.is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_customer_sql_initialize (void)
-{
-    static GncSqlCustomerBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_CUSTOMER, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-customer-sql.h b/src/backend/sql/gnc-customer-sql.h
index 1e85b86..f9b2ca4 100644
--- a/src/backend/sql/gnc-customer-sql.h
+++ b/src/backend/sql/gnc-customer-sql.h
@@ -30,6 +30,15 @@
 #ifndef GNC_CUSTOMER_SQL_H
 #define GNC_CUSTOMER_SQL_H
 
-void gnc_customer_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlCustomerBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlCustomerBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_CUSTOMER_SQL_H */
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index 07da99f..f1f7598 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -79,17 +79,9 @@ static EntryVec col_table
     gnc_sql_make_table_entry<CT_ADDRESS>("addr", 0, 0, "address"),
 });
 
-class GncSqlEmployeeBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlEmployeeBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlEmployeeBackend::GncSqlEmployeeBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_EMPLOYEE,
+                        TABLE_NAME, col_table) {}
 
 static GncEmployee*
 load_single_employee (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -264,12 +256,5 @@ GncSqlEmployeeBackend::write (GncSqlBackend* sql_be)
     return data.is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_employee_sql_initialize (void)
-{
-    static GncSqlEmployeeBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_EMPLOYEE, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-employee-sql.h b/src/backend/sql/gnc-employee-sql.h
index 6f8777c..066b33e 100644
--- a/src/backend/sql/gnc-employee-sql.h
+++ b/src/backend/sql/gnc-employee-sql.h
@@ -30,6 +30,16 @@
 #ifndef GNC_EMPLOYEE_SQL_H
 #define GNC_EMPLOYEE_SQL_H
 
-void gnc_employee_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlEmployeeBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlEmployeeBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_EMPLOYEE_SQL_H */
diff --git a/src/backend/sql/gnc-entry-sql.cpp b/src/backend/sql/gnc-entry-sql.cpp
index 4f1d467..1d5dfdb 100644
--- a/src/backend/sql/gnc-entry-sql.cpp
+++ b/src/backend/sql/gnc-entry-sql.cpp
@@ -129,16 +129,9 @@ static EntryVec col_table
                                           (QofSetterFunc)gncEntrySetOrder),
 });
 
-class GncSqlEntryBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlEntryBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlEntryBackend::GncSqlEntryBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ENTRY,
+                        TABLE_NAME, col_table) {}
 
 static void
 entry_set_invoice (gpointer pObject, gpointer val)
@@ -274,12 +267,5 @@ GncSqlEntryBackend::write (GncSqlBackend* sql_be)
     return data.is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_entry_sql_initialize (void)
-{
-    static GncSqlEntryBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_ENTRY, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
+
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-entry-sql.h b/src/backend/sql/gnc-entry-sql.h
index d1feb6f..e770d33 100644
--- a/src/backend/sql/gnc-entry-sql.h
+++ b/src/backend/sql/gnc-entry-sql.h
@@ -30,6 +30,15 @@
 #ifndef GNC_ENTRY_SQL_H
 #define GNC_ENTRY_SQL_H
 
-void gnc_entry_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlEntryBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlEntryBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_ENTRY_SQL_H */
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index 3c69f4c..0f78f76 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -101,17 +101,9 @@ static EntryVec col_table
                                     (QofSetterFunc)gncInvoiceSetToChargeAmount),
 });
 
-class GncSqlInvoiceBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlInvoiceBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlInvoiceBackend::GncSqlInvoiceBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_INVOICE,
+                        TABLE_NAME, col_table) {}
 
 static GncInvoice*
 load_single_invoice (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -313,12 +305,4 @@ GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_query(const GncSqlBackend* sql
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
-/* ================================================================= */
-void
-gnc_invoice_sql_initialize (void)
-{
-    static GncSqlInvoiceBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_INVOICE, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-invoice-sql.h b/src/backend/sql/gnc-invoice-sql.h
index 1e29e55..07e51e6 100644
--- a/src/backend/sql/gnc-invoice-sql.h
+++ b/src/backend/sql/gnc-invoice-sql.h
@@ -30,6 +30,16 @@
 #ifndef GNC_INVOICE_SQL_H
 #define GNC_INVOICE_SQL_H
 
-void gnc_invoice_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlInvoiceBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlInvoiceBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_INVOICE_SQL_H */
diff --git a/src/backend/sql/gnc-job-sql.cpp b/src/backend/sql/gnc-job-sql.cpp
index b01f02d..c78c154 100644
--- a/src/backend/sql/gnc-job-sql.cpp
+++ b/src/backend/sql/gnc-job-sql.cpp
@@ -73,16 +73,9 @@ static EntryVec col_table
                                           (QofSetterFunc)gncJobSetOwner),
 });
 
-class GncSqlJobBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlJobBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
-
+GncSqlJobBackend::GncSqlJobBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_JOB,
+                        TABLE_NAME, col_table) {}
 
 static GncJob*
 load_single_job (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -170,12 +163,4 @@ GncSqlJobBackend::write (GncSqlBackend* sql_be)
     return data.is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_job_sql_initialize (void)
-{
-    static GncSqlJobBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_JOB, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-job-sql.h b/src/backend/sql/gnc-job-sql.h
index 22edf20..b29fd00 100644
--- a/src/backend/sql/gnc-job-sql.h
+++ b/src/backend/sql/gnc-job-sql.h
@@ -30,6 +30,14 @@
 #ifndef GNC_JOB_SQL_H
 #define GNC_JOB_SQL_H
 
-void gnc_job_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlJobBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlJobBackend();
+    void load_all(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_JOB_SQL_H */
diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp
index 4b12f5e..27c6765 100644
--- a/src/backend/sql/gnc-lots-sql.cpp
+++ b/src/backend/sql/gnc-lots-sql.cpp
@@ -68,16 +68,9 @@ static const EntryVec col_table
     gnc_sql_make_table_entry<CT_BOOLEAN>("is_closed", 0, COL_NNUL, "is-closed")
 });
 
-class GncSqlLotsBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlLotsBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlLotsBackend::GncSqlLotsBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_LOT,
+                        TABLE_NAME, col_table) {}
 
 /* ================================================================= */
 static  gpointer
@@ -229,13 +222,5 @@ GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_query(const GncSqlBackend* sql_be,
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_sql_init_lot_handler (void)
-{
-    static GncSqlLotsBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_LOT, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-lots-sql.h b/src/backend/sql/gnc-lots-sql.h
index c0b7c18..ca463cc 100644
--- a/src/backend/sql/gnc-lots-sql.h
+++ b/src/backend/sql/gnc-lots-sql.h
@@ -29,6 +29,15 @@
 #ifndef GNC_LOT_SQL_H
 #define GNC_LOT_SQL_H
 
-void gnc_sql_init_lot_handler (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlLotsBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlLotsBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_LOT_SQL_H */
diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp
index 6edc387..46012ea 100644
--- a/src/backend/sql/gnc-order-sql.cpp
+++ b/src/backend/sql/gnc-order-sql.cpp
@@ -75,15 +75,9 @@ static EntryVec col_table
                                           ORDER_OWNER, true),
 });
 
-class GncSqlOrderBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlOrderBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlOrderBackend::GncSqlOrderBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ORDER,
+                        TABLE_NAME, col_table) {}
 
 static GncOrder*
 load_single_order (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -199,13 +193,5 @@ GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_query(const GncSqlBackend* sql_b
 {
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
-/* ================================================================= */
-void
-gnc_order_sql_initialize (void)
-{
-    static GncSqlOrderBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_ORDER, TABLE_NAME, col_table};
 
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-order-sql.h b/src/backend/sql/gnc-order-sql.h
index 1ce2bd0..f6e469b 100644
--- a/src/backend/sql/gnc-order-sql.h
+++ b/src/backend/sql/gnc-order-sql.h
@@ -30,6 +30,14 @@
 #ifndef GNC_ORDER_SQL_H
 #define GNC_ORDER_SQL_H
 
-void gnc_order_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlOrderBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlOrderBackend();
+    void load_all(GncSqlBackend*) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_ORDER_SQL_H */
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 11c72b3..2a27a58 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -71,18 +71,9 @@ static const EntryVec col_table
     gnc_sql_make_table_entry<CT_NUMERIC>("value", 0, COL_NNUL, "value")
 });
 
-class GncSqlPriceBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlPriceBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-    bool write(GncSqlBackend*) override;
-};
-
+GncSqlPriceBackend::GncSqlPriceBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_PRICE,
+                        TABLE_NAME, col_table) {}
 
 /* ================================================================= */
 
@@ -236,13 +227,4 @@ GncSqlPriceBackend::write (GncSqlBackend* sql_be)
     return gnc_pricedb_foreach_price (priceDB, write_price, &data, TRUE);
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_price_handler (void)
-{
-    static GncSqlPriceBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_PRICE, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
-
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-price-sql.h b/src/backend/sql/gnc-price-sql.h
index f7f181f..6ecf0a8 100644
--- a/src/backend/sql/gnc-price-sql.h
+++ b/src/backend/sql/gnc-price-sql.h
@@ -29,6 +29,16 @@
 #ifndef GNC_PRICE_SQL_H
 #define GNC_PRICE_SQL_H
 
-void gnc_sql_init_price_handler (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlPriceBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlPriceBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_PRICE_SQL_H */
diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp
index 05de779..b77aa76 100644
--- a/src/backend/sql/gnc-recurrence-sql.cpp
+++ b/src/backend/sql/gnc-recurrence-sql.cpp
@@ -117,16 +117,8 @@ static const EntryVec weekend_adjust_col_table
  * Recurrences are neither loadable nor committable. Note that the default
  * write() implementation is also a no-op.
  */
-class GncSqlRecurrenceBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlRecurrenceBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override { return; }
-    void create_tables(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override { return false; }
-};
+GncSqlRecurrenceBackend::GncSqlRecurrenceBackend() :
+        GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT, TABLE_NAME, col_table) {}
 
 /* ================================================================= */
 
@@ -434,12 +426,4 @@ GncSqlRecurrenceBackend::create_tables (GncSqlBackend* sql_be)
     }
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_recurrence_handler (void)
-{
-    static GncSqlRecurrenceBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT, TABLE_NAME, col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-recurrence-sql.h b/src/backend/sql/gnc-recurrence-sql.h
index add28dd..a29a97f 100644
--- a/src/backend/sql/gnc-recurrence-sql.h
+++ b/src/backend/sql/gnc-recurrence-sql.h
@@ -34,7 +34,16 @@ extern "C"
 #include "Recurrence.h"
 #include "guid.h"
 }
-#include "gnc-backend-sql.h"
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlRecurrenceBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlRecurrenceBackend();
+    void load_all(GncSqlBackend*) override { return; }
+    void create_tables(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override { return false; }
+};
 
 gboolean gnc_sql_recurrence_save (GncSqlBackend* sql_be, const GncGUID* guid,
                                   const Recurrence* pRecurrence);
@@ -44,6 +53,4 @@ gboolean gnc_sql_recurrence_delete (GncSqlBackend* sql_be, const GncGUID* guid);
 Recurrence* gnc_sql_recurrence_load (GncSqlBackend* sql_be, const GncGUID* guid);
 GList* gnc_sql_recurrence_load_list (GncSqlBackend* sql_be, const GncGUID* guid);
 
-void gnc_sql_init_recurrence_handler (void);
-
 #endif /* GNC_RECURRENCE_SQL_H */
diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp
index 563f9b3..f0d0f4d 100644
--- a/src/backend/sql/gnc-schedxaction-sql.cpp
+++ b/src/backend/sql/gnc-schedxaction-sql.cpp
@@ -85,15 +85,9 @@ static const EntryVec col_table
         "template_act_guid", 0, COL_NNUL, "template-account"),
 });
 
-class GncSqlSchedXactionBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlSchedXactionBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-};
+GncSqlSchedXactionBackend::GncSqlSchedXactionBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_SCHEDXACTION,
+                        SCHEDXACTION_TABLE, col_table) {}
 
 /* ================================================================= */
 static  SchedXaction*
@@ -210,13 +204,4 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
     return is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_schedxaction_handler (void)
-{
-    static GncSqlSchedXactionBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_SCHEDXACTION, SCHEDXACTION_TABLE,
-            col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-schedxaction-sql.h b/src/backend/sql/gnc-schedxaction-sql.h
index 95a362f..848180d 100644
--- a/src/backend/sql/gnc-schedxaction-sql.h
+++ b/src/backend/sql/gnc-schedxaction-sql.h
@@ -32,9 +32,16 @@ extern "C"
 {
 #include "qof.h"
 }
-#include "gnc-backend-sql.h"
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlSchedXactionBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlSchedXactionBackend();
+    void load_all(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+};
 
-void gnc_sql_init_schedxaction_handler (void);
 gboolean gnc_sql_save_schedxaction (GncSqlBackend* sql_be, QofInstance* inst);
 
 #endif /* GNC_SCHEDXACTION_SQL_H */
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index d9912ee..aec445d 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -165,20 +165,9 @@ static const EntryVec gdate_col_table
     gnc_sql_make_table_entry<CT_GDATE>("gdate_val", 0, 0),
 };
 
-/**
- * Slots are neither loadable nor committable. Note that the default
- * write() implementation is also a no-op.
- */
-class GncSqlSlotsBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlSlotsBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override { return; }
-    void create_tables(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override { return false; }
-};
+GncSqlSlotsBackend::GncSqlSlotsBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT,
+                        TABLE_NAME, col_table) {}
 
 /* ================================================================= */
 
@@ -1044,13 +1033,4 @@ GncSqlSlotsBackend::create_tables (GncSqlBackend* sql_be)
     }
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_slots_handler (void)
-{
-    static GncSqlSlotsBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_ACCOUNT, TABLE_NAME, col_table};
-    gnc_sql_register_backend(std::make_tuple(std::string{TABLE_NAME},
-                                             &be_data));
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-slots-sql.h b/src/backend/sql/gnc-slots-sql.h
index ba4072d..56ef2e5 100644
--- a/src/backend/sql/gnc-slots-sql.h
+++ b/src/backend/sql/gnc-slots-sql.h
@@ -34,7 +34,20 @@ extern "C"
 #include "guid.h"
 #include "qof.h"
 }
-#include "gnc-backend-sql.h"
+#include "gnc-sql-object-backend.hpp"
+
+/**
+ * Slots are neither loadable nor committable. Note that the default
+ * write() implementation is also a no-op.
+ */
+class GncSqlSlotsBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlSlotsBackend();
+    void load_all(GncSqlBackend*) override { return; }
+    void create_tables(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override { return false; }
+};
 
 /**
  * gnc_sql_slots_save - Saves slots for an object to the db.
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
index 8d169b3..385db81 100644
--- a/src/backend/sql/gnc-sql-backend.cpp
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -24,9 +24,18 @@ extern "C"
 {
 #include <config.h>
 #include <gnc-prefs.h>
+#include <gnc-engine.h>
+#include <gnc-commodity.h>
+#include <SX-book.h>
+#include <Recurrence.h>
+#include <gncBillTerm.h>
+#include <gncTaxTable.h>
+#include <gncInvoice.h>
+#include <gnc-pricedb.h>
 }
 
 #include <algorithm>
+#include <cassert>
 
 #include "gnc-sql-connection.hpp"
 #include "gnc-sql-backend.hpp"
@@ -35,6 +44,27 @@ extern "C"
 #include "gnc-sql-result.hpp"
 #include "gnc-backend-sql.h"
 
+#include "gnc-account-sql.h"
+#include "gnc-book-sql.h"
+#include "gnc-budget-sql.h"
+#include "gnc-commodity-sql.h"
+#include "gnc-lots-sql.h"
+#include "gnc-price-sql.h"
+#include "gnc-recurrence-sql.h"
+#include "gnc-schedxaction-sql.h"
+#include "gnc-slots-sql.h"
+#include "gnc-transaction-sql.h"
+
+#include "gnc-bill-term-sql.h"
+#include "gnc-customer-sql.h"
+#include "gnc-employee-sql.h"
+#include "gnc-entry-sql.h"
+#include "gnc-invoice-sql.h"
+#include "gnc-job-sql.h"
+#include "gnc-order-sql.h"
+#include "gnc-tax-table-sql.h"
+#include "gnc-vendor-sql.h"
+
 static QofLogModule log_module = G_LOG_DOMAIN;
 #define VERSION_TABLE_NAME "versions"
 #define MAX_TABLE_NAME_LEN 50
@@ -169,6 +199,439 @@ GncSqlBackend::finish_progress() const noexcept
         (qof_be.percentage) (nullptr, -1.0);
 }
 
+void
+GncSqlBackend::create_tables() noexcept
+{
+    for(auto entry : m_backend_registry)
+    {
+        update_progress();
+        std::get<1>(entry)->create_tables(this);
+    }
+}
+
+/* Main object load order */
+static const StrVec fixed_load_order
+{ GNC_ID_BOOK, GNC_ID_COMMODITY, GNC_ID_ACCOUNT, GNC_ID_LOT };
+
+/* Order in which business objects need to be loaded */
+static const StrVec business_fixed_load_order =
+{ GNC_ID_BILLTERM, GNC_ID_TAXTABLE, GNC_ID_INVOICE };
+
+void
+GncSqlBackend::ObjectBackendRegistry::load_remaining(GncSqlBackend* sql_be)
+{
+
+    for (auto entry : m_registry)
+    {
+        std::string type;
+        GncSqlObjectBackendPtr obe = nullptr;
+        std::tie(type, obe) = entry;
+        if (!obe->is_version(GNC_SQL_BACKEND_VERSION)) continue;
+
+        /* Don't need to load anything if it has already been loaded with
+         * the fixed order.
+         */
+        if (std::find(fixed_load_order.begin(), fixed_load_order.end(),
+                      type) != fixed_load_order.end()) continue;
+        if (std::find(business_fixed_load_order.begin(),
+                      business_fixed_load_order.end(),
+                      type) != business_fixed_load_order.end()) continue;
+
+        obe->load_all (sql_be);
+    }
+}
+
+typedef struct
+{
+    QofIdType searchObj;
+    gpointer pCompiledQuery;
+} gnc_sql_query_info;
+
+/* callback structure */
+typedef struct
+{
+    gboolean is_known;
+    gboolean is_ok;
+    GncSqlBackend* sql_be;
+    QofInstance* inst;
+    QofQuery* pQuery;
+    gpointer pCompiledQuery;
+    gnc_sql_query_info* pQueryInfo;
+} sql_backend;
+
+
+void
+GncSqlBackend::load (QofBook* book, QofBackendLoadType loadType)
+{
+    Account* root;
+
+    g_return_if_fail (book != NULL);
+
+    ENTER ("sql_be=%p, book=%p", this, book);
+
+    m_loading = TRUE;
+
+    if (loadType == LOAD_TYPE_INITIAL_LOAD)
+    {
+        assert (m_book == nullptr);
+        m_book = book;
+
+        /* Load any initial stuff. Some of this needs to happen in a certain order */
+        for (auto type : fixed_load_order)
+        {
+            auto obe = m_backend_registry.get_object_backend(type);
+            if (obe)
+            {
+                update_progress();
+                obe->load_all(this);
+            }
+        }
+        for (auto type : business_fixed_load_order)
+        {
+            auto obe = m_backend_registry.get_object_backend(type);
+            if (obe)
+            {
+                update_progress();
+                obe->load_all(this);
+            }
+        }
+
+        root = gnc_book_get_root_account( book );
+        gnc_account_foreach_descendant(root, (AccountCb)xaccAccountBeginEdit,
+                                       nullptr);
+
+        m_backend_registry.load_remaining(this);
+
+        gnc_account_foreach_descendant(root, (AccountCb)xaccAccountCommitEdit,
+                                       nullptr);
+    }
+    else if (loadType == LOAD_TYPE_LOAD_ALL)
+    {
+        // Load all transactions
+        auto obe = m_backend_registry.get_object_backend (GNC_ID_TRANS);
+        obe->load_all (this);
+    }
+
+    m_loading = FALSE;
+    std::for_each(m_postload_commodities.begin(), m_postload_commodities.end(),
+                 [](gnc_commodity* comm) { gnc_sql_commit_commodity (comm); });
+    m_postload_commodities.empty();
+
+    /* Mark the sessoion as clean -- though it should never be marked
+     * dirty with this backend
+     */
+    qof_book_mark_session_saved (book);
+    finish_progress();
+
+    LEAVE ("");
+}
+
+/* ================================================================= */
+
+bool
+GncSqlBackend::write_account_tree(Account* root)
+{
+    GList* descendants;
+    GList* node;
+    bool is_ok = true;
+
+    g_return_val_if_fail (root != nullptr, false);
+
+    auto obe = m_backend_registry.get_object_backend(GNC_ID_ACCOUNT);
+    is_ok = obe->commit (this, QOF_INSTANCE (root));
+    if (is_ok)
+    {
+        descendants = gnc_account_get_descendants (root);
+        for (node = descendants; node != NULL && is_ok; node = g_list_next (node))
+        {
+            is_ok = obe->commit(this, QOF_INSTANCE (GNC_ACCOUNT (node->data)));
+            if (!is_ok) break;
+        }
+        g_list_free (descendants);
+    }
+    update_progress();
+
+    return is_ok;
+}
+
+bool
+GncSqlBackend::write_accounts()
+{
+    update_progress();
+    auto is_ok = write_account_tree (gnc_book_get_root_account (m_book));
+    if (is_ok)
+    {
+        update_progress();
+        is_ok = write_account_tree (gnc_book_get_template_root(m_book));
+    }
+
+    return is_ok;
+}
+
+static gboolean // Can't be bool because of signature for xaccAccountTreeForEach
+write_tx (Transaction* tx, gpointer data)
+{
+    auto s = static_cast<write_objects_t*>(data);
+
+    g_return_val_if_fail (tx != NULL, 0);
+    g_return_val_if_fail (data != NULL, 0);
+
+    s->commit (QOF_INSTANCE (tx));
+    auto splitbe = s->be->get_object_backend(GNC_ID_SPLIT);
+    for (auto split_node = xaccTransGetSplitList (tx);
+         split_node != nullptr && s->is_ok;
+         split_node = g_list_next (split_node))
+    {
+        s->is_ok = splitbe->commit(s->be, QOF_INSTANCE(split_node->data));
+    }
+    s->be->update_progress ();
+    return (s->is_ok ? 0 : 1);
+}
+
+bool
+GncSqlBackend::write_transactions()
+{
+    auto obe = m_backend_registry.get_object_backend(GNC_ID_TRANS);
+    write_objects_t data{this, TRUE, obe.get()};
+
+    (void)xaccAccountTreeForEachTransaction (
+        gnc_book_get_root_account (m_book), write_tx, &data);
+    update_progress();
+    return data.is_ok;
+}
+
+bool
+GncSqlBackend::write_template_transactions()
+{
+    auto obe = m_backend_registry.get_object_backend(GNC_ID_TRANS);
+    write_objects_t data{this, true, obe.get()};
+    auto ra = gnc_book_get_template_root (m_book);
+    if (gnc_account_n_descendants (ra) > 0)
+    {
+        (void)xaccAccountTreeForEachTransaction (ra, write_tx, &data);
+        update_progress();
+    }
+
+    return data.is_ok;
+}
+
+bool
+GncSqlBackend::write_schedXactions()
+{
+    GList* schedXactions;
+    SchedXaction* tmpSX;
+    bool is_ok = true;
+
+    schedXactions = gnc_book_get_schedxactions (m_book)->sx_list;
+    auto obe = m_backend_registry.get_object_backend(GNC_ID_SCHEDXACTION);
+
+    for (; schedXactions != NULL && is_ok; schedXactions = schedXactions->next)
+    {
+        tmpSX = static_cast<decltype (tmpSX)> (schedXactions->data);
+        is_ok = obe->commit (this, QOF_INSTANCE (tmpSX));
+    }
+    update_progress();
+
+    return is_ok;
+}
+
+#pragma GCC diagnostic warning "-Wformat-nonliteral"
+
+void
+GncSqlBackend::sync_all(QofBook* book)
+{
+    g_return_if_fail (book != NULL);
+
+    reset_version_info();
+    ENTER ("book=%p, sql_be->book=%p", book, m_book);
+    update_progress();
+
+    /* Create new tables */
+    m_is_pristine_db = true;
+    create_tables();
+
+    /* Save all contents */
+    m_book = book;
+    auto is_ok = m_conn->begin_transaction();
+
+    // FIXME: should write the set of commodities that are used
+    // write_commodities(sql_be, book);
+    if (is_ok)
+    {
+        auto obe = m_backend_registry.get_object_backend(GNC_ID_BOOK);
+        is_ok = obe->commit (this, QOF_INSTANCE (book));
+    }
+    if (is_ok)
+    {
+        is_ok = write_accounts();
+    }
+    if (is_ok)
+    {
+        is_ok = write_transactions();
+    }
+    if (is_ok)
+    {
+        is_ok = write_template_transactions();
+    }
+    if (is_ok)
+    {
+        is_ok = write_schedXactions();
+    }
+    if (is_ok)
+    {
+        for (auto entry : m_backend_registry)
+            std::get<1>(entry)->write (this);
+    }
+    if (is_ok)
+    {
+        is_ok = m_conn->commit_transaction();
+    }
+    if (is_ok)
+    {
+        m_is_pristine_db = false;
+
+        /* Mark the session as clean -- though it shouldn't ever get
+         * marked dirty with this backend
+         */
+        qof_book_mark_session_saved(book);
+    }
+    else
+    {
+        if (!qof_backend_check_error (&qof_be))
+            qof_backend_set_error (&qof_be, ERR_BACKEND_SERVER_ERR);
+        is_ok = m_conn->rollback_transaction ();
+    }
+    finish_progress();
+    LEAVE ("book=%p", book);
+}
+
+/* ================================================================= */
+/* Routines to deal with the creation of multiple books. */
+
+void
+GncSqlBackend::begin_edit (QofInstance* inst)
+{
+    g_return_if_fail (inst != NULL);
+
+    ENTER (" ");
+    LEAVE ("");
+}
+
+void
+GncSqlBackend::rollback_edit(QofInstance* inst)
+{
+    g_return_if_fail (inst != NULL);
+
+    ENTER (" ");
+    LEAVE ("");
+}
+
+void
+GncSqlBackend::commodity_for_postload_processing(gnc_commodity* commodity)
+{
+    m_postload_commodities.push_back(commodity);
+}
+
+GncSqlObjectBackendPtr
+GncSqlBackend::get_object_backend(const std::string& type) const noexcept
+{
+    return m_backend_registry.get_object_backend(type);
+}
+
+
+/* Commit_edit handler - find the correct backend handler for this object
+ * type and call its commit handler
+ */
+void
+GncSqlBackend::commit_edit (QofInstance* inst)
+{
+    sql_backend be_data;
+    gboolean is_dirty;
+    gboolean is_destroying;
+    gboolean is_infant;
+
+    g_return_if_fail (inst != NULL);
+
+    if (qof_book_is_readonly(m_book))
+    {
+        qof_backend_set_error (&qof_be, ERR_BACKEND_READONLY);
+        (void)m_conn->rollback_transaction ();
+        return;
+    }
+    /* During initial load where objects are being created, don't commit
+    anything, but do mark the object as clean. */
+    if (m_loading)
+    {
+        qof_instance_mark_clean (inst);
+        return;
+    }
+
+    // The engine has a PriceDB object but it isn't in the database
+    if (strcmp (inst->e_type, "PriceDB") == 0)
+    {
+        qof_instance_mark_clean (inst);
+        qof_book_mark_session_saved (m_book);
+        return;
+    }
+
+    ENTER (" ");
+
+    is_dirty = qof_instance_get_dirty_flag (inst);
+    is_destroying = qof_instance_get_destroying (inst);
+    is_infant = qof_instance_get_infant (inst);
+
+    DEBUG ("%s dirty = %d, do_free = %d, infant = %d\n",
+           (inst->e_type ? inst->e_type : "(null)"),
+           is_dirty, is_destroying, is_infant);
+
+    if (!is_dirty && !is_destroying)
+    {
+        LEAVE ("!dirty OR !destroying");
+        return;
+    }
+
+    if (!m_conn->begin_transaction ())
+    {
+        PERR ("begin_transaction failed\n");
+        LEAVE ("Rolled back - database transaction begin error");
+        return;
+    }
+
+    bool is_ok = true;
+
+    auto obe = m_backend_registry.get_object_backend(std::string{inst->e_type});
+    if (obe != nullptr)
+        is_ok = obe->commit(this, inst);
+    else
+    {
+        PERR ("Unknown object type '%s'\n", inst->e_type);
+        (void)m_conn->rollback_transaction ();
+
+        // Don't let unknown items still mark the book as being dirty
+        qof_book_mark_session_saved(m_book);
+        qof_instance_mark_clean (inst);
+        LEAVE ("Rolled back - unknown object type");
+        return;
+    }
+    if (!is_ok)
+    {
+        // Error - roll it back
+        (void)m_conn->rollback_transaction();
+
+        // This *should* leave things marked dirty
+        LEAVE ("Rolled back - database error");
+        return;
+    }
+
+    (void)m_conn->commit_transaction ();
+
+    qof_book_mark_session_saved(m_book);
+    qof_instance_mark_clean (inst);
+
+    LEAVE ("");
+}
+
+
 /**
  * Sees if the version table exists, and if it does, loads the info into
  * the version hash table.  Otherwise, it creates an empty version table.
@@ -338,3 +801,52 @@ GncSqlBackend::time64_to_string (time64 t) const noexcept
     g_free(datebuf);
     return date;
 }
+
+GncSqlBackend::ObjectBackendRegistry::ObjectBackendRegistry()
+{
+    register_backend(std::make_shared<GncSqlBookBackend>());
+    register_backend(std::make_shared<GncSqlCommodityBackend>());
+    register_backend(std::make_shared<GncSqlAccountBackend>());
+    register_backend(std::make_shared<GncSqlBudgetBackend>());
+    register_backend(std::make_shared<GncSqlPriceBackend>());
+    register_backend(std::make_shared<GncSqlTransBackend>());
+    register_backend(std::make_shared<GncSqlSplitBackend>());
+    register_backend(std::make_shared<GncSqlSlotsBackend>());
+    register_backend(std::make_shared<GncSqlRecurrenceBackend>());
+    register_backend(std::make_shared<GncSqlSchedXactionBackend>());
+    register_backend(std::make_shared<GncSqlLotsBackend>());
+    register_backend(std::make_shared<GncSqlBillTermBackend>());
+    register_backend(std::make_shared<GncSqlCustomerBackend>());
+    register_backend(std::make_shared<GncSqlEmployeeBackend>());
+    register_backend(std::make_shared<GncSqlEntryBackend>());
+    register_backend(std::make_shared<GncSqlInvoiceBackend>());
+    register_backend(std::make_shared<GncSqlJobBackend>());
+    register_backend(std::make_shared<GncSqlOrderBackend>());
+    register_backend(std::make_shared<GncSqlTaxTableBackend>());
+    register_backend(std::make_shared<GncSqlVendorBackend>());
+}
+
+void
+GncSqlBackend::ObjectBackendRegistry::register_backend(OBEEntry&& entry) noexcept
+{
+    m_registry.emplace_back(entry);
+}
+
+void
+GncSqlBackend::ObjectBackendRegistry::register_backend(GncSqlObjectBackendPtr obe) noexcept
+{
+    m_registry.emplace_back(make_tuple(std::string{obe->type()}, obe));
+}
+
+GncSqlObjectBackendPtr
+GncSqlBackend::ObjectBackendRegistry::get_object_backend(const std::string& type) const
+{
+    auto entry = std::find_if(m_registry.begin(), m_registry.end(),
+                              [type](const OBEEntry& entry){
+                                  return type == std::get<0>(entry);
+                              });
+    if (entry == m_registry.end())
+        return nullptr;
+
+    return std::get<1>(*entry);
+}
diff --git a/src/backend/sql/gnc-sql-backend.hpp b/src/backend/sql/gnc-sql-backend.hpp
index 522eac1..8ccab9a 100644
--- a/src/backend/sql/gnc-sql-backend.hpp
+++ b/src/backend/sql/gnc-sql-backend.hpp
@@ -38,7 +38,7 @@ class GncSqlColumnTableEntry;
 using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
 using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
 class GncSqlObjectBackend;
-using GncSqlObjectBackendPtr = GncSqlObjectBackend*;
+using GncSqlObjectBackendPtr = std::shared_ptr<GncSqlObjectBackend>;
 using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
 using OBEVec = std::vector<OBEEntry>;
 class GncSqlConnection;
@@ -157,17 +157,58 @@ public:
      * @return String representation of the Timespec
      */
     std::string time64_to_string (time64 t) const noexcept;
+    /**
+     * Load the contents of an SQL database into a book.
+     *
+     * @param book Book to be loaded
+     */
+    void load(QofBook*, QofBackendLoadType);
+    /**
+     * Save the contents of a book to an SQL database.
+     *
+     * @param book Book to be saved
+     */
+    void sync_all(QofBook*);
+    /**
+     * An object is about to be edited.
+     *
+     * @param inst Object being edited
+     */
+    void begin_edit(QofInstance*);
+    /**
+     * Object editting is complete and the object should be saved.
+     *
+     * @param inst Object being edited
+     */
+    void commit_edit(QofInstance*);
+    /**
+     * Object editing has been cancelled.
+     *
+     * @param inst Object being edited
+     */
+    void rollback_edit(QofInstance*);
+    /**
+     * Register a commodity to be committed after loading is complete.
+     *
+     * Necessary to save corrections made while loading.
+     * @param comm The commodity item to be committed.
+     */
+    void commodity_for_postload_processing(gnc_commodity*);
+    /**
+     * Get the GncSqlObjectBackend for the indicated type.
+     *
+     * Required because we need to pass a pointer to this to a callback via a C
+     * function.
+     * @param type: The QofInstance type constant to select the object backend.
+     */
+    GncSqlObjectBackendPtr get_object_backend(const std::string& type) const noexcept;
     QofBook* book() const noexcept { return m_book; }
     void set_loading(bool loading) noexcept { m_loading = loading; }
     bool pristine() const noexcept { return m_is_pristine_db; }
     void update_progress() const noexcept;
     void finish_progress() const noexcept;
 
-    friend void gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book, QofBackendLoadType loadType);
-    friend void gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book);
-    friend void gnc_sql_commit_edit (GncSqlBackend* sql_be, QofInstance* inst);
-
- protected:
+protected:
     QofBackend qof_be;           /**< QOF backend. Not a pointer, nor really a member */
     GncSqlConnection* m_conn;  /**< SQL connection */
     QofBook* m_book;           /**< The primary, main open book */
@@ -176,6 +217,32 @@ public:
     bool m_is_pristine_db; /**< Are we saving to a new pristine db? */
     const char* m_timespec_format; /**< Server-specific date-time string format */
     VersionVec m_versions;    /**< Version number for each table */
+private:
+    bool write_account_tree(Account*);
+    bool write_accounts();
+    bool write_transactions();
+    bool write_template_transactions();
+    bool write_schedXactions();
+    class ObjectBackendRegistry
+    {
+    public:
+        ObjectBackendRegistry();
+        ObjectBackendRegistry(const ObjectBackendRegistry&) = delete;
+        ObjectBackendRegistry(const ObjectBackendRegistry&&) = delete;
+        ObjectBackendRegistry operator=(const ObjectBackendRegistry&) = delete;
+        ObjectBackendRegistry operator=(const ObjectBackendRegistry&&) = delete;
+        ~ObjectBackendRegistry() = default;
+        void register_backend(OBEEntry&& entry) noexcept;
+        void register_backend(GncSqlObjectBackendPtr obe) noexcept;
+        GncSqlObjectBackendPtr get_object_backend(const std::string& type) const;
+        void load_remaining(GncSqlBackend*);
+        OBEVec::iterator begin() { return m_registry.begin(); }
+        OBEVec::iterator end() { return m_registry.end(); }
+    private:
+        OBEVec m_registry;
+    };
+    ObjectBackendRegistry m_backend_registry;
+    std::vector<gnc_commodity*> m_postload_commodities;
 };
 
 #endif //__GNC_SQL_BACKEND_HPP__
diff --git a/src/backend/sql/gnc-sql-object-backend.cpp b/src/backend/sql/gnc-sql-object-backend.cpp
index a945e25..bf643db 100644
--- a/src/backend/sql/gnc-sql-object-backend.cpp
+++ b/src/backend/sql/gnc-sql-object-backend.cpp
@@ -29,6 +29,7 @@ extern "C"
 #include "gnc-sql-backend.hpp"
 #include "gnc-sql-column-table-entry.hpp"
 #include "gnc-slots-sql.h"
+#include "gnc-backend-sql.h" //for gnc_sql_do_db_operation
 
 static QofLogModule log_module = G_LOG_DOMAIN;
 
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
index 7c5604f..6e53093 100644
--- a/src/backend/sql/gnc-sql-object-backend.hpp
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -36,6 +36,7 @@ class GncSqlBackend;
 class GncSqlColumnTableEntry;
 using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
 using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
+using InstanceVec = std::vector<QofInstance*>;
 
 typedef enum
 {
@@ -108,9 +109,29 @@ protected:
     const EntryVec& m_col_table;   /// The ORM table definition.
 };
 
-using GncSqlObjectBackendPtr = GncSqlObjectBackend*;
+using GncSqlObjectBackendPtr = std::shared_ptr<GncSqlObjectBackend>;
 
 using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
 using OBEVec = std::vector<OBEEntry>;
 
+/**
+ * Data-passing struct for callbacks to qof_object_foreach() used in
+ * GncSqlObjectBackend::write(). Once QofCollection is rewritten to use C++
+ * containers we'll use std::foreach() and lambdas instead of callbacks and this
+ * can go away.
+ */
+struct write_objects_t
+{
+    write_objects_t() = default;
+    write_objects_t (GncSqlBackend* sql_be, bool o, GncSqlObjectBackend* e) :
+        be{sql_be}, is_ok{o}, obe{e} {}
+    void commit (QofInstance* inst) {
+        if (is_ok) is_ok = obe->commit (be, inst);
+    }
+    GncSqlBackend* be;
+    bool is_ok;
+    GncSqlObjectBackend* obe;
+};
+
+
 #endif //__GNC_SQL_OBJECT_BACKEND_HPP__
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index 645037a..8679b0e 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -117,17 +117,9 @@ static EntryVec guid_col_table
                                       get_obj_guid, set_obj_guid),
 });
 
-class GncSqlTaxTableBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlTaxTableBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlTaxTableBackend::GncSqlTaxTableBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_TAXTABLE,
+                        TT_TABLE_NAME, tt_col_table) {}
 
 typedef struct
 {
@@ -517,12 +509,4 @@ GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_query(const GncSqlBackend* sq
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
-/* ================================================================= */
-void
-gnc_taxtable_sql_initialize (void)
-{
-    static GncSqlTaxTableBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_TAXTABLE, TT_TABLE_NAME, tt_col_table};
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-tax-table-sql.h b/src/backend/sql/gnc-tax-table-sql.h
index c6ea13a..abbd980 100644
--- a/src/backend/sql/gnc-tax-table-sql.h
+++ b/src/backend/sql/gnc-tax-table-sql.h
@@ -30,6 +30,16 @@
 #ifndef GNC_TAXTABLE_SQL_H
 #define GNC_TAXTABLE_SQL_H
 
-void gnc_taxtable_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlTaxTableBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlTaxTableBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+    bool write(GncSqlBackend*) override;
+};
 
 #endif /* GNC_TAXTABLE_SQL_H */
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 4fdc540..c29f4b8 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -74,7 +74,7 @@ struct split_info_t : public write_objects_t
 {
     split_info_t () = default;
     split_info_t (GncSqlBackend* sql_be, bool o,
-                  GncSqlObjectBackendPtr e, const GncGUID* g):
+                  GncSqlObjectBackend* e, const GncGUID* g):
         write_objects_t(sql_be, o, e), guid{g} {}
     const GncGUID* guid;
 };
@@ -139,29 +139,14 @@ static const EntryVec tx_guid_col_table
     gnc_sql_make_table_entry<CT_GUID>("tx_guid", 0, 0, "guid"),
 };
 
-class GncSqlTransBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlTransBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-};
+GncSqlTransBackend::GncSqlTransBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_TRANS,
+                        TRANSACTION_TABLE, tx_col_table) {}
+
+GncSqlSplitBackend::GncSqlSplitBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_SPLIT,
+                        SPLIT_TABLE, split_col_table) {}
 
-class GncSqlSplitBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlSplitBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override { return; } // loaded by transaction.
-    void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
-};
-static GncSqlSplitBackend be_data_split {
-    GNC_SQL_BACKEND_VERSION, GNC_ID_SPLIT, SPLIT_TABLE, split_col_table};
 /* These functions exist but have not been tested.
    #if LOAD_TRANSACTIONS_AS_NEEDED
    compile_split_query,
@@ -1413,14 +1398,4 @@ GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_query(const GncSqlBackend* sql_be,
     add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
-/* ================================================================= */
-void
-gnc_sql_init_transaction_handler (void)
-{
-    static GncSqlTransBackend be_data_tx {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_TRANS, TRANSACTION_TABLE, tx_col_table};
-    gnc_sql_register_backend(&be_data_tx);
-    gnc_sql_register_backend(&be_data_split);
-}
-
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-transaction-sql.h b/src/backend/sql/gnc-transaction-sql.h
index 1658da7..b0f270f 100644
--- a/src/backend/sql/gnc-transaction-sql.h
+++ b/src/backend/sql/gnc-transaction-sql.h
@@ -36,7 +36,23 @@ extern "C"
 #include "qof.h"
 #include "Account.h"
 }
-void gnc_sql_init_transaction_handler (void);
+class GncSqlTransBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlTransBackend();
+    void load_all(GncSqlBackend*) override;
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+};
+
+class GncSqlSplitBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlSplitBackend();
+    void load_all(GncSqlBackend*) override { return; } // loaded by transaction.
+    void create_tables(GncSqlBackend*) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
+};
 
 /**
  * Loads all transactions which have splits for a specific account.
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index 3660b3c..3910243 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -83,16 +83,9 @@ static EntryVec col_table
     gnc_sql_make_table_entry<CT_TAXTABLEREF>("tax_table", 0, 0, "tax-table"),
 });
 
-class GncSqlVendorBackend : public GncSqlObjectBackend
-{
-public:
-    GncSqlVendorBackend(int version, const std::string& type,
-                      const std::string& table, const EntryVec& vec) :
-        GncSqlObjectBackend(version, type, table, vec) {}
-    void load_all(GncSqlBackend*) override;
-    bool commit(GncSqlBackend*, QofInstance*) override;
-    bool write(GncSqlBackend*) override;
-};
+GncSqlVendorBackend::GncSqlVendorBackend() :
+    GncSqlObjectBackend(GNC_SQL_BACKEND_VERSION, GNC_ID_VENDOR,
+                        TABLE_NAME, col_table) {}
 
 static GncVendor*
 load_single_vendor (GncSqlBackend* sql_be, GncSqlRow& row)
@@ -237,13 +230,4 @@ GncSqlVendorBackend::write (GncSqlBackend* sql_be)
     return data.is_ok;
 }
 
-/* ================================================================= */
-void
-gnc_vendor_sql_initialize (void)
-{
-    static GncSqlVendorBackend be_data {
-        GNC_SQL_BACKEND_VERSION, GNC_ID_VENDOR, TABLE_NAME, col_table};
-
-    gnc_sql_register_backend(&be_data);
-}
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-vendor-sql.h b/src/backend/sql/gnc-vendor-sql.h
index a39b9c2..d52209a 100644
--- a/src/backend/sql/gnc-vendor-sql.h
+++ b/src/backend/sql/gnc-vendor-sql.h
@@ -30,6 +30,16 @@
 #ifndef GNC_VENDOR_SQL_H
 #define GNC_VENDOR_SQL_H
 
-void gnc_vendor_sql_initialize (void);
+#include "gnc-sql-object-backend.hpp"
+
+class GncSqlVendorBackend : public GncSqlObjectBackend
+{
+public:
+    GncSqlVendorBackend();
+    void load_all(GncSqlBackend*) override;
+    bool commit(GncSqlBackend*, QofInstance*) override;
+    bool write(GncSqlBackend*) override;
+};
+
 
 #endif /* GNC_VENDOR_SQL_H */
diff --git a/src/backend/sql/test/test-column-types.cpp b/src/backend/sql/test/test-column-types.cpp
index eb5ed96..e03dd82 100644
--- a/src/backend/sql/test/test-column-types.cpp
+++ b/src/backend/sql/test/test-column-types.cpp
@@ -39,7 +39,6 @@ int main (int argc, char** argv)
 {
     qof_init ();
     cashobjects_register ();
-    gnc_sql_init (NULL);
     /*    do_test(
             qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
             " loading gnc-backend-gda GModule failed");
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index ce3558c..059959a 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -266,22 +266,16 @@ test_gnc_sql_commit_edit (void)
     guint dirty_called = 0;
     GncMockSqlConnection conn;
     const char* msg1 =
-        "[gnc_sql_commit_edit()] gnc_sql_commit_edit(): Unknown object type 'null'\n";
-    const char* msg2 =
-        "[gnc_sql_commit_edit()] gnc_sql_commit_edit(): Unknown object type 'Book'\n";
+        "[GncSqlBackend::commit_edit()] Unknown object type 'null'\n";
     GLogLevelFlags loglevel = static_cast<decltype (loglevel)>
                               (G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL);
     const char* logdomain = "gnc.backend.sql";
     TestErrorStruct check1 = { loglevel, const_cast<char*> (logdomain),
                                const_cast<char*> (msg1), 0
                              };
-    TestErrorStruct check2 = { loglevel, const_cast<char*> (logdomain),
-                               const_cast<char*> (msg2), 0
-                             };
     guint hdlr1;
 
     test_add_error (&check1);
-    test_add_error (&check2);
     hdlr1 = g_log_set_handler (logdomain, loglevel,
                                (GLogFunc)test_list_handler, NULL);
     g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_list_handler, NULL);
@@ -298,36 +292,33 @@ test_gnc_sql_commit_edit (void)
     g_assert (qof_instance_get_dirty_flag (inst));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&sql_be, inst);
+    sql_be.commit_edit (inst);
     g_assert (!qof_instance_get_dirty_flag (inst));
     g_assert (!qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 0);
     g_assert_cmpint (check1.hits, == , 2);
-    g_assert_cmpint (check2.hits, == , 0);
 
     qof_book_mark_session_dirty (book);
 
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&sql_be, QOF_INSTANCE (book));
+    sql_be.commit_edit (QOF_INSTANCE (book));
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
     g_assert_cmpint (check1.hits, == , 2);
-    g_assert_cmpint (check2.hits, == , 0);
 
     qof_instance_set_dirty_flag (QOF_INSTANCE (book), TRUE);
 
     g_assert (qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&sql_be, QOF_INSTANCE (book));
+    sql_be.commit_edit(QOF_INSTANCE (book));
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (!qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 0);
     g_assert_cmpint (check1.hits, == , 2);
-    g_assert_cmpint (check2.hits, == , 2);
 
     g_log_remove_handler (logdomain, hdlr1);
     g_object_unref (inst);

commit b2a644c29dcdd5ba7f51c3f9445cfdf5fdb7ede0
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Nov 1 11:58:21 2016 -0700

    Separate SQL backend classes into their own header and source files.
    
    And adjust includes accordingly.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index 3a4a01b..f832a11 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -79,6 +79,8 @@ extern "C"
 #include "gnc-backend-dbi.h"
 #include "gnc-backend-dbi.hpp"
 
+#include <gnc-sql-object-backend.hpp>
+#include <gnc-backend-sql.h>
 #include "gnc-dbisqlresult.hpp"
 #include "gnc-dbisqlconnection.hpp"
 
diff --git a/src/backend/dbi/gnc-backend-dbi.hpp b/src/backend/dbi/gnc-backend-dbi.hpp
index 66c8732..07ab675 100644
--- a/src/backend/dbi/gnc-backend-dbi.hpp
+++ b/src/backend/dbi/gnc-backend-dbi.hpp
@@ -34,7 +34,10 @@ extern "C"
 #define GETPID() getpid()
 #endif
 }
-#include "gnc-backend-sql.h"
+#include <gnc-sql-backend.hpp>
+#include <gnc-sql-connection.hpp>
+
+class GncSqlRow;
 
 #define GNC_HOST_NAME_MAX 255
 
diff --git a/src/backend/dbi/gnc-dbiprovider.hpp b/src/backend/dbi/gnc-dbiprovider.hpp
index 2f168d8..7f416a2 100644
--- a/src/backend/dbi/gnc-dbiprovider.hpp
+++ b/src/backend/dbi/gnc-dbiprovider.hpp
@@ -36,8 +36,8 @@ extern "C"
  */
 class GncSqlConnection;
 struct GncSqlColumnInfo;
-using ColVec=std::vector<GncSqlColumnInfo>;
-
+using ColVec = std::vector<GncSqlColumnInfo>;
+using StrVec = std::vector<std::string>;
 class GncDbiProvider
 {
 public:
diff --git a/src/backend/dbi/gnc-dbiproviderimpl.hpp b/src/backend/dbi/gnc-dbiproviderimpl.hpp
index 4c3f449..10fdec1 100644
--- a/src/backend/dbi/gnc-dbiproviderimpl.hpp
+++ b/src/backend/dbi/gnc-dbiproviderimpl.hpp
@@ -27,8 +27,15 @@ extern "C"
 {
 #include <config.h>
 }
+#include <string>
+#include <vector>
+
 #include "gnc-backend-dbi.hpp"
 #include "gnc-dbiprovider.hpp"
+#include "gnc-backend-dbi.h"
+#include <gnc-sql-column-table-entry.hpp>
+
+using StrVec = std::vector<std::string>;
 
 template <DbType T>
 class GncDbiProviderImpl : public GncDbiProvider
diff --git a/src/backend/dbi/gnc-dbisqlconnection.hpp b/src/backend/dbi/gnc-dbisqlconnection.hpp
index fd33294..466e5d9 100644
--- a/src/backend/dbi/gnc-dbisqlconnection.hpp
+++ b/src/backend/dbi/gnc-dbisqlconnection.hpp
@@ -23,10 +23,16 @@
 #ifndef _GNC_DBISQLCONNECTION_HPP_
 #define _GNC_DBISQLCONNECTION_HPP_
 
+#include <string>
+#include <vector>
+
+#include <gnc-sql-connection.hpp>
 #include "gnc-backend-dbi.hpp"
 #include "gnc-dbisqlresult.hpp"
 #include "gnc-dbiprovider.hpp"
+#include "gnc-backend-dbi.h"
 
+using StrVec = std::vector<std::string>;
 class GncDbiProvider;
 
 /**
diff --git a/src/backend/dbi/gnc-dbisqlresult.hpp b/src/backend/dbi/gnc-dbisqlresult.hpp
index acb658d..faf5143 100644
--- a/src/backend/dbi/gnc-dbisqlresult.hpp
+++ b/src/backend/dbi/gnc-dbisqlresult.hpp
@@ -26,6 +26,7 @@
 #define __GNC_DBISQLBACKEND_HPP__
 
 #include "gnc-backend-dbi.h"
+#include <gnc-sql-result.hpp>
 
 class GncDbiSqlConnection;
 
diff --git a/src/backend/dbi/test/test-backend-dbi-basic.cpp b/src/backend/dbi/test/test-backend-dbi-basic.cpp
index 593d7df..a7b90b2 100644
--- a/src/backend/dbi/test/test-backend-dbi-basic.cpp
+++ b/src/backend/dbi/test/test-backend-dbi-basic.cpp
@@ -57,6 +57,10 @@ extern "C"
 #include <unittest-support.h>
 #include <test-stuff.h>
 }
+
+#include <string>
+#include <vector>
+
 #include "test-dbi-stuff.h"
 #include "test-dbi-business-stuff.h"
 
@@ -70,6 +74,8 @@ static dbi_inst dbi_instance = NULL;
 static const gchar* suitename = "/backend/dbi";
 void test_suite_gnc_backend_dbi (void);
 
+using StrVec = std::vector<std::string>;
+
 typedef struct
 {
     QofSession* session;
diff --git a/src/backend/sql/CMakeLists.txt b/src/backend/sql/CMakeLists.txt
index 6c4ece5..925befe 100644
--- a/src/backend/sql/CMakeLists.txt
+++ b/src/backend/sql/CMakeLists.txt
@@ -25,6 +25,10 @@ SET (backend_sql_SOURCES
   gnc-tax-table-sql.cpp
   gnc-transaction-sql.cpp
   gnc-vendor-sql.cpp
+  gnc-sql-backend.cpp
+  gnc-sql-result.cpp
+  gnc-sql-column-table-entry.cpp
+  gnc-sql-object-backend.cpp
   escape.cpp
 )
 SET (backend_sql_noinst_HEADERS
@@ -48,6 +52,11 @@ SET (backend_sql_noinst_HEADERS
   gnc-tax-table-sql.h
   gnc-transaction-sql.h
   gnc-vendor-sql.h
+  gnc-sql-backend.hpp
+  gnc-sql-connection.hpp
+  gnc-sql-result.hpp
+  gnc-sql-column-table-entry.hpp
+  gnc-sql-object-backend.hpp
   escape.h
 )
 
diff --git a/src/backend/sql/Makefile.am b/src/backend/sql/Makefile.am
index 6f0dabe..7e8d845 100644
--- a/src/backend/sql/Makefile.am
+++ b/src/backend/sql/Makefile.am
@@ -43,6 +43,10 @@ libgnc_backend_sql_la_SOURCES = \
   gnc-tax-table-sql.cpp \
   gnc-transaction-sql.cpp \
   gnc-vendor-sql.cpp \
+  gnc-sql-backend.cpp \
+  gnc-sql-result.cpp \
+  gnc-sql-column-table-entry.cpp \
+  gnc-sql-object-backend.cpp \
   escape.cpp
 
 noinst_HEADERS = \
@@ -66,6 +70,11 @@ noinst_HEADERS = \
   gnc-tax-table-sql.h \
   gnc-transaction-sql.h \
   gnc-vendor-sql.h \
+  gnc-sql-backend.hpp \
+  gnc-sql-connection.hpp \
+  gnc-sql-result.hpp \
+  gnc-sql-column-table-entry.hpp \
+  gnc-sql-object-backend.hpp \
   escape.h
 
 libgnc_backend_sql_la_LIBADD = \
diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 8c58f07..7908a45 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -41,8 +41,11 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
-#include "gnc-backend-sql.h"
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-account-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-address-sql.cpp b/src/backend/sql/gnc-address-sql.cpp
index 63bf9ce..5effac3 100644
--- a/src/backend/sql/gnc-address-sql.cpp
+++ b/src/backend/sql/gnc-address-sql.cpp
@@ -32,14 +32,16 @@ extern "C"
 #include "config.h"
 
 #include <glib.h>
-#include <stdlib.h>
-#include <string.h>
 
 #include "gnc-engine.h"
 
 #include "gncAddress.h"
 }
-#include "gnc-backend-sql.h"
+#include <cstdlib>
+#include <cstring>
+#include <sstream>
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 
 G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
 
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index 892dc0f..c426015 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -37,6 +37,7 @@ extern "C"
 #include <glib/gstdio.h>
 
 #include <qof.h>
+#include <qofbackend-p.h>
 #include <qofquery-p.h>
 #include <qofquerycore-p.h>
 #include <Account.h>
@@ -47,7 +48,6 @@ extern "C"
 #include <gncBillTerm.h>
 #include <gncTaxTable.h>
 #include <gncInvoice.h>
-#include "gnc-prefs.h"
 #include "gnc-pricedb.h"
 
 
@@ -59,6 +59,10 @@ extern "C"
 #include <tuple>
 #include <iomanip>
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 
 #include "gnc-account-sql.h"
@@ -82,11 +86,6 @@ extern "C"
 #include "gnc-tax-table-sql.h"
 #include "gnc-vendor-sql.h"
 
-#define VERSION_TABLE_NAME "versions"
-#define MAX_TABLE_NAME_LEN 50
-#define TABLE_COL_NAME "table_name"
-#define VERSION_COL_NAME "table_version"
-
 static void gnc_sql_init_object_handlers (void);
 static GncSqlStatementPtr build_insert_statement (GncSqlBackend* sql_be,
                                                   const gchar* table_name,
@@ -419,303 +418,6 @@ write_schedXactions (GncSqlBackend* sql_be)
     return is_ok;
 }
 
-static EntryVec version_table
-{
-    gnc_sql_make_table_entry<CT_STRING>(
-        TABLE_COL_NAME, MAX_TABLE_NAME_LEN, COL_PKEY | COL_NNUL),
-    gnc_sql_make_table_entry<CT_INT>(VERSION_COL_NAME, 0, COL_NNUL)
-};
-
-GncSqlBackend::GncSqlBackend(GncSqlConnection *conn, QofBook* book,
-                             const char* format) :
-    qof_be {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-            nullptr, nullptr, nullptr, nullptr, ERR_BACKEND_NO_ERR, nullptr, 0,
-            nullptr}, m_conn{conn}, m_book{book}, m_loading{false},
-        m_in_query{false}, m_is_pristine_db{false}, m_timespec_format{format}
-{
-    if (conn != nullptr)
-        connect (conn);
-}
-
-void
-GncSqlBackend::connect(GncSqlConnection *conn) noexcept
-{
-    if (m_conn != nullptr && m_conn != conn)
-        delete m_conn;
-    finalize_version_info();
-    m_conn = conn;
-}
-
-GncSqlStatementPtr
-GncSqlBackend::create_statement_from_sql(const std::string& str) const noexcept
-{
-    auto stmt = m_conn->create_statement_from_sql(str);
-    if (stmt == nullptr)
-    {
-        PERR ("SQL error: %s\n", str.c_str());
-        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
-    }
-    return stmt;
-}
-
-GncSqlResultPtr
-GncSqlBackend::execute_select_statement(const GncSqlStatementPtr& stmt) const noexcept
-{
-    auto result = m_conn->execute_select_statement(stmt);
-    if (result == nullptr)
-    {
-        PERR ("SQL error: %s\n", stmt->to_sql());
-        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
-    }
-    return result;
-}
-
-int
-GncSqlBackend::execute_nonselect_statement(const GncSqlStatementPtr& stmt) const noexcept
-{
-    auto result = m_conn->execute_nonselect_statement(stmt);
-    if (result == -1)
-    {
-        PERR ("SQL error: %s\n", stmt->to_sql());
-        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
-    }
-    return result;
-}
-
-std::string
-GncSqlBackend::quote_string(const std::string& str) const noexcept
-{
-    return m_conn->quote_string(str);
-}
-
-bool
-GncSqlBackend::create_table(const std::string& table_name,
-                            const EntryVec& col_table) const noexcept
-{
-    ColVec info_vec;
-    gboolean ok = FALSE;
-
-    for (auto const& table_row : col_table)
-    {
-        table_row->add_to_table (this, info_vec);
-    }
-    return m_conn->create_table (table_name, info_vec);
-
-}
-
-bool
-GncSqlBackend::create_table(const std::string& table_name, int table_version,
-                            const EntryVec& col_table) noexcept
-{
-    if (create_table (table_name, col_table))
-        return set_table_version (table_name, table_version);
-    return false;
-}
-
-bool
-GncSqlBackend::create_index(const std::string& index_name,
-                            const std::string& table_name,
-                            const EntryVec& col_table) const noexcept
-{
-    return m_conn->create_index(index_name, table_name, col_table);
-}
-
-bool
-GncSqlBackend::add_columns_to_table(const std::string& table_name,
-                                    const EntryVec& col_table) const noexcept
-{
-    ColVec info_vec;
-
-    for (auto const& table_row : col_table)
-    {
-        table_row->add_to_table (this, info_vec);
-    }
-    return m_conn->add_columns_to_table(table_name, info_vec);
-}
-
-void
-GncSqlBackend::update_progress() const noexcept
-{
-    if (qof_be.percentage != nullptr)
-        (qof_be.percentage) (nullptr, 101.0);
-}
-
-void
-GncSqlBackend::finish_progress() const noexcept
-{
-    if (qof_be.percentage != nullptr)
-        (qof_be.percentage) (nullptr, -1.0);
-}
-
-/**
- * Sees if the version table exists, and if it does, loads the info into
- * the version hash table.  Otherwise, it creates an empty version table.
- *
- * @param be Backend struct
- */
-void
-GncSqlBackend::init_version_info() noexcept
-{
-
-    if (m_conn->does_table_exist (VERSION_TABLE_NAME))
-    {
-        std::string sql {"SELECT * FROM "};
-        sql += VERSION_TABLE_NAME;
-        auto stmt = m_conn->create_statement_from_sql(sql);
-        auto result = m_conn->execute_select_statement (stmt);
-        for (const auto& row : *result)
-        {
-            auto name = row.get_string_at_col (TABLE_COL_NAME);
-            unsigned int version = row.get_int_at_col (VERSION_COL_NAME);
-            m_versions.push_back(std::make_pair(name, version));
-        }
-    }
-    else
-    {
-        create_table (VERSION_TABLE_NAME, version_table);
-        set_table_version("Gnucash", gnc_prefs_get_long_version ());
-        set_table_version("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
-    }
-}
-
-/**
- * Resets the version table information by removing all version table info.
- * It also recreates the version table in the db.
- *
- * @param be Backend struct
- * @return TRUE if successful, FALSE if error
- */
-bool
-GncSqlBackend::reset_version_info() noexcept
-{
-    bool ok = true;
-    if (!m_conn->does_table_exist (VERSION_TABLE_NAME))
-        ok = create_table (VERSION_TABLE_NAME, version_table);
-    m_versions.clear();
-    set_table_version ("Gnucash", gnc_prefs_get_long_version ());
-    set_table_version ("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
-    return ok;
-}
-
-/**
- * Finalizes the version table info by destroying the hash table.
- *
- * @param be Backend struct
- */
-void
-GncSqlBackend::finalize_version_info() noexcept
-{
-    m_versions.clear();
-}
-
-unsigned int
-GncSqlBackend::get_table_version(const std::string& table_name) const noexcept
-{
-    /* If the db is pristine because it's being saved, the table does not exist. */
-    if (m_is_pristine_db)
-        return 0;
-
-    auto version = std::find_if(m_versions.begin(), m_versions.end(),
-                                [table_name](const VersionPair& version) {
-                                    return version.first == table_name; });
-    if (version != m_versions.end())
-        return version->second;
-    return 0;
-}
-
-/**
- * Registers the version for a table.  Registering involves updating the
- * db version table and also the hash table.
- *
- * @param be Backend struct
- * @param table_name Table name
- * @param version Version number
- * @return TRUE if successful, FALSE if unsuccessful
- */
-bool
-GncSqlBackend::set_table_version (const std::string& table_name,
-                                  uint_t version) noexcept
-{
-    g_return_val_if_fail (version > 0, false);
-
-    unsigned int cur_version{0};
-    std::stringstream sql;
-    auto ver_entry = std::find_if(m_versions.begin(), m_versions.end(),
-                                [table_name](const VersionPair& ver) {
-                                    return ver.first == table_name; });
-    if (ver_entry != m_versions.end())
-        cur_version = ver_entry->second;
-    if (cur_version != version)
-    {
-        if (cur_version == 0)
-        {
-            sql << "INSERT INTO " << VERSION_TABLE_NAME << " VALUES('" <<
-                table_name << "'," << version <<")";
-            m_versions.push_back(std::make_pair(table_name, version));
-        }
-        else
-        {
-            sql << "UPDATE " <<  VERSION_TABLE_NAME << " SET " <<
-                VERSION_COL_NAME << "=" << version << " WHERE " <<
-                TABLE_COL_NAME << "='" << table_name << "'";
-            ver_entry->second = version;
-        }
-        auto stmt = create_statement_from_sql(sql.str());
-        auto status = execute_nonselect_statement (stmt);
-        if (status == -1)
-        {
-            PERR ("SQL error: %s\n", sql.str().c_str());
-            qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
-            return false;
-        }
-    }
-
-    return true;
-}
-
-void
-GncSqlBackend::upgrade_table (const std::string& table_name,
-                              const EntryVec& col_table) noexcept
-{
-    DEBUG ("Upgrading %s table\n", table_name.c_str());
-
-    auto temp_table_name = table_name + "_new";
-    create_table (temp_table_name, col_table);
-    std::stringstream sql;
-    sql << "INSERT INTO " << temp_table_name << " SELECT * FROM " << table_name;
-    auto stmt = create_statement_from_sql(sql.str());
-    execute_nonselect_statement(stmt);
-
-    sql.str("");
-    sql << "DROP TABLE " << table_name;
-    stmt = create_statement_from_sql(sql.str());
-    execute_nonselect_statement(stmt);
-
-    sql.str("");
-    sql << "ALTER TABLE " << temp_table_name << " RENAME TO " << table_name;
-    stmt = create_statement_from_sql(sql.str());
-    execute_nonselect_statement(stmt);
-}
-
-/* This is required because we're passing be->timespace_format to
- * g_strdup_printf.
- */
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
-std::string
-GncSqlBackend::time64_to_string (time64 t) const noexcept
-{
-    auto tm = gnc_gmtime (&t);
-
-    auto year = tm->tm_year + 1900;
-
-    auto datebuf = g_strdup_printf (m_timespec_format,
-                                    year, tm->tm_mon + 1, tm->tm_mday,
-                                    tm->tm_hour, tm->tm_min, tm->tm_sec);
-    gnc_tm_free (tm);
-    std::string date{datebuf};
-    g_free(datebuf);
-    return date;
-}
 #pragma GCC diagnostic warning "-Wformat-nonliteral"
 
 void
@@ -1305,669 +1007,6 @@ gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery)
     LEAVE ("");
 }
 #endif //if 0: query creation isn't used yet, code never tested.
-/* ================================================================= */
-
-static void
-business_core_sql_init (void)
-{
-    /* Initialize our pointers into the backend subsystem */
-    gnc_billterm_sql_initialize ();
-    gnc_customer_sql_initialize ();
-    gnc_employee_sql_initialize ();
-    gnc_entry_sql_initialize ();
-    gnc_invoice_sql_initialize ();
-    gnc_job_sql_initialize ();
-    gnc_order_sql_initialize ();
-    gnc_taxtable_sql_initialize ();
-    gnc_vendor_sql_initialize ();
-}
-
-static void
-gnc_sql_init_object_handlers (void)
-{
-    gnc_sql_init_book_handler ();
-    gnc_sql_init_commodity_handler ();
-    gnc_sql_init_account_handler ();
-    gnc_sql_init_budget_handler ();
-    gnc_sql_init_price_handler ();
-    gnc_sql_init_transaction_handler ();
-    gnc_sql_init_slots_handler ();
-    gnc_sql_init_recurrence_handler ();
-    gnc_sql_init_schedxaction_handler ();
-    gnc_sql_init_lot_handler ();
-
-    /* And the business objects */
-    business_core_sql_init ();
-}
-
-/* ================================================================= */
-static gpointer
-get_autoinc_id (void* object, const QofParam* param)
-{
-    // Just need a 0 to force a new autoinc value
-    return (gpointer)0;
-}
-
-static void
-set_autoinc_id (void* object, void* item)
-{
-    // Nowhere to put the ID
-}
-
-QofAccessFunc
-GncSqlColumnTableEntry::get_getter (QofIdTypeConst obj_name) const noexcept
-{
-    QofAccessFunc getter;
-
-    g_return_val_if_fail (obj_name != NULL, NULL);
-
-    if (m_flags & COL_AUTOINC)
-    {
-        getter = get_autoinc_id;
-    }
-    else if (m_qof_param_name != NULL)
-    {
-        getter = qof_class_get_parameter_getter (obj_name, m_qof_param_name);
-    }
-    else
-    {
-        getter = m_getter;
-    }
-
-    return getter;
-}
-
-QofSetterFunc
-GncSqlColumnTableEntry::get_setter(QofIdTypeConst obj_name) const noexcept
-{
-    QofSetterFunc setter = nullptr;
-    if (m_flags & COL_AUTOINC)
-    {
-        setter = set_autoinc_id;
-    }
-    else if (m_qof_param_name != nullptr)
-    {
-        g_assert (obj_name != NULL);
-        setter = qof_class_get_parameter_setter (obj_name, m_qof_param_name);
-    }
-    else
-    {
-        setter = m_setter;
-    }
-    return setter;
-}
-
-void
-GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* sql_be,
-                                                     QofIdTypeConst obj_name,
-                                                     const gpointer pObject,
-                                                     PairVec& vec) const noexcept
-{
-    auto inst = get_row_value_from_object<QofInstance*>(obj_name, pObject);
-    if (inst == nullptr) return;
-    auto guid = qof_instance_get_guid (inst);
-    if (guid != nullptr)
-        vec.emplace_back (std::make_pair (std::string{m_col_name},
-                                          std::string{guid_to_string(guid)}));
-}
-
-void
-GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* sql_be,
-                                                     ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-
-/* ----------------------------------------------------------------- */
-template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* sql_be,
-                                             GncSqlRow& row,
-                                             QofIdTypeConst obj_name,
-                                             gpointer pObject) const noexcept
-{
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
-
-    try
-    {
-        auto s = row.get_string_at_col (m_col_name);
-        set_parameter(pObject, s.c_str(), get_setter(obj_name), m_gobj_param_name);
-    }
-    catch (std::invalid_argument) {}
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* sql_be,
-                                                  ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_STRING, m_size, TRUE};
-    vec.emplace_back(std::move(info));
-}
-
-/* char is unusual in that we get a pointer but don't deref it to pass
- * it to operator<<().
- */
-template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    auto s = get_row_value_from_object<char*>(obj_name, pObject);
-
-    if (s != nullptr)
-    {
-        std::ostringstream stream;
-        stream << s;
-        vec.emplace_back (std::make_pair (std::string{m_col_name}, stream.str()));
-        return;
-    }
-}
-
-/* ----------------------------------------------------------------- */
-typedef gint (*IntAccessFunc) (const gpointer);
-typedef void (*IntSetterFunc) (const gpointer, gint);
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* sql_be,
-                                          GncSqlRow& row,
-                                          QofIdTypeConst obj_name,
-                                          gpointer pObject) const noexcept
-{
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
-
-    auto val = row.get_int_at_col(m_col_name);
-    set_parameter(pObject, val,
-                  reinterpret_cast<IntSetterFunc>(get_setter(obj_name)), m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
-}
-
-/* ----------------------------------------------------------------- */
-typedef gboolean (*BooleanAccessFunc) (const gpointer);
-typedef void (*BooleanSetterFunc) (const gpointer, gboolean);
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* sql_be,
-                                              GncSqlRow& row,
-                                              QofIdTypeConst obj_name,
-                                              gpointer pObject)
-    const noexcept
-{
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
-
-    auto val = row.get_int_at_col (m_col_name);
-    set_parameter(pObject, val,
-                  reinterpret_cast<BooleanSetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
-}
-
-/* ----------------------------------------------------------------- */
-typedef gint64 (*Int64AccessFunc) (const gpointer);
-typedef void (*Int64SetterFunc) (const gpointer, gint64);
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* sql_be,
-                                            GncSqlRow& row,
-                                            QofIdTypeConst obj_name,
-                                            gpointer pObject)
-    const noexcept
-{
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-
-    auto val = row.get_int_at_col (m_col_name);
-    set_parameter(pObject, val,
-                  reinterpret_cast<Int64SetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(const GncSqlBackend* sql_be,
-                                                   ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_INT64, 0, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(const GncSqlBackend* sql_be,
-                                                   QofIdTypeConst obj_name,
-                                                   const gpointer pObject,
-                                                   PairVec& vec) const noexcept
-{
-    add_value_to_vec<int64_t>(sql_be, obj_name, pObject, vec);
-}
-/* ----------------------------------------------------------------- */
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* sql_be,
-                                             GncSqlRow& row,
-                                             QofIdTypeConst obj_name,
-                                             gpointer pObject)
-    const noexcept
-{
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-    double val;
-    try
-    {
-        val = static_cast<double>(row.get_int_at_col(m_col_name));
-    }
-    catch (std::invalid_argument)
-    {
-        try
-        {
-            val = static_cast<double>(row.get_float_at_col(m_col_name));
-        }
-        catch (std::invalid_argument)
-        {
-            try
-            {
-                val = row.get_double_at_col(m_col_name);
-            }
-            catch (std::invalid_argument)
-            {
-                val = 0.0;
-            }
-        }
-    }
-    set_parameter(pObject, val, get_setter(obj_name), m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_DOUBLE, 0, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    add_value_to_vec<double*>(sql_be, obj_name, pObject, vec);
-}
-
-/* ----------------------------------------------------------------- */
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* sql_be,
-                                           GncSqlRow& row,
-                                           QofIdTypeConst obj_name,
-                                           gpointer pObject)
-    const noexcept
-{
-
-    GncGUID guid;
-    const GncGUID* pGuid;
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-
-    std::string str;
-    try
-    {
-        str = row.get_string_at_col(m_col_name);
-    }
-    catch (std::invalid_argument)
-    {
-        return;
-    }
-    (void)string_to_guid (str.c_str(), &guid);
-    set_parameter(pObject, &guid, get_setter(obj_name), m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    auto s = get_row_value_from_object<GncGUID*>(obj_name, pObject);
-
-    if (s != nullptr)
-    {
-
-        vec.emplace_back (std::make_pair (std::string{m_col_name},
-                                          std::string{guid_to_string(s)}));
-        return;
-    }
-}
-/* ----------------------------------------------------------------- */
-typedef Timespec (*TimespecAccessFunc) (const gpointer);
-typedef void (*TimespecSetterFunc) (const gpointer, Timespec*);
-
-#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
-#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
-                                               GncSqlRow& row,
-                                               QofIdTypeConst obj_name,
-                                               gpointer pObject) const noexcept
-{
-
-    Timespec ts = {0, 0};
-    gboolean isOK = FALSE;
-
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-
-    try
-    {
-        auto val = row.get_time64_at_col(m_col_name);
-        timespecFromTime64 (&ts, val);
-    }
-    catch (std::invalid_argument)
-    {
-        try
-        {
-            auto val = row.get_string_at_col(m_col_name);
-            auto s = val.c_str();
-            auto buf = g_strdup_printf ("%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
-                                        s[0], s[1], s[2], s[3], s[4], s[5],
-                                        s[6], s[7], s[8], s[9], s[10], s[11],
-                                        s[12], s[13]);
-            ts = gnc_iso8601_to_timespec_gmt (buf);
-            g_free (buf);
-        }
-        catch (std::invalid_argument)
-        {
-            return;
-        }
-    }
-    set_parameter(pObject, &ts,
-                  reinterpret_cast<TimespecSetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
- }
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != nullptr);
-
-    GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_be,
-                                                      QofIdTypeConst obj_name,
-                                                      const gpointer pObject,
-                                                      PairVec& vec) const noexcept
-{
-    TimespecAccessFunc ts_getter;
-    Timespec ts;
-/* Can't use get_row_value_from_object because g_object_get returns a
- * Timespec* and the getter returns a Timespec. Will be fixed by the
- * replacement of timespecs with time64s.
- */
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (obj_name != NULL);
-    g_return_if_fail (pObject != NULL);
-
-    if (m_gobj_param_name != NULL)
-    {
-        Timespec* pts;
-        g_object_get (pObject, m_gobj_param_name, &pts, NULL);
-        ts = *pts;
-    }
-    else
-    {
-        ts_getter = (TimespecAccessFunc)get_getter (obj_name);
-        g_return_if_fail (ts_getter != NULL);
-        ts = (*ts_getter) (pObject);
-    }
-
-    if (ts.tv_sec != 0 || ts.tv_nsec != 0)
-    {
-        auto datebuf = sql_be->time64_to_string (ts.tv_sec);
-        vec.emplace_back (std::make_pair (std::string{m_col_name}, datebuf));
-        return;
-    }
-}
-
-/* ----------------------------------------------------------------- */
-#define DATE_COL_SIZE 8
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* sql_be,
-                                            GncSqlRow& row,
-                                            QofIdTypeConst obj_name,
-                                            gpointer pObject) const noexcept
-{
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-    if (row.is_col_null(m_col_name))
-        return;
-    GDate date;
-    g_date_clear (&date, 1);
-    try
-    {
-	/* timespec_to_gdate applies the tz, and gdates are saved
-	 * as ymd, so we don't want that.
-	 */
-	auto time = row.get_time64_at_col(m_col_name);
-	auto tm = gnc_gmtime(&time);
-	g_date_set_dmy(&date, tm->tm_mday,
-		       static_cast<GDateMonth>(tm->tm_mon + 1),
-		       tm->tm_year + 1900);
-	free(tm);
-    }
-    catch (std::invalid_argument)
-    {
-        try
-        {
-            std::string str = row.get_string_at_col(m_col_name);
-            if (str.empty()) return;
-            auto year = static_cast<GDateYear>(stoi (str.substr (0,4)));
-            auto month = static_cast<GDateMonth>(stoi (str.substr (4,2)));
-            auto day = static_cast<GDateDay>(stoi (str.substr (6,2)));
-
-            if (year != 0 || month != 0 || day != (GDateDay)0)
-                g_date_set_dmy(&date, day, month, year);
-
-        }
-        catch (std::invalid_argument)
-        {
-            return;
-        }
-    }
-    set_parameter(pObject, &date, get_setter(obj_name), m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(const GncSqlBackend* sql_be,
-                                                 ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    GncSqlColumnInfo info{*this,  BCT_DATE, DATE_COL_SIZE, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(const GncSqlBackend* sql_be,
-                                                    QofIdTypeConst obj_name,
-                                                    const gpointer pObject,
-                                                    PairVec& vec) const noexcept
-{
-    GDate *date = get_row_value_from_object<GDate*>(obj_name, pObject);
-
-    if (date && g_date_valid (date))
-    {
-        std::ostringstream buf;
-        buf << std::setfill ('0') << std::setw (4) << g_date_get_year (date) <<
-            std::setw (2) << g_date_get_month (date) <<
-            std::setw (2) << static_cast<int>(g_date_get_day (date));
-        vec.emplace_back (std::make_pair (std::string{m_col_name}, buf.str()));
-        return;
-    }
-}
-
-/* ----------------------------------------------------------------- */
-typedef gnc_numeric (*NumericGetterFunc) (const gpointer);
-typedef void (*NumericSetterFunc) (gpointer, gnc_numeric*);
-
-static const EntryVec numeric_col_table =
-{
-    gnc_sql_make_table_entry<CT_INT64>("num", 0, COL_NNUL, "guid"),
-    gnc_sql_make_table_entry<CT_INT64>("denom", 0, COL_NNUL, "guid")
-};
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* sql_be,
-                                              GncSqlRow& row,
-                                              QofIdTypeConst obj_name,
-                                              gpointer pObject) const noexcept
-{
-
-
-    g_return_if_fail (pObject != NULL);
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-    gnc_numeric n;
-    try
-    {
-        auto buf = g_strdup_printf ("%s_num", m_col_name);
-        auto num = row.get_int_at_col (buf);
-        g_free (buf);
-        buf = g_strdup_printf ("%s_denom", m_col_name);
-        auto denom = row.get_int_at_col (buf);
-        n = gnc_numeric_create (num, denom);
-    }
-    catch (std::invalid_argument)
-    {
-        return;
-    }
-    set_parameter(pObject, &n,
-                  reinterpret_cast<NumericSetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* sql_be,
-                                                     ColVec& vec) const noexcept
-{
-    g_return_if_fail (sql_be != NULL);
-
-    for (auto const& subtable_row : numeric_col_table)
-    {
-        gchar* buf = g_strdup_printf("%s_%s", m_col_name,
-                                     subtable_row->m_col_name);
-        GncSqlColumnInfo info(buf, BCT_INT64, 0, false, false,
-                              m_flags & COL_PKEY, m_flags & COL_NNUL);
-        vec.emplace_back(std::move(info));
-    }
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* sql_be,
-                                                     QofIdTypeConst obj_name,
-                                                     const gpointer pObject,
-                                                     PairVec& vec) const noexcept
-{
-/* We can't use get_row_value_from_object for the same reason as Timespec. */
-    NumericGetterFunc getter;
-    gnc_numeric n;
-
-    g_return_if_fail (sql_be != NULL);
-    g_return_if_fail (obj_name != NULL);
-    g_return_if_fail (pObject != NULL);
-
-    if (m_gobj_param_name != nullptr)
-    {
-        gnc_numeric* s;
-        g_object_get (pObject, m_gobj_param_name, &s, NULL);
-        n = *s;
-    }
-    else
-    {
-        getter = reinterpret_cast<NumericGetterFunc>(get_getter (obj_name));
-        if (getter != NULL)
-        {
-            n = (*getter) (pObject);
-        }
-        else
-        {
-            n = gnc_numeric_zero ();
-        }
-    }
-
-    std::ostringstream buf;
-    std::string num_col{m_col_name};
-    std::string denom_col{m_col_name};
-    num_col += "_num";
-    denom_col += "_denom";
-    buf << gnc_numeric_num (n);
-    vec.emplace_back (std::make_pair (num_col, buf.str ()));
-    buf.str ("");
-    buf << gnc_numeric_denom (n);
-    vec.emplace_back (denom_col, buf.str ());
-}
 
 /* ================================================================= */
 
@@ -2238,109 +1277,42 @@ build_delete_statement (GncSqlBackend* sql_be,
 }
 
 /* ================================================================= */
-bool
-GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
-{
-    const GncGUID* guid;
-    gboolean is_infant;
-    E_DB_OPERATION op;
-    gboolean is_ok;
-
-    is_infant = qof_instance_get_infant (inst);
-    if (qof_instance_get_destroying (inst))
-    {
-        op = OP_DB_DELETE;
-    }
-    else if (sql_be->pristine() || is_infant)
-    {
-        op = OP_DB_INSERT;
-    }
-    else
-    {
-        op = OP_DB_UPDATE;
-    }
-    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
-                                     m_type_name.c_str(), inst, m_col_table);
-
-    if (is_ok)
-    {
-        // Now, commit any slots
-        guid = qof_instance_get_guid (inst);
-        if (!qof_instance_get_destroying (inst))
-        {
-            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
-        }
-        else
-        {
-            is_ok = gnc_sql_slots_delete (sql_be, guid);
-        }
-    }
-
-    return is_ok;
-}
 
 /* ================================================================= */
-void
-GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
-{
-    g_return_if_fail (sql_be != nullptr);
-    int version = sql_be->get_table_version (m_table_name);
-    if (version == 0) //No tables, otherwise version will sql_be >= 1.
-    {
-        sql_be->create_table(m_table_name, m_col_table);
-        sql_be->set_table_version(m_table_name, m_version);
-    }
-    else if (version != m_version)
-        PERR("Version mismatch in table %s, expecting %d but backend is %d."
-             "Table creation aborted.", m_table_name.c_str(), m_version, version);
-}
 
 /* ================================================================= */
 
-
-/* This is necessary for 64-bit builds because g++ complains
- * that reinterpret_casting a void* (64 bits) to an int (32 bits)
- * loses precision, so we have to explicitly dispose of the precision.
- * FIXME: We shouldn't be storing ints in ptrs in the first place.
- */
-#ifdef __LP64__
-template <> int
-GncSqlColumnTableEntry::get_row_value_from_object<int>(QofIdTypeConst obj_name,
-                                                       const gpointer pObject,
-                                                       std::false_type) const
+static void
+business_core_sql_init (void)
 {
-    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr, 0);
-    int result = 0;
-    if (m_gobj_param_name != nullptr)
-        g_object_get(pObject, m_gobj_param_name, &result, NULL );
-    else
-    {
-        QofAccessFunc getter = get_getter(obj_name);
-        if (getter != nullptr)
-        {
-            auto value = ((getter)(pObject, nullptr));
-            result = reinterpret_cast<uint64_t>(value) &
-                UINT64_C(0x00000000FFFFFFFF);
-        }
-    }
-    return result;
+    /* Initialize our pointers into the backend subsystem */
+    gnc_billterm_sql_initialize ();
+    gnc_customer_sql_initialize ();
+    gnc_employee_sql_initialize ();
+    gnc_entry_sql_initialize ();
+    gnc_invoice_sql_initialize ();
+    gnc_job_sql_initialize ();
+    gnc_order_sql_initialize ();
+    gnc_taxtable_sql_initialize ();
+    gnc_vendor_sql_initialize ();
 }
-#endif
 
-GncSqlRow&
-GncSqlRow::operator++()
+static void
+gnc_sql_init_object_handlers (void)
 {
-    auto& new_row =  m_iter->operator++();
-    if (new_row != *this)
-        m_iter = nullptr;
-    return new_row;
+    gnc_sql_init_book_handler ();
+    gnc_sql_init_commodity_handler ();
+    gnc_sql_init_account_handler ();
+    gnc_sql_init_budget_handler ();
+    gnc_sql_init_price_handler ();
+    gnc_sql_init_transaction_handler ();
+    gnc_sql_init_slots_handler ();
+    gnc_sql_init_recurrence_handler ();
+    gnc_sql_init_schedxaction_handler ();
+    gnc_sql_init_lot_handler ();
+
+    /* And the business objects */
+    business_core_sql_init ();
 }
 
-/*
-  GncSqlResult*
-  GncSqlRow::operator*()
-  {
-  return m_iter->operator*();
-  }
-*/
 /* ========================== END OF FILE ===================== */
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
index 9721e68..7d47233 100644
--- a/src/backend/sql/gnc-backend-sql.h
+++ b/src/backend/sql/gnc-backend-sql.h
@@ -40,164 +40,21 @@
 #define GNC_BACKEND_SQL_H
 extern "C"
 {
-#include "qof.h"
-#include "qofbackend-p.h"
+#include <qof.h>
+#include <qofbackend-p.h>
 #include <gmodule.h>
 }
 
-#include <algorithm>
-#include <sstream>
 #include <string>
 #include <vector>
-#include <memory>
-#include <cstdint>
 
+#include "gnc-sql-object-backend.hpp"
 
-using uint_t = unsigned int;
-struct GncSqlColumnInfo;
-class GncSqlColumnTableEntry;
-using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
-using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
-using ColVec = std::vector<GncSqlColumnInfo>;
 using StrVec = std::vector<std::string>;
 using InstanceVec = std::vector<QofInstance*>;
 using PairVec = std::vector<std::pair<std::string, std::string>>;
-using VersionPair = std::pair<const std::string, unsigned int>;
-using VersionVec = std::vector<VersionPair>;
-class GncSqlConnection;
-class GncSqlStatement;
-using GncSqlStatementPtr = std::unique_ptr<GncSqlStatement>;
-class GncSqlResult;
-//using GncSqlResultPtr = std::unique_ptr<GncSqlResult>;
-using GncSqlResultPtr = GncSqlResult*;
-
-/**
- * @struct GncSqlBackend
- *
- * Main SQL backend structure.
- */
-class GncSqlBackend
-{
-public:
-    GncSqlBackend(GncSqlConnection *conn, QofBook* book,
-                  const char* format = nullptr);
-    virtual ~GncSqlBackend() = default;
-    /** Connect the backend to a GncSqlConnection.
-     * Sets up version info. Calling with nullptr clears the connection and
-     * destroys the version info.
-     */
-    void connect(GncSqlConnection *conn) noexcept;
-    /**
-     * Initializes DB table version information.
-     */
-    void init_version_info() noexcept;
-    bool reset_version_info() noexcept;
-    /**
-     * Finalizes DB table version information.
-     */
-    void finalize_version_info() noexcept;
-    /* FIXME: These are just pass-throughs of m_conn functions. */
-    GncSqlStatementPtr create_statement_from_sql(const std::string& str) const noexcept;
-    /** Executes an SQL SELECT statement and returns the result rows.  If an
-     * error occurs, an entry is added to the log, an error status is returned
-     * to qof and nullptr is returned.
-     *
-     * @param statement Statement
-     * @return Results, or nullptr if an error has occured
-     */
-    GncSqlResultPtr execute_select_statement(const GncSqlStatementPtr& stmt) const noexcept;
-    int execute_nonselect_statement(const GncSqlStatementPtr& stmt) const noexcept;
-    std::string quote_string(const std::string&) const noexcept;
-    /**
-     * Creates a table in the database
-     *
-     * @param table_name Table name
-     * @param col_table DB table description
-     * @return TRUE if successful, FALSE if unsuccessful
-     */
-    bool create_table(const std::string& table_name, const EntryVec& col_table) const noexcept;
-    /**
-     * Creates a table in the database and sets its version
-     *
-     * @param table_name Table name
-     * @param table_version Table version
-     * @param col_table DB table description
-     * @return TRUE if successful, FALSE if unsuccessful
-     */
-    bool create_table(const std::string& table_name, int table_version,
-                      const EntryVec& col_table) noexcept;
-    /**
-     * Creates an index in the database
-     *
-     * @param index_name Index name
-     * @param table_name Table name
-     * @param col_table Columns that the index should index
-     * @return TRUE if successful, FALSE if unsuccessful
-     */
-    bool create_index(const std::string& index_name,
-                      const std::string& table_name,
-                      const EntryVec& col_table) const noexcept;
-    /**
-     * Adds one or more columns to an existing table.
-     *
-     * @param table_name SQL table name
-     * @param new_col_table Column table for new columns
-     * @return TRUE if successful, FALSE if unsuccessful
-     */
-    bool add_columns_to_table(const std::string& table_name,
-                              const EntryVec& col_table) const noexcept;
-    /**
-     * Upgrades a table to a new structure.
-     *
-     * The upgrade is done by creating a new table with the new structure,
-     * SELECTing the old data into the new table, deleting the old table, then
-     * renaming the new table.  Therefore, this will only work if the new table
-     * structure is similar enough to the old table that the SELECT will work.
-     *
-     * @param table_name SQL table name
-     * @param col_table Column table
-     */
-    void upgrade_table (const std::string& table_name,
-                        const EntryVec& col_table) noexcept;
-    /**
-     * Returns the version number for a DB table.
-     *
-     * @param table_name Table name
-     * @return Version number, or 0 if the table does not exist
-     */
-    uint_t get_table_version(const std::string& table_name) const noexcept;
-    bool set_table_version (const std::string& table_name, uint_t version) noexcept;
-    /**
-     * Converts a time64 value to a string value for the database.
-     *
-     * @param t time64 to be converted.
-     * @return String representation of the Timespec
-     */
-    std::string time64_to_string (time64 t) const noexcept;
-
-    QofBook* book() const noexcept { return m_book; }
-
-    bool pristine() const noexcept { return m_is_pristine_db; }
-    void update_progress() const noexcept;
-    void finish_progress() const noexcept;
-    void set_loading(bool val) noexcept { m_loading = val; }
-    const char* timespec_format() const noexcept { return m_timespec_format; }
-
-    friend void gnc_sql_load(GncSqlBackend*, QofBook*, QofBackendLoadType);
-    friend void gnc_sql_sync_all(GncSqlBackend*, QofBook*);
-    friend void gnc_sql_commit_edit(GncSqlBackend*, QofInstance*);
-
-protected:
-    QofBackend qof_be;           /**< QOF backend. Not a pointer, nor really a member */
-    GncSqlConnection* m_conn;  /**< SQL connection */
-    QofBook* m_book;           /**< The primary, main open book */
-    bool m_loading;        /**< We are performing an initial load */
-    bool m_in_query;       /**< We are processing a query */
-    bool m_is_pristine_db; /**< Are we saving to a new pristine db? */
-    VersionVec m_versions;    /**< Version number for each table */
-    const char* m_timespec_format;   /**< Format string for SQL for timespec values */
-private:
-};
+using uint_t = unsigned int;
+class GncSqlRow;
 
 /**
  * Initialize the SQL backend.
@@ -260,214 +117,9 @@ void gnc_sql_commit_edit (GncSqlBackend* qsql_be, QofInstance* inst);
 /**
  */
 
-/**
- * SQL statement provider.
- */
-class GncSqlStatement
-{
-public:
-    virtual ~GncSqlStatement() {}
-    virtual const char* to_sql() const = 0;
-    virtual void add_where_cond (QofIdTypeConst, const PairVec&) = 0;
-};
-
-/**
- * Encapsulate the connection to the database. 
- */
-class GncSqlConnection
-{
-public:
-    /** Returns NULL if error */
-    virtual ~GncSqlConnection() = default;
-    virtual GncSqlResultPtr execute_select_statement (const GncSqlStatementPtr&)
-        noexcept = 0;
-    /** Returns false if error */
-    virtual int execute_nonselect_statement (const GncSqlStatementPtr&)
-        noexcept = 0;
-    virtual GncSqlStatementPtr create_statement_from_sql (const std::string&)
-        const noexcept = 0;
-    /** Returns true if successful */
-    virtual bool does_table_exist (const std::string&) const noexcept = 0;
-    /** Returns TRUE if successful, false if error */
-    virtual bool begin_transaction () noexcept = 0;
-    /** Returns TRUE if successful, FALSE if error */
-    virtual bool rollback_transaction () const noexcept = 0;
-    /** Returns TRUE if successful, FALSE if error */
-    virtual bool commit_transaction () const noexcept = 0;
-    /** Returns TRUE if successful, FALSE if error */
-    virtual bool create_table (const std::string&, const ColVec&)
-        const noexcept = 0;
-    /** Returns TRUE if successful, FALSE if error */
-    virtual bool create_index (const std::string&, const std::string&,
-                               const EntryVec&) const noexcept = 0;
-    /** Returns TRUE if successful, FALSE if error */
-    virtual bool add_columns_to_table (const std::string&, const ColVec&)
-        const noexcept = 0;
-    virtual std::string quote_string (const std::string&)
-        const noexcept = 0;
-    /** Get the connection error value.
-     * If not 0 will normally be meaningless outside of implementation code.
-     */
-    virtual int dberror() const noexcept = 0;
-    virtual void set_error(int error, unsigned int repeat,  bool retry) noexcept = 0;
-    virtual bool verify() noexcept = 0;
-    virtual bool retry_connection(const char* msg) noexcept = 0;
-
-};
-
-/**
- * Struct used to represent a row in the result of an SQL SELECT statement.
- * SQL backends must provide a structure which implements all of the functions.
- */
-
-class GncSqlRow;
-/**
- * Pure virtual class to iterate over a query result set.
- */
-class GncSqlResult
-{
-public:
-    virtual ~GncSqlResult() = default;
-    virtual uint64_t size() const noexcept = 0;
-    virtual GncSqlRow& begin() = 0;
-    virtual GncSqlRow& end() = 0;
-    friend GncSqlRow;
-protected:
-    class IteratorImpl {
-    public:
-        virtual ~IteratorImpl() = default;
-        virtual GncSqlRow& operator++() = 0;
-        virtual GncSqlResult* operator*() = 0;
-        virtual int64_t get_int_at_col (const char* col) const = 0;
-        virtual float get_float_at_col (const char* col) const = 0;
-        virtual double get_double_at_col (const char* col) const = 0;
-        virtual std::string get_string_at_col (const char* col) const = 0;
-        virtual time64 get_time64_at_col (const char* col) const = 0;
-        virtual bool is_col_null (const char* col) const noexcept = 0;
-    };
-};
-
-/**
- * Row of SQL Query results.
- *
- * This is a "pointer" class of a pimpl pattern, the implementation being
- * GncSqlResult::IteratorImpl. It's designed to present a std::forward_iterator
- * like interface for use with range-for while allowing for wrapping a C API.
- *
- * Important Implementation Note: Operator++() as written requires that the
- * sentinel GncSqlRow returned by GncSqlResult::end() has m_impl = nullptr in
- * order to terminate the loop condition. This is a bit of a hack and might be a
- * problem with a different SQL interface library from libdbi.
- *
- * Note that GncSqlResult::begin and GncSqlRow::operator++() return
- * GncSqlRow&. This is necessary for operator++() to be called: Using operator
- * ++() on a pointer performs pointer arithmetic rather than calling the
- * pointed-to-class's operator++() and C++'s range-for uses operator++()
- * directly on whatever begin() gives it.
- */
-class GncSqlRow
-{
-public:
-    GncSqlRow (GncSqlResult::IteratorImpl* iter) : m_iter{iter} {}
-    ~GncSqlRow() { }
-    GncSqlRow& operator++();
-    GncSqlRow& operator*() { return *this; }
-    friend bool operator!=(const GncSqlRow&, const GncSqlRow&);
-    int64_t get_int_at_col (const char* col) const {
-        return m_iter->get_int_at_col (col); }
-    float get_float_at_col (const char* col) const {
-        return m_iter->get_float_at_col (col); }
-    double get_double_at_col (const char* col) const {
-        return m_iter->get_double_at_col (col); }
-    std::string get_string_at_col (const char* col) const {
-        return m_iter->get_string_at_col (col); }
-    time64 get_time64_at_col (const char* col) const {
-        return m_iter->get_time64_at_col (col); }
-    bool is_col_null (const char* col) const noexcept {
-        return m_iter->is_col_null (col); }
-private:
-    GncSqlResult::IteratorImpl* m_iter;
-};
-
-inline bool operator!=(const GncSqlRow& lr, const GncSqlRow& rr) {
-    return lr.m_iter != rr.m_iter;
-}
-
-inline bool operator==(const GncSqlRow& lr, const GncSqlRow& rr) {
-    return !(lr != rr);
-}
-
 #define GNC_SQL_BACKEND             "gnc:sql:1"
 #define GNC_SQL_BACKEND_VERSION 1
 
-/**
- * Encapsulates per-class table schema with functions to load, create a table,
- * commit a changed front-end object (note that database transaction semantics
- * are not yet implemented; edit/commit applies to the front-end object!) and
- * write all front-end objects of the type to the database. Additional functions
- * for creating and runing queries existed but were unused and untested. They've
- * been temporarily removed until the front end is ready to use them.
- */
-class GncSqlObjectBackend
-{
-public:
-    GncSqlObjectBackend (int version, const std::string& type,
-                         const std::string& table, const EntryVec& vec) :
-        m_table_name{table}, m_version{version}, m_type_name{type},
-        m_col_table(vec) {}
-    /**
-     * Load all objects of m_type in the database into memory.
-     * @param sql_be The GncSqlBackend containing the database connection.
-     */
-    virtual void load_all (GncSqlBackend* sql_be) = 0;
-    /**
-     * Conditionally create or update a database table from m_col_table. The
-     * condition is the version returned by querying the database's version
-     * table: If it's 0 then the table wasn't found and will be created; All
-     * tables areat least version 1. If the database's version is less than the
-     * compiled version then the table schema is upgraded but the data isn't,
-     * that's the engine's responsibility when the object is loaded. If the
-     * version is greater than the compiled version then nothing is touched.
-     * @param sql_be The GncSqlBackend containing the database connection.
-     */
-    virtual void create_tables (GncSqlBackend* sql_be);
-    /**
-     * UPDATE/INSERT a single instance of m_type_name into the database.
-     * @param sql_be The GncSqlBackend containing the database.
-     * @param inst The QofInstance to be written out.
-     */
-    virtual bool commit (GncSqlBackend* sql_be, QofInstance* inst);
-    /**
-     * Write all objects of m_type_name to the database.
-     * @param sql_be The GncSqlBackend containing the database.
-     * @return true if the objects were successfully written, false otherwise.
-     */
-    virtual bool write (GncSqlBackend* sql_be) { return true; }
-    /**
-     * Return the m_type_name for the class. This value is created at
-     * compilation time and is called QofIdType or QofIdTypeConst in other parts
-     * of GnuCash. Most values are defined in src/engine/gnc-engine.h.
-     * @return m_type_name.
-     */
-    const char* type () const noexcept { return m_type_name.c_str(); }
-    /**
-     * Compare a version with the compiled version (m_version).
-     * @return true if they match.
-     */
-    const bool is_version (int version) const noexcept {
-        return version == m_version;
-    }
-protected:
-    const std::string m_table_name;
-    const int m_version;
-    const std::string m_type_name; /// The front-end QofIdType
-    const EntryVec& m_col_table;   /// The ORM table definition.
-};
-
-using GncSqlObjectBackendPtr = GncSqlObjectBackend*;
-
-using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
-using OBEVec = std::vector<OBEEntry>;
 void gnc_sql_register_backend(OBEEntry&&);
 void gnc_sql_register_backend(GncSqlObjectBackendPtr);
 const OBEVec& gnc_sql_get_backend_registry();
@@ -492,363 +144,7 @@ struct write_objects_t
     GncSqlObjectBackendPtr obe;
 };
 
-/**
- * Basic column type
- */
-typedef enum
-{
-    BCT_STRING,
-    BCT_INT,
-    BCT_INT64,
-    BCT_DATE,
-    BCT_DOUBLE,
-    BCT_DATETIME
-} GncSqlBasicColumnType;
-
-
-// Type for conversion of db row to object.
-enum GncSqlObjectType
-{
-    CT_STRING,
-    CT_GUID,
-    CT_INT,
-    CT_INT64,
-    CT_TIMESPEC,
-    CT_GDATE,
-    CT_NUMERIC,
-    CT_DOUBLE,
-    CT_BOOLEAN,
-    CT_ACCOUNTREF,
-    CT_BUDGETREF,
-    CT_COMMODITYREF,
-    CT_LOTREF,
-    CT_TXREF,
-    CT_ADDRESS,
-    CT_BILLTERMREF,
-    CT_INVOICEREF,
-    CT_ORDERREF,
-    CT_OWNERREF,
-    CT_TAXTABLEREF
-};
-
-enum ColumnFlags : int
-{
-    COL_NO_FLAG = 0,
-        COL_PKEY = 0x01,        /**< The column is a primary key */
-        COL_NNUL = 0x02,    /**< The column may not contain a NULL value */
-        COL_UNIQUE = 0x04,  /**< The column must contain unique values */
-        COL_AUTOINC = 0x08 /**< The column is an auto-incrementing int */
-        };
-
-/**
- * Contains all of the information required to copy information between an
- * object and the database for a specific object property.
- *
- * If an entry contains a gobj_param_name value, this string is used as the
- * property name for a call to g_object_get() or g_object_set().  If the
- * gobj_param_name value is NULL but qof_param_name is not NULL, this value
- * is used as the parameter name for a call to
- * qof_class_get_parameter_getter().  If both of these values are NULL, getter
- * and setter are the addresses of routines to return or set the parameter
- * value, respectively.
- *
- * The database description for an object consists of an array of
- * GncSqlColumnTableEntry objects, with a final member having col_name == NULL.
- */
-
-class GncSqlColumnTableEntry
-{
-public:
-    GncSqlColumnTableEntry (const char* name, const GncSqlObjectType type,
-                            unsigned int s,
-                            int f, const char* gobj_name = nullptr,
-                            const char* qof_name = nullptr,
-                            QofAccessFunc get = nullptr,
-                            QofSetterFunc set = nullptr) :
-        m_col_name{name}, m_col_type{type}, m_size{s},
-        m_flags{static_cast<ColumnFlags>(f)},
-        m_gobj_param_name{gobj_name}, m_qof_param_name{qof_name}, m_getter{get},
-        m_setter{set} {}
 
-    /**
-     * Load a value into an object from the database row.
-     */
-    virtual void load(const GncSqlBackend* sql_be, GncSqlRow& row,
-                      QofIdTypeConst obj_name, gpointer pObject) const noexcept = 0;
-    /**
-     * Add a GncSqlColumnInfo structure for the column type to a
-     * ColVec.
-     */
-    virtual void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept = 0;
-    /**
-     * Add a pair of the table column heading and object's value's string
-     * representation to a PairVec; used for constructing WHERE clauses and
-     * UPDATE statements.
-     */
-    virtual void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
-                              gpointer pObject, PairVec& vec) const noexcept = 0;
-    /**
-     * Retrieve the getter function depending on whether it's an auto-increment
-     * field, a QofClass getter, or a function passed to the constructor.
-     */
-    QofAccessFunc get_getter(QofIdTypeConst obj_name) const noexcept;
-    /**
-     * Retrieve the setter function depending on whether it's an auto-increment
-     * field, a QofClass getter, or a function passed to the constructor.
-     */
-    QofSetterFunc get_setter(QofIdTypeConst obj_name) const noexcept;
-    /**
-     * Retrieve the field name so that we don't need to make
-     * create_single_col_select_statement and friend.
-     */
-    const char* name() const noexcept { return m_col_name; }
-    /**
-     * Report if the entry is an auto-increment field.
-     */
-    bool is_autoincr() const noexcept { return m_flags & COL_AUTOINC; }
-    /* On the other hand, our implementation class and GncSqlColumnInfo need to
-     * be able to read our member variables.
-     */
-    template<GncSqlObjectType Otype> friend class GncSqlColumnTableEntryImpl;
-    friend struct GncSqlColumnInfo;
-    template<typename T> void load_from_guid_ref(GncSqlRow& row,
-                                                 QofIdTypeConst obj_name,
-                                                 gpointer pObject, T get_ref)
-        const noexcept
-        {
-            g_return_if_fail (pObject != NULL);
-
-            try
-            {
-                GncGUID guid;
-                auto val = row.get_string_at_col (m_col_name);
-                (void)string_to_guid (val.c_str(), &guid);
-                auto target = get_ref(&guid);
-                if (target != nullptr)
-                    set_parameter (pObject, target, get_setter(obj_name),
-                                   m_gobj_param_name);
-            }
-            catch (std::invalid_argument) {}
-        }
-
-protected:
-    template <typename T> T
-    get_row_value_from_object(QofIdTypeConst obj_name, const gpointer pObject) const;
-    template <typename T> void
-    add_value_to_vec(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
-                     const gpointer pObject, PairVec& vec) const;
-/**
- * Adds a name/guid std::pair to a PairVec for creating a query.
- *
- * @param sql_be SQL backend struct
- * @param obj_name QOF object type name
- * @param pObject Object
- * @param pList List
- */
-    void add_objectref_guid_to_query (const GncSqlBackend* sql_be,
-                                      QofIdTypeConst obj_name,
-                                      const gpointer pObject,
-                                      PairVec& vec) const noexcept;
-/**
- * Adds a column info structure for an object reference GncGUID to a ColVec.
- *
- * @param sql_be SQL backend struct
- * @param pList List
- */
-    void add_objectref_guid_to_table (const GncSqlBackend* sql_be,
-                                      ColVec& vec) const noexcept;
-private:
-    const char* m_col_name;        /**< Column name */
-    const GncSqlObjectType m_col_type;        /**< Column type */
-    unsigned int m_size;       /**< Column size in bytes, for string columns */
-    ColumnFlags m_flags;           /**< Column flags */
-    const char* m_gobj_param_name; /**< If non-null, g_object param name */
-    const char* m_qof_param_name;  /**< If non-null, qof parameter name */
-    QofAccessFunc m_getter;        /**< General access function */
-    QofSetterFunc m_setter;        /**< General setter function */
-    template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
-                                                      const gpointer pObject,
-                                                      std::true_type) const;
-    template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
-                                                      const gpointer pObject,
-                                                      std::false_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
-                                                QofIdTypeConst obj_name,
-                                                const gpointer pObject,
-                                                PairVec& vec, std::true_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
-                                                QofIdTypeConst obj_name,
-                                                const gpointer pObject,
-                                                PairVec& vec, std::false_type) const;
-
-};
-
-template <GncSqlObjectType Type>
-class GncSqlColumnTableEntryImpl : public GncSqlColumnTableEntry
-{
-public:
-    GncSqlColumnTableEntryImpl (const char* name, const GncSqlObjectType type,
-                                unsigned int s,
-                                int f, const char* gobj_name = nullptr,
-                                const char* qof_name = nullptr,
-                                QofAccessFunc get = nullptr,
-                                QofSetterFunc set = nullptr) :
-        GncSqlColumnTableEntry (name, type, s, f, gobj_name,qof_name, get, set)
-        {} 
-    void load(const GncSqlBackend* sql_be, GncSqlRow& row,  QofIdTypeConst obj_name,
-              gpointer pObject) const noexcept override;
-    void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept override;
-    void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
-                      gpointer pObject, PairVec& vec) const noexcept override;
-};
-
-template <GncSqlObjectType Type>
-std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
-gnc_sql_make_table_entry(const char* name, unsigned int s, int f)
-{
-    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s, f);
-}
-
-template <GncSqlObjectType Type>
-std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
-gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
-                         const char* param)
-{
-    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
-                                                              f, param);
-}
-
-class is_qof : public std::true_type {};
-
-template <GncSqlObjectType Type>
-std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
-gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
-                         const char* param, bool qofp)
-{
-    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
-                                                              f, nullptr,
-                                                              param);
-}
-
-template <GncSqlObjectType Type>
-std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
-gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
-                         QofAccessFunc get, QofSetterFunc set)
-{
-    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(
-        name, Type, s, f, nullptr, nullptr, get, set);
-}
-
-/**
- *  information required to create a column in a table.
- */
-struct GncSqlColumnInfo
-{
-    GncSqlColumnInfo (std::string&& name, GncSqlBasicColumnType type,
-                      unsigned int size = 0, bool unicode = false,
-                      bool autoinc = false, bool primary = false,
-                      bool not_null = false) :
-        m_name{name}, m_type{type}, m_size{size}, m_unicode{unicode},
-        m_autoinc{autoinc}, m_primary_key{primary}, m_not_null{not_null}
-        {}
-    GncSqlColumnInfo(const GncSqlColumnTableEntry& e, GncSqlBasicColumnType t,
-                     unsigned int size = 0, bool unicode = true) :
-        m_name{e.m_col_name}, m_type{t}, m_size{size}, m_unicode{unicode},
-        m_autoinc(e.m_flags & COL_AUTOINC),
-        m_primary_key(e.m_flags & COL_PKEY),
-        m_not_null(e.m_flags & COL_NNUL) {}
-    std::string m_name; /**< Column name */
-    GncSqlBasicColumnType m_type; /**< Column basic type */
-    unsigned int m_size; /**< Column size (string types) */
-    bool m_unicode; /**< Column is unicode (string types) */
-    bool m_autoinc; /**< Column is autoinc (int type) */
-    bool m_primary_key; /**< Column is the primary key */
-    bool m_not_null; /**< Column forbids NULL values */
-};
-
-inline bool operator==(const GncSqlColumnInfo& l,
-                       const GncSqlColumnInfo& r)
-{
-    return l.m_name == r.m_name && l.m_type == r.m_type;
-}
-
-inline bool operator!=(const GncSqlColumnInfo& l,
-                       const GncSqlColumnInfo& r)
-{
-    return !(l == r);
-}
-
-typedef enum
-{
-    OP_DB_INSERT,
-    OP_DB_UPDATE,
-    OP_DB_DELETE
-} E_DB_OPERATION;
-
-
-/**
- * Set an object property with a setter function.
- * @param pObject void* to the object being set.
- * @param item the value to be set in the property.
- * @param setter The function to set the property.
- * The void* is an obvious wart occasioned by the fact that we're using GLists
- * to hold objects. As the rewrite progresses we'll replace that with another
- * template paramter.
- */
-template <typename T, typename P, typename F>
-void set_parameter(T object, P item, F& setter)
-{
-    (*setter)(object, item);
-}
-
-template <typename T, typename P>
-void set_parameter(T object, P item, QofSetterFunc setter, std::true_type)
-{
-    (*setter)(object, (void*)item);
-}
-
-template <typename T, typename P>
-void set_parameter(T object, P item, QofSetterFunc setter, std::false_type)
-{
-    (*setter)(object, (void*)(&item));
-}
-
-template <typename T, typename P>
-void set_parameter(T object, P item, QofSetterFunc setter)
-{
-    set_parameter(object, item, setter, std::is_pointer<P>());
-}
-
-/**
- * Set an object property with g_object_set.
- * @param pObject void* to the object being set.
- * @param item the value to set in the property.
- * @param property the property name.
- * The void* is an obvious wart. So is g_object_set, partly because it's GObject
- * but mostly because it works off of string comparisons.
- */
-template <typename T, typename P>
-void set_parameter(T object, P item, const char* property)
-{
-    qof_instance_increase_editlevel(object);
-    g_object_set(object, property, item, nullptr);
-    qof_instance_decrease_editlevel(object);
-};
-
-/**
- * Set an object property with either a g_object_set or a setter.
- *
- * See previous templates for the parameter meanings. This is clunky but fits in
- * the current architecture for refactoring.
- */
-template <typename T, typename P, typename F>
-void set_parameter(T object, P item, F setter, const char* property)
-{
-    if (property)
-        set_parameter(object, item, property);
-    else
-        set_parameter(object, item, setter);
-}
 
 /**
  * Performs an operation on the database.
@@ -926,91 +222,6 @@ gpointer gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery);
 void gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery);
 void gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery);
 
-template <typename T> T
-GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
-                                                  const gpointer pObject) const
-{
-    return get_row_value_from_object<T>(obj_name, pObject,
-                                        std::is_pointer<T>());
-}
-
-template <typename T> T
-GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
-                                                  const gpointer pObject,
-                                                  std::true_type) const
-{
-    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr, nullptr);
-    T result = nullptr;
-    if (m_gobj_param_name != nullptr)
-        g_object_get(pObject, m_gobj_param_name, &result, NULL );
-    else
-    {
-        QofAccessFunc getter = get_getter(obj_name);
-        if (getter != nullptr)
-            result = reinterpret_cast<T>((getter)(pObject, nullptr));
-    }
-    return result;
-}
-
-template <typename T> T
-GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
-                                                  const gpointer pObject,
-                                                  std::false_type) const
-{
-    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr,
-                         static_cast<T>(0));
-    T result = static_cast<T>(0);
-    if (m_gobj_param_name != nullptr)
-        g_object_get(pObject, m_gobj_param_name, &result, NULL );
-    else
-    {
-        QofAccessFunc getter = get_getter(obj_name);
-        if (getter != nullptr)
-            result = reinterpret_cast<T>((getter)(pObject, nullptr));
-    }
-    return result;
-}
-
-template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
-                                         const gpointer pObject,
-                                         PairVec& vec) const
-{
-    add_value_to_vec<T>(sql_be, obj_name, pObject, vec, std::is_pointer<T>());
-}
-
-template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
-                                         const gpointer pObject,
-                                         PairVec& vec, std::true_type) const
-{
-    T s = get_row_value_from_object<T>(obj_name, pObject);
-
-    if (s != nullptr)
-    {
-        std::ostringstream stream;
-        stream << *s;
-        vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
-        return;
-    }
-}
-
-template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
-                                         QofIdTypeConst obj_name,
-                                         const gpointer pObject,
-                                         PairVec& vec, std::false_type) const
-{
-    T s = get_row_value_from_object<T>(obj_name, pObject);
-
-    std::ostringstream stream;
-    stream << s;
-    vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
-    return;
-}
-
 #endif /* GNC_BACKEND_SQL_H */
 
 /**
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index d81ad51..70073f2 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -41,6 +41,10 @@ extern "C"
 #include "qof.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-bill-term-sql.h"
diff --git a/src/backend/sql/gnc-book-sql.cpp b/src/backend/sql/gnc-book-sql.cpp
index fc5bd96..36fd79b 100644
--- a/src/backend/sql/gnc-book-sql.cpp
+++ b/src/backend/sql/gnc-book-sql.cpp
@@ -41,6 +41,11 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-book-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index f25aada..c3aff03 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -40,6 +40,11 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-budget-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index 68d9ce5..b1e47fc 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -36,6 +36,10 @@ extern "C"
 #include "gnc-commodity.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-customer-sql.cpp b/src/backend/sql/gnc-customer-sql.cpp
index 4061311..76bc7d4 100644
--- a/src/backend/sql/gnc-customer-sql.cpp
+++ b/src/backend/sql/gnc-customer-sql.cpp
@@ -40,6 +40,10 @@ extern "C"
 #include "gncTaxTableP.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-customer-sql.h"
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index 25b406a..07da99f 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -39,6 +39,10 @@ extern "C"
 #include "gncEmployeeP.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-commodity-sql.h"
diff --git a/src/backend/sql/gnc-entry-sql.cpp b/src/backend/sql/gnc-entry-sql.cpp
index d20152b..4f1d467 100644
--- a/src/backend/sql/gnc-entry-sql.cpp
+++ b/src/backend/sql/gnc-entry-sql.cpp
@@ -40,6 +40,11 @@ extern "C"
 #include "gncInvoiceP.h"
 #include "gncTaxTableP.h"
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-bill-term-sql.h"
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index 41e601a..3c69f4c 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -41,6 +41,11 @@ extern "C"
 #include "gncBillTermP.h"
 #include "gncInvoiceP.h"
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-job-sql.cpp b/src/backend/sql/gnc-job-sql.cpp
index 3c79369..b01f02d 100644
--- a/src/backend/sql/gnc-job-sql.cpp
+++ b/src/backend/sql/gnc-job-sql.cpp
@@ -38,6 +38,10 @@ extern "C"
 #include "gncJobP.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-job-sql.h"
diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp
index a5806a6..4b12f5e 100644
--- a/src/backend/sql/gnc-lots-sql.cpp
+++ b/src/backend/sql/gnc-lots-sql.cpp
@@ -41,6 +41,11 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
diff --git a/src/backend/sql/gnc-object-backend.cpp b/src/backend/sql/gnc-object-backend.cpp
new file mode 100644
index 0000000..a27283c
--- /dev/null
+++ b/src/backend/sql/gnc-object-backend.cpp
@@ -0,0 +1,86 @@
+/***********************************************************************\
+ * gnc-sql-object-backend.hpp: Encapsulate per-class table schema.     *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+extern "C"
+{
+#include <config.h>
+}
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
+
+bool
+GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
+{
+    const GncGUID* guid;
+    gboolean is_infant;
+    E_DB_OPERATION op;
+    gboolean is_ok;
+
+    is_infant = qof_instance_get_infant (inst);
+    if (qof_instance_get_destroying (inst))
+    {
+        op = OP_DB_DELETE;
+    }
+    else if (sql_be->pristine() || is_infant)
+    {
+        op = OP_DB_INSERT;
+    }
+    else
+    {
+        op = OP_DB_UPDATE;
+    }
+    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
+                                     m_type_name.c_str(), inst, m_col_table);
+
+    if (is_ok)
+    {
+        // Now, commit any slots
+        guid = qof_instance_get_guid (inst);
+        if (!qof_instance_get_destroying (inst))
+        {
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
+        }
+        else
+        {
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
+        }
+    }
+
+    return is_ok;
+}
+
+void
+GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
+{
+    g_return_if_fail (sql_be != nullptr);
+    int version = sql_be->get_table_version (m_table_name);
+    if (version == 0) //No tables, otherwise version will sql_be >= 1.
+    {
+        sql_be->create_table(m_table_name, m_col_table);
+        sql_be->set_table_version(m_table_name, m_version);
+    }
+    else if (version != m_version)
+        PERR("Version mismatch in table %s, expecting %d but backend is %d."
+             "Table creation aborted.", m_table_name.c_str(), m_version, version);
+}
diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp
index 8ea3970..6edc387 100644
--- a/src/backend/sql/gnc-order-sql.cpp
+++ b/src/backend/sql/gnc-order-sql.cpp
@@ -38,6 +38,11 @@ extern "C"
 #include <string.h>
 #include "gncOrderP.h"
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-order-sql.h"
diff --git a/src/backend/sql/gnc-owner-sql.cpp b/src/backend/sql/gnc-owner-sql.cpp
index 6c0d178..69f32fa 100644
--- a/src/backend/sql/gnc-owner-sql.cpp
+++ b/src/backend/sql/gnc-owner-sql.cpp
@@ -30,17 +30,19 @@
 #include <guid.hpp>
 extern "C"
 {
-#include "config.h"
-
+#include <config.h>
+#include <qof.h>
 #include <glib.h>
-#include <stdlib.h>
-#include <string.h>
 #include "gncCustomerP.h"
 #include "gncJobP.h"
 #include "gncEmployeeP.h"
 #include "gncVendorP.h"
 }
-#include "gnc-backend-sql.h"
+#include <cstdlib>
+#include <cstring>
+#include <sstream>
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 
 static QofLogModule log_module = G_LOG_DOMAIN;
 
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 386dec4..11c72b3 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -38,8 +38,12 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
-#include "gnc-backend-sql.h"
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
+#include "gnc-backend-sql.h"
 #include "gnc-commodity-sql.h"
 #include "gnc-price-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp
index 0fa83c7..05de779 100644
--- a/src/backend/sql/gnc-recurrence-sql.cpp
+++ b/src/backend/sql/gnc-recurrence-sql.cpp
@@ -40,6 +40,10 @@ extern "C"
 #endif
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-recurrence-sql.h"
 
diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp
index 326cf83..563f9b3 100644
--- a/src/backend/sql/gnc-schedxaction-sql.cpp
+++ b/src/backend/sql/gnc-schedxaction-sql.cpp
@@ -41,6 +41,10 @@ extern "C"
 #endif
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-schedxaction-sql.h"
 #include "gnc-slots-sql.h"
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index b87c641..d9912ee 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -39,6 +39,11 @@ extern "C"
 #include "splint-defs.h"
 #endif
 }
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 
diff --git a/src/backend/sql/gnc-sql-backend.cpp b/src/backend/sql/gnc-sql-backend.cpp
new file mode 100644
index 0000000..8d169b3
--- /dev/null
+++ b/src/backend/sql/gnc-sql-backend.cpp
@@ -0,0 +1,340 @@
+/********************************************************************
+ * gnc-sql-backend.cpp: Implementation of GncSqlBackend             *
+ *                                                                  *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                   *
+ *                                                                  *
+ * This program is free software; you can redistribute it and/or    *
+ * modify it under the terms of the GNU General Public License as   *
+ * published by the Free Software Foundation; either version 2 of   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+\********************************************************************/
+extern "C"
+{
+#include <config.h>
+#include <gnc-prefs.h>
+}
+
+#include <algorithm>
+
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
+#include "gnc-sql-result.hpp"
+#include "gnc-backend-sql.h"
+
+static QofLogModule log_module = G_LOG_DOMAIN;
+#define VERSION_TABLE_NAME "versions"
+#define MAX_TABLE_NAME_LEN 50
+#define TABLE_COL_NAME "table_name"
+#define VERSION_COL_NAME "table_version"
+
+static EntryVec version_table
+{
+    gnc_sql_make_table_entry<CT_STRING>(
+        TABLE_COL_NAME, MAX_TABLE_NAME_LEN, COL_PKEY | COL_NNUL),
+    gnc_sql_make_table_entry<CT_INT>(VERSION_COL_NAME, 0, COL_NNUL)
+};
+
+GncSqlBackend::GncSqlBackend(GncSqlConnection *conn, QofBook* book,
+                             const char* format) :
+    qof_be {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+            nullptr, nullptr, nullptr, nullptr, ERR_BACKEND_NO_ERR, nullptr, 0,
+            nullptr}, m_conn{conn}, m_book{book}, m_loading{false},
+        m_in_query{false}, m_is_pristine_db{false}, m_timespec_format{format}
+{
+    if (conn != nullptr)
+        connect (conn);
+}
+
+void
+GncSqlBackend::connect(GncSqlConnection *conn) noexcept
+{
+    if (m_conn != nullptr && m_conn != conn)
+        delete m_conn;
+    finalize_version_info();
+    m_conn = conn;
+}
+
+GncSqlStatementPtr
+GncSqlBackend::create_statement_from_sql(const std::string& str) const noexcept
+{
+    auto stmt = m_conn->create_statement_from_sql(str);
+    if (stmt == nullptr)
+    {
+        PERR ("SQL error: %s\n", str.c_str());
+        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
+    }
+    return stmt;
+}
+
+GncSqlResultPtr
+GncSqlBackend::execute_select_statement(const GncSqlStatementPtr& stmt) const noexcept
+{
+    auto result = m_conn->execute_select_statement(stmt);
+    if (result == nullptr)
+    {
+        PERR ("SQL error: %s\n", stmt->to_sql());
+        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
+    }
+    return result;
+}
+
+int
+GncSqlBackend::execute_nonselect_statement(const GncSqlStatementPtr& stmt) const noexcept
+{
+    auto result = m_conn->execute_nonselect_statement(stmt);
+    if (result == -1)
+    {
+        PERR ("SQL error: %s\n", stmt->to_sql());
+        qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
+    }
+    return result;
+}
+
+std::string
+GncSqlBackend::quote_string(const std::string& str) const noexcept
+{
+    return m_conn->quote_string(str);
+}
+
+bool
+GncSqlBackend::create_table(const std::string& table_name,
+                            const EntryVec& col_table) const noexcept
+{
+    ColVec info_vec;
+    gboolean ok = FALSE;
+
+    for (auto const& table_row : col_table)
+    {
+        table_row->add_to_table (this, info_vec);
+    }
+    return m_conn->create_table (table_name, info_vec);
+
+}
+
+bool
+GncSqlBackend::create_table(const std::string& table_name, int table_version,
+                            const EntryVec& col_table) noexcept
+{
+    if (create_table (table_name, col_table))
+        return set_table_version (table_name, table_version);
+    return false;
+}
+
+bool
+GncSqlBackend::create_index(const std::string& index_name,
+                            const std::string& table_name,
+                            const EntryVec& col_table) const noexcept
+{
+    return m_conn->create_index(index_name, table_name, col_table);
+}
+
+bool
+GncSqlBackend::add_columns_to_table(const std::string& table_name,
+                                    const EntryVec& col_table) const noexcept
+{
+    ColVec info_vec;
+
+    for (auto const& table_row : col_table)
+    {
+        table_row->add_to_table (this, info_vec);
+    }
+    return m_conn->add_columns_to_table(table_name, info_vec);
+}
+
+void
+GncSqlBackend::update_progress() const noexcept
+{
+    if (qof_be.percentage != nullptr)
+        (qof_be.percentage) (nullptr, 101.0);
+}
+
+void
+GncSqlBackend::finish_progress() const noexcept
+{
+    if (qof_be.percentage != nullptr)
+        (qof_be.percentage) (nullptr, -1.0);
+}
+
+/**
+ * Sees if the version table exists, and if it does, loads the info into
+ * the version hash table.  Otherwise, it creates an empty version table.
+ *
+ * @param be Backend struct
+ */
+void
+GncSqlBackend::init_version_info() noexcept
+{
+
+    if (m_conn->does_table_exist (VERSION_TABLE_NAME))
+    {
+        std::string sql {"SELECT * FROM "};
+        sql += VERSION_TABLE_NAME;
+        auto stmt = m_conn->create_statement_from_sql(sql);
+        auto result = m_conn->execute_select_statement (stmt);
+        for (const auto& row : *result)
+        {
+            auto name = row.get_string_at_col (TABLE_COL_NAME);
+            unsigned int version = row.get_int_at_col (VERSION_COL_NAME);
+            m_versions.push_back(std::make_pair(name, version));
+        }
+    }
+    else
+    {
+        create_table (VERSION_TABLE_NAME, version_table);
+        set_table_version("Gnucash", gnc_prefs_get_long_version ());
+        set_table_version("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
+    }
+}
+
+/**
+ * Resets the version table information by removing all version table info.
+ * It also recreates the version table in the db.
+ *
+ * @param be Backend struct
+ * @return TRUE if successful, FALSE if error
+ */
+bool
+GncSqlBackend::reset_version_info() noexcept
+{
+    bool ok = true;
+    if (!m_conn->does_table_exist (VERSION_TABLE_NAME))
+        ok = create_table (VERSION_TABLE_NAME, version_table);
+    m_versions.clear();
+    set_table_version ("Gnucash", gnc_prefs_get_long_version ());
+    set_table_version ("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
+    return ok;
+}
+
+/**
+ * Finalizes the version table info by destroying the hash table.
+ *
+ * @param be Backend struct
+ */
+void
+GncSqlBackend::finalize_version_info() noexcept
+{
+    m_versions.clear();
+}
+
+unsigned int
+GncSqlBackend::get_table_version(const std::string& table_name) const noexcept
+{
+    /* If the db is pristine because it's being saved, the table does not exist. */
+    if (m_is_pristine_db)
+        return 0;
+
+    auto version = std::find_if(m_versions.begin(), m_versions.end(),
+                                [table_name](const VersionPair& version) {
+                                    return version.first == table_name; });
+    if (version != m_versions.end())
+        return version->second;
+    return 0;
+}
+
+/**
+ * Registers the version for a table.  Registering involves updating the
+ * db version table and also the hash table.
+ *
+ * @param be Backend struct
+ * @param table_name Table name
+ * @param version Version number
+ * @return TRUE if successful, FALSE if unsuccessful
+ */
+bool
+GncSqlBackend::set_table_version (const std::string& table_name,
+                                  uint_t version) noexcept
+{
+    g_return_val_if_fail (version > 0, false);
+
+    unsigned int cur_version{0};
+    std::stringstream sql;
+    auto ver_entry = std::find_if(m_versions.begin(), m_versions.end(),
+                                [table_name](const VersionPair& ver) {
+                                    return ver.first == table_name; });
+    if (ver_entry != m_versions.end())
+        cur_version = ver_entry->second;
+    if (cur_version != version)
+    {
+        if (cur_version == 0)
+        {
+            sql << "INSERT INTO " << VERSION_TABLE_NAME << " VALUES('" <<
+                table_name << "'," << version <<")";
+            m_versions.push_back(std::make_pair(table_name, version));
+        }
+        else
+        {
+            sql << "UPDATE " <<  VERSION_TABLE_NAME << " SET " <<
+                VERSION_COL_NAME << "=" << version << " WHERE " <<
+                TABLE_COL_NAME << "='" << table_name << "'";
+            ver_entry->second = version;
+        }
+        auto stmt = create_statement_from_sql(sql.str());
+        auto status = execute_nonselect_statement (stmt);
+        if (status == -1)
+        {
+            PERR ("SQL error: %s\n", sql.str().c_str());
+            qof_backend_set_error ((QofBackend*)this, ERR_BACKEND_SERVER_ERR);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+void
+GncSqlBackend::upgrade_table (const std::string& table_name,
+                              const EntryVec& col_table) noexcept
+{
+    DEBUG ("Upgrading %s table\n", table_name.c_str());
+
+    auto temp_table_name = table_name + "_new";
+    create_table (temp_table_name, col_table);
+    std::stringstream sql;
+    sql << "INSERT INTO " << temp_table_name << " SELECT * FROM " << table_name;
+    auto stmt = create_statement_from_sql(sql.str());
+    execute_nonselect_statement(stmt);
+
+    sql.str("");
+    sql << "DROP TABLE " << table_name;
+    stmt = create_statement_from_sql(sql.str());
+    execute_nonselect_statement(stmt);
+
+    sql.str("");
+    sql << "ALTER TABLE " << temp_table_name << " RENAME TO " << table_name;
+    stmt = create_statement_from_sql(sql.str());
+    execute_nonselect_statement(stmt);
+}
+
+/* This is required because we're passing be->timespace_format to
+ * g_strdup_printf.
+ */
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+std::string
+GncSqlBackend::time64_to_string (time64 t) const noexcept
+{
+    auto tm = gnc_gmtime (&t);
+
+    auto year = tm->tm_year + 1900;
+
+    auto datebuf = g_strdup_printf (m_timespec_format,
+                                    year, tm->tm_mon + 1, tm->tm_mday,
+                                    tm->tm_hour, tm->tm_min, tm->tm_sec);
+    gnc_tm_free (tm);
+    std::string date{datebuf};
+    g_free(datebuf);
+    return date;
+}
diff --git a/src/backend/sql/gnc-sql-backend.hpp b/src/backend/sql/gnc-sql-backend.hpp
new file mode 100644
index 0000000..522eac1
--- /dev/null
+++ b/src/backend/sql/gnc-sql-backend.hpp
@@ -0,0 +1,181 @@
+/***********************************************************************\
+ * gnc-sql-backend.hpp: Qof Backend for SQL Databases                  *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+#ifndef __GNC_SQL_BACKEND_HPP__
+#define __GNC_SQL_BACKEND_HPP__
+
+extern "C"
+{
+#include <qof.h>
+#include <qofbackend-p.h>
+#include <Account.h>
+}
+#include <memory>
+#include <exception>
+#include <sstream>
+#include <vector>
+class GncSqlColumnTableEntry;
+using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
+using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
+class GncSqlObjectBackend;
+using GncSqlObjectBackendPtr = GncSqlObjectBackend*;
+using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
+using OBEVec = std::vector<OBEEntry>;
+class GncSqlConnection;
+class GncSqlStatement;
+using GncSqlStatementPtr = std::unique_ptr<GncSqlStatement>;
+class GncSqlResult;
+using GncSqlResultPtr = GncSqlResult*;
+using VersionPair = std::pair<const std::string, unsigned int>;
+using VersionVec = std::vector<VersionPair>;
+using uint_t = unsigned int;
+
+/**
+ *
+ * Main SQL backend structure.
+ */
+class GncSqlBackend
+{
+public:
+    GncSqlBackend(GncSqlConnection *conn, QofBook* book,
+                  const char* format = nullptr);
+    virtual ~GncSqlBackend() = default;
+    /** Connect the backend to a GncSqlConnection.
+     * Sets up version info. Calling with nullptr clears the connection and
+     * destroys the version info.
+     */
+    void connect(GncSqlConnection *conn) noexcept;
+    /**
+     * Initializes DB table version information.
+     */
+    void init_version_info() noexcept;
+    bool reset_version_info() noexcept;
+    /**
+     * Finalizes DB table version information.
+     */
+    void finalize_version_info() noexcept;
+    /* FIXME: These are just pass-throughs of m_conn functions. */
+    GncSqlStatementPtr create_statement_from_sql(const std::string& str) const noexcept;
+    /** Executes an SQL SELECT statement and returns the result rows.  If an
+     * error occurs, an entry is added to the log, an error status is returned
+     * to qof and nullptr is returned.
+     *
+     * @param statement Statement
+     * @return Results, or nullptr if an error has occured
+     */
+    GncSqlResultPtr execute_select_statement(const GncSqlStatementPtr& stmt) const noexcept;
+    int execute_nonselect_statement(const GncSqlStatementPtr& stmt) const noexcept;
+    std::string quote_string(const std::string&) const noexcept;
+    /**
+     * Creates a table in the database
+     *
+     * @param table_name Table name
+     * @param col_table DB table description
+     * @return TRUE if successful, FALSE if unsuccessful
+     */
+    bool create_table(const std::string& table_name, const EntryVec& col_table) const noexcept;
+    /**
+     * Creates a table in the database and sets its version
+     *
+     * @param table_name Table name
+     * @param table_version Table version
+     * @param col_table DB table description
+     * @return TRUE if successful, FALSE if unsuccessful
+     */
+    bool create_table(const std::string& table_name, int table_version,
+                      const EntryVec& col_table) noexcept;
+    /**
+     * Create/update all tables in the database
+     */
+    void create_tables() noexcept;
+
+    /**
+     * Creates an index in the database
+     *
+     * @param index_name Index name
+     * @param table_name Table name
+     * @param col_table Columns that the index should index
+     * @return TRUE if successful, FALSE if unsuccessful
+     */
+    bool create_index(const std::string& index_name,
+                      const std::string& table_name,
+                      const EntryVec& col_table) const noexcept;
+    /**
+     * Adds one or more columns to an existing table.
+     *
+     * @param table_name SQL table name
+     * @param new_col_table Column table for new columns
+     * @return TRUE if successful, FALSE if unsuccessful
+     */
+    bool add_columns_to_table(const std::string& table_name,
+                              const EntryVec& col_table) const noexcept;
+    /**
+     * Upgrades a table to a new structure.
+     *
+     * The upgrade is done by creating a new table with the new structure,
+     * SELECTing the old data into the new table, deleting the old table, then
+     * renaming the new table.  Therefore, this will only work if the new table
+     * structure is similar enough to the old table that the SELECT will work.
+     *
+     * @param table_name SQL table name
+     * @param col_table Column table
+     */
+    void upgrade_table (const std::string& table_name,
+                        const EntryVec& col_table) noexcept;
+    /**
+     * Returns the version number for a DB table.
+     *
+     * @param table_name Table name
+     * @return Version number, or 0 if the table does not exist
+     */
+    uint_t get_table_version(const std::string& table_name) const noexcept;
+    bool set_table_version (const std::string& table_name, uint_t version) noexcept;
+    /**
+     * Converts a time64 value to a string value for the database.
+     *
+     * @param t time64 to be converted.
+     * @return String representation of the Timespec
+     */
+    std::string time64_to_string (time64 t) const noexcept;
+    QofBook* book() const noexcept { return m_book; }
+    void set_loading(bool loading) noexcept { m_loading = loading; }
+    bool pristine() const noexcept { return m_is_pristine_db; }
+    void update_progress() const noexcept;
+    void finish_progress() const noexcept;
+
+    friend void gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book, QofBackendLoadType loadType);
+    friend void gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book);
+    friend void gnc_sql_commit_edit (GncSqlBackend* sql_be, QofInstance* inst);
+
+ protected:
+    QofBackend qof_be;           /**< QOF backend. Not a pointer, nor really a member */
+    GncSqlConnection* m_conn;  /**< SQL connection */
+    QofBook* m_book;           /**< The primary, main open book */
+    bool m_loading;        /**< We are performing an initial load */
+    bool m_in_query;       /**< We are processing a query */
+    bool m_is_pristine_db; /**< Are we saving to a new pristine db? */
+    const char* m_timespec_format; /**< Server-specific date-time string format */
+    VersionVec m_versions;    /**< Version number for each table */
+};
+
+#endif //__GNC_SQL_BACKEND_HPP__
diff --git a/src/backend/sql/gnc-sql-column-table-entry.cpp b/src/backend/sql/gnc-sql-column-table-entry.cpp
new file mode 100644
index 0000000..ea536a2
--- /dev/null
+++ b/src/backend/sql/gnc-sql-column-table-entry.cpp
@@ -0,0 +1,698 @@
+/********************************************************************
+ * gnc-sql-column-table-entry.cpp: Implement GncSqlColumnTableEntry *
+ *                                                                  *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                   *
+ *                                                                  *
+ * This program is free software; you can redistribute it and/or    *
+ * modify it under the terms of the GNU General Public License as   *
+ * published by the Free Software Foundation; either version 2 of   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+\********************************************************************/
+
+extern "C"
+{
+#include <config.h>
+#include <qof.h>
+}
+#include <sstream>
+#include <iomanip>
+
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
+#include "gnc-sql-result.hpp"
+#include "gnc-backend-sql.h"
+
+static QofLogModule log_module = G_LOG_DOMAIN;
+
+/* ================================================================= */
+static gpointer
+get_autoinc_id (void* object, const QofParam* param)
+{
+    // Just need a 0 to force a new autoinc value
+    return (gpointer)0;
+}
+
+static void
+set_autoinc_id (void* object, void* item)
+{
+    // Nowhere to put the ID
+}
+
+QofAccessFunc
+GncSqlColumnTableEntry::get_getter (QofIdTypeConst obj_name) const noexcept
+{
+    QofAccessFunc getter;
+
+    g_return_val_if_fail (obj_name != NULL, NULL);
+
+    if (m_flags & COL_AUTOINC)
+    {
+        getter = get_autoinc_id;
+    }
+    else if (m_qof_param_name != NULL)
+    {
+        getter = qof_class_get_parameter_getter (obj_name, m_qof_param_name);
+    }
+    else
+    {
+        getter = m_getter;
+    }
+
+    return getter;
+}
+
+QofSetterFunc
+GncSqlColumnTableEntry::get_setter(QofIdTypeConst obj_name) const noexcept
+{
+    QofSetterFunc setter = nullptr;
+    if (m_flags & COL_AUTOINC)
+    {
+        setter = set_autoinc_id;
+    }
+    else if (m_qof_param_name != nullptr)
+    {
+        g_assert (obj_name != NULL);
+        setter = qof_class_get_parameter_setter (obj_name, m_qof_param_name);
+    }
+    else
+    {
+        setter = m_setter;
+    }
+    return setter;
+}
+
+void
+GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* sql_be,
+                                                     QofIdTypeConst obj_name,
+                                                     const void* pObject,
+                                                     PairVec& vec) const noexcept
+{
+    auto inst = get_row_value_from_object<QofInstance*>(obj_name, pObject);
+    if (inst == nullptr) return;
+    auto guid = qof_instance_get_guid (inst);
+    if (guid != nullptr)
+        vec.emplace_back (std::make_pair (std::string{m_col_name},
+                                          std::string{guid_to_string(guid)}));
+}
+
+void
+GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* sql_be,
+                                                     ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+
+/* ----------------------------------------------------------------- */
+template<> void
+GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* sql_be,
+                                             GncSqlRow& row,
+                                             QofIdTypeConst obj_name,
+                                             gpointer pObject) const noexcept
+{
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
+
+    try
+    {
+        auto s = row.get_string_at_col (m_col_name);
+        set_parameter(pObject, s.c_str(), get_setter(obj_name), m_gobj_param_name);
+    }
+    catch (std::invalid_argument) {}
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* sql_be,
+                                                  ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_STRING, m_size, TRUE};
+    vec.emplace_back(std::move(info));
+}
+
+/* char is unusual in that we get a pointer but don't deref it to pass
+ * it to operator<<().
+ */
+template<> void
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    auto s = get_row_value_from_object<char*>(obj_name, pObject);
+
+    if (s != nullptr)
+    {
+        std::ostringstream stream;
+        stream << s;
+        vec.emplace_back (std::make_pair (std::string{m_col_name}, stream.str()));
+        return;
+    }
+}
+
+/* ----------------------------------------------------------------- */
+typedef gint (*IntAccessFunc) (const gpointer);
+typedef void (*IntSetterFunc) (const gpointer, gint);
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* sql_be,
+                                          GncSqlRow& row,
+                                          QofIdTypeConst obj_name,
+                                          gpointer pObject) const noexcept
+{
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
+
+    auto val = row.get_int_at_col(m_col_name);
+    set_parameter(pObject, val,
+                  reinterpret_cast<IntSetterFunc>(get_setter(obj_name)), m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
+}
+
+/* ----------------------------------------------------------------- */
+typedef gboolean (*BooleanAccessFunc) (const gpointer);
+typedef void (*BooleanSetterFunc) (const gpointer, gboolean);
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* sql_be,
+                                              GncSqlRow& row,
+                                              QofIdTypeConst obj_name,
+                                              gpointer pObject)
+    const noexcept
+{
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != NULL || get_setter(obj_name) != NULL);
+
+    auto val = row.get_int_at_col (m_col_name);
+    set_parameter(pObject, val,
+                  reinterpret_cast<BooleanSetterFunc>(get_setter(obj_name)),
+                  m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
+}
+
+/* ----------------------------------------------------------------- */
+typedef gint64 (*Int64AccessFunc) (const gpointer);
+typedef void (*Int64SetterFunc) (const gpointer, gint64);
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* sql_be,
+                                            GncSqlRow& row,
+                                            QofIdTypeConst obj_name,
+                                            gpointer pObject)
+    const noexcept
+{
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+
+    auto val = row.get_int_at_col (m_col_name);
+    set_parameter(pObject, val,
+                  reinterpret_cast<Int64SetterFunc>(get_setter(obj_name)),
+                  m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(const GncSqlBackend* sql_be,
+                                                   ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_INT64, 0, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(const GncSqlBackend* sql_be,
+                                                   QofIdTypeConst obj_name,
+                                                   const gpointer pObject,
+                                                   PairVec& vec) const noexcept
+{
+    add_value_to_vec<int64_t>(sql_be, obj_name, pObject, vec);
+}
+/* ----------------------------------------------------------------- */
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* sql_be,
+                                             GncSqlRow& row,
+                                             QofIdTypeConst obj_name,
+                                             gpointer pObject)
+    const noexcept
+{
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+    double val;
+    try
+    {
+        val = static_cast<double>(row.get_int_at_col(m_col_name));
+    }
+    catch (std::invalid_argument)
+    {
+        try
+        {
+            val = static_cast<double>(row.get_float_at_col(m_col_name));
+        }
+        catch (std::invalid_argument)
+        {
+            try
+            {
+                val = row.get_double_at_col(m_col_name);
+            }
+            catch (std::invalid_argument)
+            {
+                val = 0.0;
+            }
+        }
+    }
+    set_parameter(pObject, val, get_setter(obj_name), m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_DOUBLE, 0, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    add_value_to_vec<double*>(sql_be, obj_name, pObject, vec);
+}
+
+/* ----------------------------------------------------------------- */
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* sql_be,
+                                           GncSqlRow& row,
+                                           QofIdTypeConst obj_name,
+                                           gpointer pObject)
+    const noexcept
+{
+
+    GncGUID guid;
+    const GncGUID* pGuid;
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+
+    std::string str;
+    try
+    {
+        str = row.get_string_at_col(m_col_name);
+    }
+    catch (std::invalid_argument)
+    {
+        return;
+    }
+    (void)string_to_guid (str.c_str(), &guid);
+    set_parameter(pObject, &guid, get_setter(obj_name), m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    auto s = get_row_value_from_object<GncGUID*>(obj_name, pObject);
+
+    if (s != nullptr)
+    {
+
+        vec.emplace_back (std::make_pair (std::string{m_col_name},
+                                          std::string{guid_to_string(s)}));
+        return;
+    }
+}
+/* ----------------------------------------------------------------- */
+typedef Timespec (*TimespecAccessFunc) (const gpointer);
+typedef void (*TimespecSetterFunc) (const gpointer, Timespec*);
+
+#define TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
+#define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
+                                               GncSqlRow& row,
+                                               QofIdTypeConst obj_name,
+                                               gpointer pObject) const noexcept
+{
+
+    Timespec ts = {0, 0};
+    gboolean isOK = FALSE;
+
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+
+    try
+    {
+        auto val = row.get_time64_at_col(m_col_name);
+        timespecFromTime64 (&ts, val);
+    }
+    catch (std::invalid_argument)
+    {
+        try
+        {
+            auto val = row.get_string_at_col(m_col_name);
+            auto s = val.c_str();
+            auto buf = g_strdup_printf ("%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
+                                        s[0], s[1], s[2], s[3], s[4], s[5],
+                                        s[6], s[7], s[8], s[9], s[10], s[11],
+                                        s[12], s[13]);
+            ts = gnc_iso8601_to_timespec_gmt (buf);
+            g_free (buf);
+        }
+        catch (std::invalid_argument)
+        {
+            return;
+        }
+    }
+    set_parameter(pObject, &ts,
+                  reinterpret_cast<TimespecSetterFunc>(get_setter(obj_name)),
+                  m_gobj_param_name);
+ }
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != nullptr);
+
+    GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_be,
+                                                      QofIdTypeConst obj_name,
+                                                      const gpointer pObject,
+                                                      PairVec& vec) const noexcept
+{
+    TimespecAccessFunc ts_getter;
+    Timespec ts;
+/* Can't use get_row_value_from_object because g_object_get returns a
+ * Timespec* and the getter returns a Timespec. Will be fixed by the
+ * replacement of timespecs with time64s.
+ */
+    g_return_if_fail (sql_be != NULL);
+    g_return_if_fail (obj_name != NULL);
+    g_return_if_fail (pObject != NULL);
+
+    if (m_gobj_param_name != NULL)
+    {
+        Timespec* pts;
+        g_object_get (pObject, m_gobj_param_name, &pts, NULL);
+        ts = *pts;
+    }
+    else
+    {
+        ts_getter = (TimespecAccessFunc)get_getter (obj_name);
+        g_return_if_fail (ts_getter != NULL);
+        ts = (*ts_getter) (pObject);
+    }
+
+    if (ts.tv_sec != 0 || ts.tv_nsec != 0)
+    {
+        auto datebuf = sql_be->time64_to_string (ts.tv_sec);
+        vec.emplace_back (std::make_pair (std::string{m_col_name}, datebuf));
+        return;
+    }
+}
+
+/* ----------------------------------------------------------------- */
+#define DATE_COL_SIZE 8
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* sql_be,
+                                            GncSqlRow& row,
+                                            QofIdTypeConst obj_name,
+                                            gpointer pObject) const noexcept
+{
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+    if (row.is_col_null(m_col_name))
+        return;
+    GDate date;
+    g_date_clear (&date, 1);
+    try
+    {
+        /* timespec_to_gdate applies the tz, and gdates are saved
+         * as ymd, so we don't want that.
+         */
+        auto time = row.get_time64_at_col(m_col_name);
+        auto tm = gnc_gmtime(&time);
+        g_date_set_dmy(&date, tm->tm_mday,
+                       static_cast<GDateMonth>(tm->tm_mon + 1),
+                       tm->tm_year + 1900);
+        free(tm);
+    }
+    catch (std::invalid_argument)
+    {
+        try
+        {
+            std::string str = row.get_string_at_col(m_col_name);
+            if (str.empty()) return;
+            auto year = static_cast<GDateYear>(stoi (str.substr (0,4)));
+            auto month = static_cast<GDateMonth>(stoi (str.substr (4,2)));
+            auto day = static_cast<GDateDay>(stoi (str.substr (6,2)));
+
+            if (year != 0 || month != 0 || day != (GDateDay)0)
+                g_date_set_dmy(&date, day, month, year);
+
+        }
+        catch (std::invalid_argument)
+        {
+            return;
+        }
+    }
+    set_parameter(pObject, &date, get_setter(obj_name), m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(const GncSqlBackend* sql_be,
+                                                 ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    GncSqlColumnInfo info{*this,  BCT_DATE, DATE_COL_SIZE, FALSE};
+    vec.emplace_back(std::move(info));
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(const GncSqlBackend* sql_be,
+                                                    QofIdTypeConst obj_name,
+                                                    const gpointer pObject,
+                                                    PairVec& vec) const noexcept
+{
+    GDate *date = get_row_value_from_object<GDate*>(obj_name, pObject);
+
+    if (date && g_date_valid (date))
+    {
+        std::ostringstream buf;
+        buf << std::setfill ('0') << std::setw (4) << g_date_get_year (date) <<
+            std::setw (2) << g_date_get_month (date) <<
+            std::setw (2) << static_cast<int>(g_date_get_day (date));
+        vec.emplace_back (std::make_pair (std::string{m_col_name}, buf.str()));
+        return;
+    }
+}
+
+/* ----------------------------------------------------------------- */
+typedef gnc_numeric (*NumericGetterFunc) (const gpointer);
+typedef void (*NumericSetterFunc) (gpointer, gnc_numeric*);
+
+static const EntryVec numeric_col_table =
+{
+    gnc_sql_make_table_entry<CT_INT64>("num", 0, COL_NNUL, "guid"),
+    gnc_sql_make_table_entry<CT_INT64>("denom", 0, COL_NNUL, "guid")
+};
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* sql_be,
+                                              GncSqlRow& row,
+                                              QofIdTypeConst obj_name,
+                                              gpointer pObject) const noexcept
+{
+
+
+    g_return_if_fail (pObject != NULL);
+    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
+    gnc_numeric n;
+    try
+    {
+        auto buf = g_strdup_printf ("%s_num", m_col_name);
+        auto num = row.get_int_at_col (buf);
+        g_free (buf);
+        buf = g_strdup_printf ("%s_denom", m_col_name);
+        auto denom = row.get_int_at_col (buf);
+        n = gnc_numeric_create (num, denom);
+    }
+    catch (std::invalid_argument)
+    {
+        return;
+    }
+    set_parameter(pObject, &n,
+                  reinterpret_cast<NumericSetterFunc>(get_setter(obj_name)),
+                  m_gobj_param_name);
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* sql_be,
+                                                     ColVec& vec) const noexcept
+{
+    g_return_if_fail (sql_be != NULL);
+
+    for (auto const& subtable_row : numeric_col_table)
+    {
+        gchar* buf = g_strdup_printf("%s_%s", m_col_name,
+                                     subtable_row->m_col_name);
+        GncSqlColumnInfo info(buf, BCT_INT64, 0, false, false,
+                              m_flags & COL_PKEY, m_flags & COL_NNUL);
+        vec.emplace_back(std::move(info));
+    }
+}
+
+template<> void
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* sql_be,
+                                                     QofIdTypeConst obj_name,
+                                                     const gpointer pObject,
+                                                     PairVec& vec) const noexcept
+{
+/* We can't use get_row_value_from_object for the same reason as Timespec. */
+    NumericGetterFunc getter;
+    gnc_numeric n;
+
+    g_return_if_fail (sql_be != NULL);
+    g_return_if_fail (obj_name != NULL);
+    g_return_if_fail (pObject != NULL);
+
+    if (m_gobj_param_name != nullptr)
+    {
+        gnc_numeric* s;
+        g_object_get (pObject, m_gobj_param_name, &s, NULL);
+        n = *s;
+    }
+    else
+    {
+        getter = reinterpret_cast<NumericGetterFunc>(get_getter (obj_name));
+        if (getter != NULL)
+        {
+            n = (*getter) (pObject);
+        }
+        else
+        {
+            n = gnc_numeric_zero ();
+        }
+    }
+
+    std::ostringstream buf;
+    std::string num_col{m_col_name};
+    std::string denom_col{m_col_name};
+    num_col += "_num";
+    denom_col += "_denom";
+    buf << gnc_numeric_num (n);
+    vec.emplace_back (std::make_pair (num_col, buf.str ()));
+    buf.str ("");
+    buf << gnc_numeric_denom (n);
+    vec.emplace_back (denom_col, buf.str ());
+}
+
+
+/* This is necessary for 64-bit builds because g++ complains
+ * that reinterpret_casting a void* (64 bits) to an int (32 bits)
+ * loses precision, so we have to explicitly dispose of the precision.
+ * FIXME: We shouldn't be storing ints in ptrs in the first place.
+ */
+#ifdef __LP64__
+template <> int
+GncSqlColumnTableEntry::get_row_value_from_object<int>(QofIdTypeConst obj_name,
+                                                       const void* pObject,
+                                                       std::false_type) const
+{
+    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr, 0);
+    int result = 0;
+    if (m_gobj_param_name != nullptr)
+        g_object_get(const_cast<void*>(pObject), m_gobj_param_name, &result,
+		     nullptr);
+    else
+    {
+        QofAccessFunc getter = get_getter(obj_name);
+        if (getter != nullptr)
+        {
+            auto value = ((getter)(const_cast<void*>(pObject), nullptr));
+            result = reinterpret_cast<uint64_t>(value) &
+                UINT64_C(0x00000000FFFFFFFF);
+        }
+    }
+    return result;
+}
+#endif
diff --git a/src/backend/sql/gnc-sql-column-table-entry.hpp b/src/backend/sql/gnc-sql-column-table-entry.hpp
new file mode 100644
index 0000000..69710fd
--- /dev/null
+++ b/src/backend/sql/gnc-sql-column-table-entry.hpp
@@ -0,0 +1,483 @@
+/***********************************************************************\
+ * gnc-sql-column-table-entry.hpp: Column Specification for SQL Table. *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+#ifndef __GNC_SQL_COLUMN_TABLE_ENTRY_HPP__
+#define __GNC_SQL_COLUMN_TABLE_ENTRY_HPP__
+
+extern "C"
+{
+#include <qof.h>
+#include "qofbackend-p.h"
+}
+#include <memory>
+#include <vector>
+#include "gnc-sql-result.hpp"
+
+struct GncSqlColumnInfo;
+using ColVec = std::vector<GncSqlColumnInfo>;
+using PairVec = std::vector<std::pair<std::string, std::string>>;
+class GncSqlBackend;
+
+/**
+ * Basic column type
+ */
+typedef enum
+{
+    BCT_STRING,
+    BCT_INT,
+    BCT_INT64,
+    BCT_DATE,
+    BCT_DOUBLE,
+    BCT_DATETIME
+} GncSqlBasicColumnType;
+
+enum ColumnFlags : int
+{
+    COL_NO_FLAG = 0,
+    COL_PKEY = 0x01,    /**< The column is a primary key */
+    COL_NNUL = 0x02,    /**< The column may not contain a NULL value */
+    COL_UNIQUE = 0x04,  /**< The column must contain unique values */
+    COL_AUTOINC = 0x08  /**< The column is an auto-incrementing int */
+};
+
+// Type for conversion of db row to object.
+enum GncSqlObjectType
+{
+    CT_STRING,
+    CT_GUID,
+    CT_INT,
+    CT_INT64,
+    CT_TIMESPEC,
+    CT_GDATE,
+    CT_NUMERIC,
+    CT_DOUBLE,
+    CT_BOOLEAN,
+    CT_ACCOUNTREF,
+    CT_BUDGETREF,
+    CT_COMMODITYREF,
+    CT_LOTREF,
+    CT_TXREF,
+    CT_ADDRESS,
+    CT_BILLTERMREF,
+    CT_INVOICEREF,
+    CT_ORDERREF,
+    CT_OWNERREF,
+    CT_TAXTABLEREF
+};
+
+/**
+ * Contains all of the information required to copy information between an
+ * object and the database for a specific object property.
+ *
+ * If an entry contains a gobj_param_name value, this string is used as the
+ * property name for a call to g_object_get() or g_object_set().  If the
+ * gobj_param_name value is NULL but qof_param_name is not NULL, this value
+ * is used as the parameter name for a call to
+ * qof_class_get_parameter_getter().  If both of these values are NULL, getter
+ * and setter are the addresses of routines to return or set the parameter
+ * value, respectively.
+ *
+ * The database description for an object consists of an array of
+ * GncSqlColumnTableEntry objects, with a final member having col_name == NULL.
+ */
+
+class GncSqlColumnTableEntry
+{
+public:
+    GncSqlColumnTableEntry (const char* name, const GncSqlObjectType type,
+                            unsigned int s,
+                            int f, const char* gobj_name = nullptr,
+                            const char* qof_name = nullptr,
+                            QofAccessFunc get = nullptr,
+                            QofSetterFunc set = nullptr) :
+        m_col_name{name}, m_col_type{type}, m_size{s},
+        m_flags{static_cast<ColumnFlags>(f)},
+        m_gobj_param_name{gobj_name}, m_qof_param_name{qof_name}, m_getter{get},
+        m_setter{set} {}
+
+    /**
+     * Load a value into an object from the database row.
+     */
+    virtual void load(const GncSqlBackend* sql_be, GncSqlRow& row,
+                      QofIdTypeConst obj_name, void* pObject) const noexcept = 0;
+    /**
+     * Add a GncSqlColumnInfo structure for the column type to a
+     * ColVec.
+     */
+    virtual void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept = 0;
+    /**
+     * Add a pair of the table column heading and object's value's string
+     * representation to a PairVec; used for constructing WHERE clauses and
+     * UPDATE statements.
+     */
+    virtual void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+                              void* pObject, PairVec& vec) const noexcept = 0;
+    /**
+     * Retrieve the getter function depending on whether it's an auto-increment
+     * field, a QofClass getter, or a function passed to the constructor.
+     */
+    QofAccessFunc get_getter(QofIdTypeConst obj_name) const noexcept;
+    /**
+     * Retrieve the setter function depending on whether it's an auto-increment
+     * field, a QofClass getter, or a function passed to the constructor.
+     */
+    QofSetterFunc get_setter(QofIdTypeConst obj_name) const noexcept;
+    /**
+     * Retrieve the field name so that we don't need to make
+     * create_single_col_select_statement and friend.
+     */
+    const char* name() const noexcept { return m_col_name; }
+    /**
+     * Report if the entry is an auto-increment field.
+     */
+    bool is_autoincr() const noexcept { return m_flags & COL_AUTOINC; }
+    /* On the other hand, our implementation class and GncSqlColumnInfo need to
+     * be able to read our member variables.
+     */
+    template<GncSqlObjectType Otype> friend class GncSqlColumnTableEntryImpl;
+    friend struct GncSqlColumnInfo;
+    template<typename T> void load_from_guid_ref(GncSqlRow& row,
+                                                 QofIdTypeConst obj_name,
+                                                 void* pObject, T get_ref)
+        const noexcept
+        {
+            g_return_if_fail (pObject != NULL);
+
+            try
+            {
+                GncGUID guid;
+                auto val = row.get_string_at_col (m_col_name);
+                (void)string_to_guid (val.c_str(), &guid);
+                auto target = get_ref(&guid);
+                if (target != nullptr)
+                    set_parameter (pObject, target, get_setter(obj_name),
+                                   m_gobj_param_name);
+            }
+            catch (std::invalid_argument) {}
+        }
+
+protected:
+    template <typename T> T
+    get_row_value_from_object(QofIdTypeConst obj_name, const void* pObject) const;
+    template <typename T> void
+    add_value_to_vec(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+                     const void* pObject, PairVec& vec) const;
+/**
+ * Adds a name/guid std::pair to a PairVec for creating a query.
+ *
+ * @param sql_be SQL backend struct
+ * @param obj_name QOF object type name
+ * @param pObject Object
+ * @param pList List
+ */
+    void add_objectref_guid_to_query (const GncSqlBackend* sql_be,
+                                      QofIdTypeConst obj_name,
+                                      const void* pObject,
+                                      PairVec& vec) const noexcept;
+/**
+ * Adds a column info structure for an object reference GncGUID to a ColVec.
+ *
+ * @param sql_be SQL backend struct
+ * @param pList List
+ */
+    void add_objectref_guid_to_table (const GncSqlBackend* sql_be,
+                                      ColVec& vec) const noexcept;
+private:
+    const char* m_col_name;        /**< Column name */
+    const GncSqlObjectType m_col_type;        /**< Column type */
+    unsigned int m_size;       /**< Column size in bytes, for string columns */
+    ColumnFlags m_flags;           /**< Column flags */
+    const char* m_gobj_param_name; /**< If non-null, g_object param name */
+    const char* m_qof_param_name;  /**< If non-null, qof parameter name */
+    QofAccessFunc m_getter;        /**< General access function */
+    QofSetterFunc m_setter;        /**< General setter function */
+    template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
+                                                      const void* pObject,
+                                                      std::true_type) const;
+    template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
+                                                      const void* pObject,
+                                                      std::false_type) const;
+    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
+                                                QofIdTypeConst obj_name,
+                                                const void* pObject,
+                                                PairVec& vec, std::true_type) const;
+    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
+                                                QofIdTypeConst obj_name,
+                                                const void* pObject,
+                                                PairVec& vec, std::false_type) const;
+
+};
+
+template <GncSqlObjectType Type>
+class GncSqlColumnTableEntryImpl : public GncSqlColumnTableEntry
+{
+public:
+    GncSqlColumnTableEntryImpl (const char* name, const GncSqlObjectType type,
+                                unsigned int s,
+                                int f, const char* gobj_name = nullptr,
+                                const char* qof_name = nullptr,
+                                QofAccessFunc get = nullptr,
+                                QofSetterFunc set = nullptr) :
+        GncSqlColumnTableEntry (name, type, s, f, gobj_name,qof_name, get, set)
+        {}
+    void load(const GncSqlBackend* sql_be, GncSqlRow& row,  QofIdTypeConst obj_name,
+              void* pObject) const noexcept override;
+    void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept override;
+    void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
+                      void* pObject, PairVec& vec) const noexcept override;
+};
+
+using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
+using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
+
+template <GncSqlObjectType Type>
+std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
+gnc_sql_make_table_entry(const char* name, unsigned int s, int f)
+{
+    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s, f);
+}
+
+template <GncSqlObjectType Type>
+std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
+gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
+                         const char* param)
+{
+    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
+                                                              f, param);
+}
+
+class is_qof : public std::true_type {};
+
+template <GncSqlObjectType Type>
+std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
+gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
+                         const char* param, bool qofp)
+{
+    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
+                                                              f, nullptr,
+                                                              param);
+}
+
+template <GncSqlObjectType Type>
+std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
+gnc_sql_make_table_entry(const char* name, unsigned int s, int f,
+                         QofAccessFunc get, QofSetterFunc set)
+{
+    return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(
+        name, Type, s, f, nullptr, nullptr, get, set);
+}
+
+
+template <typename T> T
+GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
+                                                  const void* pObject) const
+{
+    return get_row_value_from_object<T>(obj_name, pObject,
+                                        std::is_pointer<T>());
+}
+
+template <typename T> T
+GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
+                                                  const void* pObject,
+                                                  std::true_type) const
+{
+    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr, nullptr);
+    T result = nullptr;
+    if (m_gobj_param_name != nullptr)
+        g_object_get(const_cast<void*>(pObject), m_gobj_param_name,
+                     &result, nullptr);
+    else
+    {
+        QofAccessFunc getter = get_getter(obj_name);
+        if (getter != nullptr)
+            result = reinterpret_cast<T>((getter)(const_cast<void*>(pObject),
+                                                  nullptr));
+    }
+    return result;
+}
+
+template <typename T> T
+GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
+                                                  const void* pObject,
+                                                  std::false_type) const
+{
+    g_return_val_if_fail(obj_name != nullptr && pObject != nullptr,
+                         static_cast<T>(0));
+    T result = static_cast<T>(0);
+    if (m_gobj_param_name != nullptr)
+        g_object_get(const_cast<void*>(pObject), m_gobj_param_name,
+                     &result, nullptr);
+    else
+    {
+        QofAccessFunc getter = get_getter(obj_name);
+        if (getter != nullptr)
+            result = reinterpret_cast<T>((getter)(const_cast<void*>(pObject),
+                                                  nullptr));
+    }
+    return result;
+}
+
+template <typename T> void
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
+                                         QofIdTypeConst obj_name,
+                                         const void* pObject,
+                                         PairVec& vec) const
+{
+    add_value_to_vec<T>(sql_be, obj_name, pObject, vec, std::is_pointer<T>());
+}
+
+template <typename T> void
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
+                                         QofIdTypeConst obj_name,
+                                         const void* pObject,
+                                         PairVec& vec, std::true_type) const
+{
+    T s = get_row_value_from_object<T>(obj_name, pObject);
+
+    if (s != nullptr)
+    {
+        std::ostringstream stream;
+        stream << *s;
+        vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
+        return;
+    }
+}
+
+template <typename T> void
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
+                                         QofIdTypeConst obj_name,
+                                         const void* pObject,
+                                         PairVec& vec, std::false_type) const
+{
+    T s = get_row_value_from_object<T>(obj_name, pObject);
+
+    std::ostringstream stream;
+    stream << s;
+    vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
+    return;
+}
+
+/**
+ *  information required to create a column in a table.
+ */
+struct GncSqlColumnInfo
+{
+    GncSqlColumnInfo (std::string&& name, GncSqlBasicColumnType type,
+                      unsigned int size = 0, bool unicode = false,
+                      bool autoinc = false, bool primary = false,
+                      bool not_null = false) :
+        m_name{name}, m_type{type}, m_size{size}, m_unicode{unicode},
+        m_autoinc{autoinc}, m_primary_key{primary}, m_not_null{not_null}
+        {}
+    GncSqlColumnInfo(const GncSqlColumnTableEntry& e, GncSqlBasicColumnType t,
+                     unsigned int size = 0, bool unicode = true) :
+        m_name{e.m_col_name}, m_type{t}, m_size{size}, m_unicode{unicode},
+        m_autoinc(e.m_flags & COL_AUTOINC),
+        m_primary_key(e.m_flags & COL_PKEY),
+        m_not_null(e.m_flags & COL_NNUL) {}
+    std::string m_name; /**< Column name */
+    GncSqlBasicColumnType m_type; /**< Column basic type */
+    unsigned int m_size; /**< Column size (string types) */
+    bool m_unicode; /**< Column is unicode (string types) */
+    bool m_autoinc; /**< Column is autoinc (int type) */
+    bool m_primary_key; /**< Column is the primary key */
+    bool m_not_null; /**< Column forbids NULL values */
+};
+
+inline bool operator==(const GncSqlColumnInfo& l,
+                       const GncSqlColumnInfo& r)
+{
+    return l.m_name == r.m_name && l.m_type == r.m_type;
+}
+
+inline bool operator!=(const GncSqlColumnInfo& l,
+                       const GncSqlColumnInfo& r)
+{
+    return !(l == r);
+}
+
+/**
+ * Set an object property with a setter function.
+ * @param pObject void* to the object being set.
+ * @param item the value to be set in the property.
+ * @param setter The function to set the property.
+ * The void* is an obvious wart occasioned by the fact that we're using GLists
+ * to hold objects. As the rewrite progresses we'll replace that with another
+ * template paramter.
+ */
+template <typename T, typename P, typename F>
+void set_parameter(T object, P item, F& setter)
+{
+    (*setter)(object, item);
+}
+
+template <typename T, typename P>
+void set_parameter(T object, P item, QofSetterFunc setter, std::true_type)
+{
+    (*setter)(object, (void*)item);
+}
+
+template <typename T, typename P>
+void set_parameter(T object, P item, QofSetterFunc setter, std::false_type)
+{
+    (*setter)(object, (void*)(&item));
+}
+
+template <typename T, typename P>
+void set_parameter(T object, P item, QofSetterFunc setter)
+{
+    set_parameter(object, item, setter, std::is_pointer<P>());
+}
+
+/**
+ * Set an object property with g_object_set.
+ * @param pObject void* to the object being set.
+ * @param item the value to set in the property.
+ * @param property the property name.
+ * The void* is an obvious wart. So is g_object_set, partly because it's GObject
+ * but mostly because it works off of string comparisons.
+ */
+template <typename T, typename P>
+void set_parameter(T object, P item, const char* property)
+{
+    qof_instance_increase_editlevel(object);
+    g_object_set(object, property, item, nullptr);
+    qof_instance_decrease_editlevel(object);
+};
+
+/**
+ * Set an object property with either a g_object_set or a setter.
+ *
+ * See previous templates for the parameter meanings. This is clunky but fits in
+ * the current architecture for refactoring.
+ */
+template <typename T, typename P, typename F>
+void set_parameter(T object, P item, F setter, const char* property)
+{
+    if (property)
+        set_parameter(object, item, property);
+    else
+        set_parameter(object, item, setter);
+}
+
+#endif //__GNC_SQL_COLUMN_TABLE_ENTRY_HPP__
diff --git a/src/backend/sql/gnc-sql-connection.hpp b/src/backend/sql/gnc-sql-connection.hpp
new file mode 100644
index 0000000..1522f47
--- /dev/null
+++ b/src/backend/sql/gnc-sql-connection.hpp
@@ -0,0 +1,103 @@
+/***********************************************************************\
+ * gnc-sql-connection.hpp: Encapsulate a SQL database connection.      *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+#ifndef __GNC_SQL_CONNECTION_HPP__
+#define __GNC_SQL_CONNECTION_HPP__
+
+extern "C"
+{
+#include <qof.h>
+}
+#include <memory>
+#include <string>
+#include <vector>
+
+class GncSqlResult;
+using GncSqlResultPtr = GncSqlResult*;
+class GncSqlColumnTableEntry;
+using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
+using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
+using PairVec = std::vector<std::pair<std::string, std::string>>;
+struct GncSqlColumnInfo;
+using ColVec = std::vector<GncSqlColumnInfo>;
+
+/**
+ * SQL statement provider.
+ */
+class GncSqlStatement
+{
+public:
+    virtual ~GncSqlStatement() {}
+    virtual const char* to_sql() const = 0;
+    virtual void add_where_cond (QofIdTypeConst, const PairVec&) = 0;
+};
+
+using GncSqlStatementPtr = std::unique_ptr<GncSqlStatement>;
+
+/**
+ * Encapsulate the connection to the database. This is an abstract class; the
+ * implmentation is database-specific.
+ */
+class GncSqlConnection
+{
+public:
+    /** Returns NULL if error */
+    virtual ~GncSqlConnection() = default;
+    virtual GncSqlResultPtr execute_select_statement (const GncSqlStatementPtr&)
+        noexcept = 0;
+    /** Returns false if error */
+    virtual int execute_nonselect_statement (const GncSqlStatementPtr&)
+        noexcept = 0;
+    virtual GncSqlStatementPtr create_statement_from_sql (const std::string&)
+        const noexcept = 0;
+    /** Returns true if successful */
+    virtual bool does_table_exist (const std::string&) const noexcept = 0;
+    /** Returns TRUE if successful, false if error */
+    virtual bool begin_transaction () noexcept = 0;
+    /** Returns TRUE if successful, FALSE if error */
+    virtual bool rollback_transaction () const noexcept = 0;
+    /** Returns TRUE if successful, FALSE if error */
+    virtual bool commit_transaction () const noexcept = 0;
+    /** Returns TRUE if successful, FALSE if error */
+    virtual bool create_table (const std::string&, const ColVec&)
+        const noexcept = 0;
+    /** Returns TRUE if successful, FALSE if error */
+    virtual bool create_index (const std::string&, const std::string&,
+                               const EntryVec&) const noexcept = 0;
+    /** Returns TRUE if successful, FALSE if error */
+    virtual bool add_columns_to_table (const std::string&, const ColVec&)
+        const noexcept = 0;
+    virtual std::string quote_string (const std::string&)
+        const noexcept = 0;
+    /** Get the connection error value.
+     * If not 0 will normally be meaningless outside of implementation code.
+     */
+    virtual int dberror() const noexcept = 0;
+    virtual void set_error(int error, unsigned int repeat,  bool retry) noexcept = 0;
+    virtual bool verify() noexcept = 0;
+    virtual bool retry_connection(const char* msg) noexcept = 0;
+
+};
+
+
+#endif //__GNC_SQL_CONNECTION_HPP__
diff --git a/src/backend/sql/gnc-sql-object-backend.cpp b/src/backend/sql/gnc-sql-object-backend.cpp
new file mode 100644
index 0000000..a945e25
--- /dev/null
+++ b/src/backend/sql/gnc-sql-object-backend.cpp
@@ -0,0 +1,89 @@
+/***********************************************************************\
+ * gnc-sql-object-backend.hpp: Encapsulate per-class table schema.     *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+extern "C"
+{
+#include <config.h>
+}
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
+#include "gnc-slots-sql.h"
+
+static QofLogModule log_module = G_LOG_DOMAIN;
+
+bool
+GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
+{
+    const GncGUID* guid;
+    gboolean is_infant;
+    E_DB_OPERATION op;
+    gboolean is_ok;
+
+    is_infant = qof_instance_get_infant (inst);
+    if (qof_instance_get_destroying (inst))
+    {
+        op = OP_DB_DELETE;
+    }
+    else if (sql_be->pristine() || is_infant)
+    {
+        op = OP_DB_INSERT;
+    }
+    else
+    {
+        op = OP_DB_UPDATE;
+    }
+    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
+                                     m_type_name.c_str(), inst, m_col_table);
+
+    if (is_ok)
+    {
+        // Now, commit any slots
+        guid = qof_instance_get_guid (inst);
+        if (!qof_instance_get_destroying (inst))
+        {
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
+        }
+        else
+        {
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
+        }
+    }
+
+    return is_ok;
+}
+
+void
+GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
+{
+    g_return_if_fail (sql_be != nullptr);
+    int version = sql_be->get_table_version (m_table_name);
+    if (version == 0) //No tables, otherwise version will sql_be >= 1.
+    {
+        sql_be->create_table(m_table_name, m_col_table);
+        sql_be->set_table_version(m_table_name, m_version);
+    }
+    else if (version != m_version)
+        PERR("Version mismatch in table %s, expecting %d but backend is %d."
+             "Table creation aborted.", m_table_name.c_str(), m_version, version);
+}
diff --git a/src/backend/sql/gnc-sql-object-backend.hpp b/src/backend/sql/gnc-sql-object-backend.hpp
new file mode 100644
index 0000000..7c5604f
--- /dev/null
+++ b/src/backend/sql/gnc-sql-object-backend.hpp
@@ -0,0 +1,116 @@
+/***********************************************************************\
+ * gnc-sql-object-backend.hpp: Encapsulate per-class table schema.     *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+#ifndef __GNC_SQL_OBJECT_BACKEND_HPP__
+#define __GNC_SQL_OBJECT_BACKEND_HPP__
+
+extern "C"
+{
+#include <qof.h>
+}
+#include <memory>
+#include <string>
+#include <vector>
+
+class GncSqlBackend;
+class GncSqlColumnTableEntry;
+using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
+using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
+
+typedef enum
+{
+    OP_DB_INSERT,
+    OP_DB_UPDATE,
+    OP_DB_DELETE
+} E_DB_OPERATION;
+
+/**
+ * Encapsulates per-class table schema with functions to load, create a table,
+ * commit a changed front-end object (note that database transaction semantics
+ * are not yet implemented; edit/commit applies to the front-end object!) and
+ * write all front-end objects of the type to the database. Additional functions
+ * for creating and runing queries existed but were unused and untested. They've
+ * been temporarily removed until the front end is ready to use them.
+ */
+class GncSqlObjectBackend
+{
+public:
+    GncSqlObjectBackend (int version, const std::string& type,
+                         const std::string& table, const EntryVec& vec) :
+        m_table_name{table}, m_version{version}, m_type_name{type},
+        m_col_table(vec) {}
+    /**
+     * Load all objects of m_type in the database into memory.
+     * @param sql_be The GncSqlBackend containing the database connection.
+     */
+    virtual void load_all (GncSqlBackend* sql_be) = 0;
+    /**
+     * Conditionally create or update a database table from m_col_table. The
+     * condition is the version returned by querying the database's version
+     * table: If it's 0 then the table wasn't found and will be created; All
+     * tables areat least version 1. If the database's version is less than the
+     * compiled version then the table schema is upgraded but the data isn't,
+     * that's the engine's responsibility when the object is loaded. If the
+     * version is greater than the compiled version then nothing is touched.
+     * @param sql_be The GncSqlBackend containing the database connection.
+     */
+    virtual void create_tables (GncSqlBackend* sql_be);
+    /**
+     * UPDATE/INSERT a single instance of m_type_name into the database.
+     * @param sql_be The GncSqlBackend containing the database.
+     * @param inst The QofInstance to be written out.
+     */
+    virtual bool commit (GncSqlBackend* sql_be, QofInstance* inst);
+    /**
+     * Write all objects of m_type_name to the database.
+     * @param sql_be The GncSqlBackend containing the database.
+     * @return true if the objects were successfully written, false otherwise.
+     */
+    virtual bool write (GncSqlBackend* sql_be) { return true; }
+    /**
+     * Return the m_type_name for the class. This value is created at
+     * compilation time and is called QofIdType or QofIdTypeConst in other parts
+     * of GnuCash. Most values are defined in src/engine/gnc-engine.h.
+     * @return m_type_name.
+     */
+    const char* type () const noexcept { return m_type_name.c_str(); }
+    /**
+     * Compare a version with the compiled version (m_version).
+     * @return true if they match.
+     */
+    const bool is_version (int version) const noexcept {
+        return version == m_version;
+    }
+protected:
+    const std::string m_table_name;
+    const int m_version;
+    const std::string m_type_name; /// The front-end QofIdType
+    const EntryVec& m_col_table;   /// The ORM table definition.
+};
+
+using GncSqlObjectBackendPtr = GncSqlObjectBackend*;
+
+using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
+using OBEVec = std::vector<OBEEntry>;
+
+#endif //__GNC_SQL_OBJECT_BACKEND_HPP__
diff --git a/src/backend/dbi/gnc-dbiprovider.hpp b/src/backend/sql/gnc-sql-result.cpp
similarity index 58%
copy from src/backend/dbi/gnc-dbiprovider.hpp
copy to src/backend/sql/gnc-sql-result.cpp
index 2f168d8..20f774b 100644
--- a/src/backend/dbi/gnc-dbiprovider.hpp
+++ b/src/backend/sql/gnc-sql-result.cpp
@@ -1,54 +1,48 @@
-/********************************************************************
- * gnc-dbiprovider.cpp: Encapsulate differences among Dbi backends. *
- *                                                                  *
- * Copyright 2016 John Ralls <jralls at ceridwen.us>                   *
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-
-#ifndef __GNC_DBIPROVIDER_HPP__
-#define __GNC_DBIPROVIDER_HPP__
+/***********************************************************************\
+ * gnc-sql-result.cpp: Encapsulate the results of a SQL query.         *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
 
 extern "C"
 {
-#include <dbi/dbi.h>
+#include <config.h>
 }
-#include <string>
-#include <vector>
+#include <sstream>
+#include "gnc-sql-column-table-entry.hpp"
 
-/**
- * Provides the primary abstraction for different DBI backends.
- */
-class GncSqlConnection;
-struct GncSqlColumnInfo;
-using ColVec=std::vector<GncSqlColumnInfo>;
+#include "gnc-sql-result.hpp"
 
-class GncDbiProvider
+GncSqlRow&
+GncSqlRow::operator++()
 {
-public:
-    virtual ~GncDbiProvider() = default;
-    virtual StrVec get_table_list(dbi_conn conn, const std::string& table) = 0;
-    virtual void append_col_def(std::string& ddl,
-                                const GncSqlColumnInfo& info) = 0;
-    virtual StrVec get_index_list (dbi_conn conn) = 0;
-    virtual void drop_index(dbi_conn conn, const std::string& index) = 0;
-};
-
-using GncDbiProviderPtr = std::unique_ptr<GncDbiProvider>;
+    auto& new_row =  m_iter->operator++();
+    if (new_row != *this)
+        m_iter = nullptr;
+    return new_row;
+}
 
-#endif //__GNC_DBIPROVIDER_HPP__
+/*
+  GncSqlResult*
+  GncSqlRow::operator*()
+  {
+  return m_iter->operator*();
+  }
+*/
diff --git a/src/backend/sql/gnc-sql-result.hpp b/src/backend/sql/gnc-sql-result.hpp
new file mode 100644
index 0000000..818df82
--- /dev/null
+++ b/src/backend/sql/gnc-sql-result.hpp
@@ -0,0 +1,114 @@
+/***********************************************************************\
+ * gnc-sql-result.hpp: Encapsulate the results of a SQL query.         *
+ *                                                                     *
+ * Copyright 2016 John Ralls <jralls at ceridwen.us>                      *
+ *                                                                     *
+ * This program is free software; you can redistribute it and/or       *
+ * modify it under the terms of the GNU General Public License as      *
+ * published by the Free Software Foundation; either version 2 of      *
+ * the License, or (at your option) any later version.                 *
+ *                                                                     *
+ * This program is distributed in the hope that it will be useful,     *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+ * GNU General Public License for more details.                        *
+ *                                                                     *
+ * You should have received a copy of the GNU General Public License   *
+ * along with this program; if not, contact:                           *
+ *                                                                     *
+ * Free Software Foundation           Voice:  +1-617-542-5942          *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                      *
+\***********************************************************************/
+
+#ifndef __GNC_SQL_RESULT_HPP__
+#define __GNC_SQL_RESULT_HPP__
+
+extern "C"
+{
+#include <qof.h>
+}
+#include <cstdint>
+#include <string>
+#include <vector>
+
+class GncSqlRow;
+/**
+ * Pure virtual class to iterate over a query result set.
+ */
+
+class GncSqlResult
+{
+public:
+    virtual ~GncSqlResult() = default;
+    virtual uint64_t size() const noexcept = 0;
+    virtual GncSqlRow& begin() = 0;
+    virtual GncSqlRow& end() = 0;
+    friend GncSqlRow;
+protected:
+    class IteratorImpl {
+    public:
+        virtual ~IteratorImpl() = default;
+        virtual GncSqlRow& operator++() = 0;
+        virtual GncSqlResult* operator*() = 0;
+        virtual int64_t get_int_at_col (const char* col) const = 0;
+        virtual float get_float_at_col (const char* col) const = 0;
+        virtual double get_double_at_col (const char* col) const = 0;
+        virtual std::string get_string_at_col (const char* col) const = 0;
+        virtual time64 get_time64_at_col (const char* col) const = 0;
+        virtual bool is_col_null (const char* col) const noexcept = 0;
+    };
+};
+
+/**
+ * Row of SQL Query results.
+ *
+ * This is a "pointer" class of a pimpl pattern, the implementation being
+ * GncSqlResult::IteratorImpl. It's designed to present a std::forward_iterator
+ * like interface for use with range-for while allowing for wrapping a C API.
+ *
+ * Important Implementation Note: Operator++() as written requires that the
+ * sentinel GncSqlRow returned by GncSqlResult::end() has m_impl = nullptr in
+ * order to terminate the loop condition. This is a bit of a hack and might be a
+ * problem with a different SQL interface library from libdbi.
+ *
+ * Note that GncSqlResult::begin and GncSqlRow::operator++() return
+ * GncSqlRow&. This is necessary for operator++() to be called: Using operator
+ * ++() on a pointer performs pointer arithmetic rather than calling the
+ * pointed-to-class's operator++() and C++'s range-for uses operator++()
+ * directly on whatever begin() gives it.
+ */
+class GncSqlRow
+{
+public:
+    GncSqlRow (GncSqlResult::IteratorImpl* iter) : m_iter{iter} {}
+    ~GncSqlRow() { }
+    GncSqlRow& operator++();
+    GncSqlRow& operator*() { return *this; }
+    friend bool operator!=(const GncSqlRow&, const GncSqlRow&);
+    int64_t get_int_at_col (const char* col) const {
+        return m_iter->get_int_at_col (col); }
+    float get_float_at_col (const char* col) const {
+        return m_iter->get_float_at_col (col); }
+    double get_double_at_col (const char* col) const {
+        return m_iter->get_double_at_col (col); }
+    std::string get_string_at_col (const char* col) const {
+        return m_iter->get_string_at_col (col); }
+    time64 get_time64_at_col (const char* col) const {
+        return m_iter->get_time64_at_col (col); }
+    bool is_col_null (const char* col) const noexcept {
+        return m_iter->is_col_null (col); }
+private:
+    GncSqlResult::IteratorImpl* m_iter;
+};
+
+inline bool operator!=(const GncSqlRow& lr, const GncSqlRow& rr) {
+    return lr.m_iter != rr.m_iter;
+}
+
+inline bool operator==(const GncSqlRow& lr, const GncSqlRow& rr) {
+    return !(lr != rr);
+}
+
+
+#endif //__GNC_SQL_RESULT_HPP__
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index 407200d..645037a 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -40,6 +40,10 @@ extern "C"
 #include "gncTaxTableP.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-slots-sql.h"
 #include "gnc-tax-table-sql.h"
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index bbca8a4..4fdc540 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -51,6 +51,10 @@ extern "C"
 
 #include "escape.h"
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-backend-sql.h"
 #include "gnc-transaction-sql.h"
 #include "gnc-commodity-sql.h"
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index 777456d..3660b3c 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -41,6 +41,10 @@ extern "C"
 #include "gncTaxTableP.h"
 }
 
+#include "gnc-sql-connection.hpp"
+#include "gnc-sql-backend.hpp"
+#include "gnc-sql-object-backend.hpp"
+#include "gnc-sql-column-table-entry.hpp"
 #include "gnc-vendor-sql.h"
 #include "gnc-bill-term-sql.h"
 #include "gnc-tax-table-sql.h"
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index 2a05d19..ce3558c 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -28,6 +28,9 @@ extern "C"
 #include <unittest-support.h>
 }
 /* Add specific headers for this class */
+#include "../gnc-sql-connection.hpp"
+#include "../gnc-sql-backend.hpp"
+#include "../gnc-sql-result.hpp"
 #include "../gnc-backend-sql.h"
 
 static const gchar* suitename = "/backend/sql/gnc-backend-sql";

commit 4ae5abf83b86759c184605e58269fa2214c25105
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Oct 30 17:56:24 2016 -0700

    Distinguish variables of various backend types by naming.
    
    QofBackend* qof_be, GncSqlBackend* sql_be, and GncDbiBackend* dbi_be.\nRequested by Geert Janssens.

diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp
index fc2b295..3a4a01b 100644
--- a/src/backend/dbi/gnc-backend-dbi.cpp
+++ b/src/backend/dbi/gnc-backend-dbi.cpp
@@ -116,9 +116,9 @@ static void adjust_sql_options (dbi_conn connection);
 static bool save_may_clobber_data (dbi_conn conn, const std::string& dbname);
 static void init_sql_backend (GncDbiBackend* dbi_be);
 
-static bool conn_test_dbi_library (dbi_conn conn, QofBackend* qbe);
+static bool conn_test_dbi_library (dbi_conn conn, QofBackend* qof_be);
 
-template <DbType T> void gnc_dbi_session_begin(QofBackend* qbe,
+template <DbType T> void gnc_dbi_session_begin(QofBackend* qof_be,
                                                QofSession* session,
                                                const char* book_id,
                                                gboolean ignore_lock,
@@ -126,7 +126,6 @@ template <DbType T> void gnc_dbi_session_begin(QofBackend* qbe,
 template <DbType Type> QofBackend*
 new_backend ()
 {
-    QofBackend* be;
     const char* format;
     switch (Type)
     {
@@ -143,13 +142,13 @@ new_backend ()
     auto dbi_be = new GncDbiBackend(nullptr, nullptr, format);
     assert (dbi_be != nullptr);
 
-    be = (QofBackend*)dbi_be;
-    qof_backend_init (be);
+    QofBackend* qof_be = reinterpret_cast<decltype(qof_be)>(dbi_be);
+    qof_backend_init (qof_be);
 
-    be->session_begin = gnc_dbi_session_begin<Type>;
+    qof_be->session_begin = gnc_dbi_session_begin<Type>;
     init_sql_backend (dbi_be);
 
-    return be;
+    return qof_be;
 }
 
 template <DbType T>
@@ -230,14 +229,14 @@ UriStrings::quote_dbname(DbType t) const noexcept
 }
 
 static void
-create_tables(const OBEEntry& entry, GncDbiBackend* be)
+create_tables(const OBEEntry& entry, GncDbiBackend* dbi_be)
 {
     std::string type;
     GncSqlObjectBackendPtr obe = nullptr;
     std::tie(type, obe) = entry;
     g_return_if_fail(obe->is_version (GNC_SQL_BACKEND_VERSION));
 
-    obe->create_tables (be);
+    obe->create_tables (dbi_be);
 }
 
 static void
@@ -261,13 +260,13 @@ set_options(dbi_conn conn, const PairVec& options)
 /**
  * Sets standard db options in a dbi_conn.
  *
- * @param qbe QOF backend
+ * @param qof_be QOF backend
  * @param conn dbi_conn connection
  * @param uri UriStrings containing the needed paramters.
  * @return TRUE if successful, FALSE if error
  */
 static bool
-set_standard_connection_options (QofBackend* qbe, dbi_conn conn,
+set_standard_connection_options (QofBackend* qof_be, dbi_conn conn,
                                  const UriStrings& uri)
 
 {
@@ -292,7 +291,7 @@ set_standard_connection_options (QofBackend* qbe, dbi_conn conn,
     }
     catch (std::runtime_error& err)
     {
-        qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+        qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
         return false;
     }
 
@@ -303,7 +302,7 @@ template <DbType Type> void error_handler(void* conn, void* data);
 void error_handler(void* conn, void* data);
 
 template <DbType Type> dbi_conn
-conn_setup (QofBackend* qbe, PairVec& options,
+conn_setup (QofBackend* qof_be, PairVec& options,
             UriStrings& uri)
 {
     const char* dbstr = (Type == DbType::DBI_SQLITE ? "sqlite3" :
@@ -321,13 +320,13 @@ conn_setup (QofBackend* qbe, PairVec& options,
     if (conn == nullptr)
     {
         PERR ("Unable to create %s dbi connection", dbstr);
-        qof_backend_set_error (qbe, ERR_BACKEND_BAD_URL);
+        qof_backend_set_error (qof_be, ERR_BACKEND_BAD_URL);
 	return nullptr;
     }
 
-    dbi_conn_error_handler (conn, error_handler<Type>, qbe);
+    dbi_conn_error_handler (conn, error_handler<Type>, qof_be);
     if (!uri.m_dbname.empty() &&
-        !set_standard_connection_options(qbe, conn, uri))
+        !set_standard_connection_options(qof_be, conn, uri))
     {
         dbi_conn_close(conn);
         return nullptr;
@@ -340,7 +339,7 @@ conn_setup (QofBackend* qbe, PairVec& options,
         catch (std::runtime_error& err)
         {
             dbi_conn_close(conn);
-            qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+            qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
             return nullptr;
         }
     }
@@ -349,7 +348,7 @@ conn_setup (QofBackend* qbe, PairVec& options,
 }
 
 static bool
-create_database(DbType type, QofBackend *qbe, dbi_conn conn, const char* db)
+create_database(DbType type, QofBackend *qof_be, dbi_conn conn, const char* db)
 {
     const char *dbname;
     const char *dbcreate;
@@ -371,7 +370,7 @@ create_database(DbType type, QofBackend *qbe, dbi_conn conn, const char* db)
     }
     catch (std::runtime_error& err)
     {
-        qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+        qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
         return false;
     }
 
@@ -379,7 +378,7 @@ create_database(DbType type, QofBackend *qbe, dbi_conn conn, const char* db)
     if (result < 0)
     {
         PERR ("Unable to connect to %s database", dbname);
-        qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+        qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
         return false;
     }
     if (type == DbType::DBI_MYSQL)
@@ -388,7 +387,7 @@ create_database(DbType type, QofBackend *qbe, dbi_conn conn, const char* db)
     if (dresult == nullptr)
     {
         PERR ("Unable to create database '%s'\n", db);
-        qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+        qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
         return false;
     }
     if (type == DbType::DBI_PGSQL)
@@ -406,24 +405,26 @@ template <> void
 error_handler<DbType::DBI_SQLITE> (dbi_conn conn, void* user_data)
 {
     const char* msg;
-    GncDbiBackend *be = static_cast<decltype(be)>(user_data);
+    GncDbiBackend *dbi_be = static_cast<decltype(dbi_be)>(user_data);
     int errnum = dbi_conn_error (conn, &msg);
     PERR ("DBI error: %s\n", msg);
-    if (be->connected())
-        be->set_error (ERR_BACKEND_MISC, 0, false);
+    if (dbi_be->connected())
+        dbi_be->set_error (ERR_BACKEND_MISC, 0, false);
 }
 
 template <> void
-gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
-                               const char* book_id, gboolean ignore_lock,
-                               gboolean create, gboolean force)
+gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qof_be,
+                                          QofSession* session,
+                                          const char* book_id,
+                                          gboolean ignore_lock,
+                                          gboolean create, gboolean force)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
     const char* msg = nullptr;
     gboolean file_exists;
     PairVec options;
 
-    g_return_if_fail (qbe != nullptr);
+    g_return_if_fail (qof_be != nullptr);
     g_return_if_fail (session != nullptr);
     g_return_if_fail (book_id != nullptr);
 
@@ -438,8 +439,8 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
     file_exists = g_file_test (filepath.c_str(), ftest);
     if (!create && !file_exists)
     {
-        qof_backend_set_error (qbe, ERR_FILEIO_FILE_NOT_FOUND);
-        qof_backend_set_message (qbe, "Sqlite3 file %s not found",
+        qof_backend_set_error (qof_be, ERR_FILEIO_FILE_NOT_FOUND);
+        qof_backend_set_message (qof_be, "Sqlite3 file %s not found",
                                  filepath.c_str());
         PWARN ("Sqlite3 file %s not found", filepath.c_str());
         LEAVE("Error");
@@ -448,14 +449,14 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
 
     if (create && !force && file_exists)
     {
-        qof_backend_set_error (qbe, ERR_BACKEND_STORE_EXISTS);
+        qof_backend_set_error (qof_be, ERR_BACKEND_STORE_EXISTS);
         msg = "Might clobber, no force";
         PWARN ("%s", msg);
         LEAVE("Error");
 	return;
     }
 
-    be->connect(nullptr);
+    dbi_be->connect(nullptr);
     /* dbi-sqlite3 documentation says that sqlite3 doesn't take a "host" option */
     options.push_back(std::make_pair("host", "localhost"));
     auto dirname = g_path_get_dirname (filepath.c_str());
@@ -465,7 +466,7 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
     if (basename != nullptr) g_free (basename);
     if (dirname != nullptr) g_free (dirname);
     UriStrings uri;
-    auto conn = conn_setup<DbType::DBI_SQLITE>(qbe, options, uri);
+    auto conn = conn_setup<DbType::DBI_SQLITE>(qof_be, options, uri);
     if (conn == nullptr)
     {
         LEAVE("Error");
@@ -478,12 +479,12 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
     {
         dbi_conn_close(conn);
         PERR ("Unable to connect to %s: %d\n", book_id, result);
-        qof_backend_set_error (qbe, ERR_BACKEND_BAD_URL);
+        qof_backend_set_error (qof_be, ERR_BACKEND_BAD_URL);
         LEAVE("Error");
 	return;
     }
 
-    if (!conn_test_dbi_library(conn, qbe))
+    if (!conn_test_dbi_library(conn, qof_be))
     {
         if (create && !file_exists)
         {
@@ -501,8 +502,8 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
 
     try
     {
-        be->connect(new GncDbiSqlConnection(DbType::DBI_SQLITE,
-                                            qbe, conn, ignore_lock));
+        dbi_be->connect(new GncDbiSqlConnection(DbType::DBI_SQLITE,
+                                            qof_be, conn, ignore_lock));
     }
     catch (std::runtime_error& err)
     {
@@ -521,7 +522,7 @@ gnc_dbi_session_begin<DbType::DBI_SQLITE>(QofBackend* qbe, QofSession* session,
 template <> void
 error_handler<DbType::DBI_MYSQL> (dbi_conn conn, void* user_data)
 {
-    GncDbiBackend* be = (GncDbiBackend*)user_data;
+    GncDbiBackend* dbi_be = static_cast<decltype(dbi_be)>(user_data);
     const char* msg;
 
     auto err_num = dbi_conn_error (conn, &msg);
@@ -536,7 +537,7 @@ error_handler<DbType::DBI_MYSQL> (dbi_conn conn, void* user_data)
     if (err_num == 1049)            // Database doesn't exist
     {
         PINFO ("DBI error: %s\n", msg);
-        be->set_exists(false);
+        dbi_be->set_exists(false);
         return;
     }
 
@@ -544,7 +545,7 @@ error_handler<DbType::DBI_MYSQL> (dbi_conn conn, void* user_data)
      *  has been initialized. So let's assert it exits here, otherwise
      * simply return.
      */
-    if (!be->connected())
+    if (!dbi_be->connected())
     {
         PINFO ("DBI error: %s\n", msg);
         PINFO ("Note: GbcDbiSqlConnection not yet initialized. Skipping further error processing.");
@@ -555,18 +556,18 @@ error_handler<DbType::DBI_MYSQL> (dbi_conn conn, void* user_data)
     if (err_num == 2006)       // Server has gone away
     {
         PINFO ("DBI error: %s - Reconnecting...\n", msg);
-        be->set_error (ERR_BACKEND_CONN_LOST, 1, true);
-        be->retry_connection(msg);
+        dbi_be->set_error (ERR_BACKEND_CONN_LOST, 1, true);
+        dbi_be->retry_connection(msg);
     }
     else if (err_num == 2003)       // Unable to connect
     {
-        be->set_error (ERR_BACKEND_CANT_CONNECT, 1, true);
-        be->retry_connection (msg);
+        dbi_be->set_error (ERR_BACKEND_CANT_CONNECT, 1, true);
+        dbi_be->retry_connection (msg);
     }
     else                            // Any other error
     {
         PERR ("DBI error: %s\n", msg);
-        be->set_error (ERR_BACKEND_MISC, 0, FALSE);
+        dbi_be->set_error (ERR_BACKEND_MISC, 0, FALSE);
     }
 }
 
@@ -635,15 +636,15 @@ adjust_sql_options (dbi_conn connection)
 
 
 template <DbType T> void
-gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
+gnc_dbi_session_begin (QofBackend* qof_be, QofSession* session,
                              const char* book_id, gboolean ignore_lock,
                              gboolean create, gboolean force)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
     GncDbiTestResult dbi_test_result = GNC_DBI_PASS;
     PairVec options;
 
-    g_return_if_fail (qbe != nullptr);
+    g_return_if_fail (qof_be != nullptr);
     g_return_if_fail (session != nullptr);
     g_return_if_fail (book_id != nullptr);
 
@@ -666,22 +667,22 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
         uri.m_dbname = std::string{lcname};
         g_free(lcname);
     }
-    be->connect(nullptr);
+    dbi_be->connect(nullptr);
 
-    auto conn = conn_setup<T>(qbe, options, uri);
+    auto conn = conn_setup<T>(qof_be, options, uri);
     if (conn == nullptr)
     {
         LEAVE("Error");
         return;
     }
 
-    be->set_exists(true); //May be unset in the error handler.
+    dbi_be->set_exists(true); //May be unset in the error handler.
     auto result = dbi_conn_connect (conn);
     if (result == 0)
     {
         if (T == DbType::DBI_MYSQL)
             adjust_sql_options (conn);
-        if(!conn_test_dbi_library(conn, qbe))
+        if(!conn_test_dbi_library(conn, qof_be))
         {
             dbi_conn_close(conn);
             LEAVE("Error");
@@ -690,7 +691,7 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
         if (create && !force && save_may_clobber_data (conn,
                                                        uri.quote_dbname(T)))
         {
-            qof_backend_set_error (qbe, ERR_BACKEND_STORE_EXISTS);
+            qof_backend_set_error (qof_be, ERR_BACKEND_STORE_EXISTS);
             PWARN ("Databse already exists, Might clobber it.");
             dbi_conn_close(conn);
             LEAVE("Error");
@@ -701,10 +702,10 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
     else
     {
 
-        if (be->exists())
+        if (dbi_be->exists())
         {
             PERR ("Unable to connect to database '%s'\n", uri.dbname());
-            qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+            qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
             dbi_conn_close(conn);
             LEAVE("Error");
             return;
@@ -712,25 +713,25 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
 
         if (create)
         {
-            if (!create_database(T, qbe, conn, uri.quote_dbname(T).c_str()))
+            if (!create_database(T, qof_be, conn, uri.quote_dbname(T).c_str()))
             {
                 dbi_conn_close(conn);
                 LEAVE("Error");
                 return;
             }
-            conn = conn_setup<T>(qbe, options, uri);
+            conn = conn_setup<T>(qof_be, options, uri);
             result = dbi_conn_connect (conn);
             if (result < 0)
             {
                 PERR ("Unable to create database '%s'\n", uri.dbname());
-                qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+                qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
                 dbi_conn_close(conn);
                 LEAVE("Error");
                 return;
             }
             if (T == DbType::DBI_MYSQL)
                 adjust_sql_options (conn);
-            if (!conn_test_dbi_library(conn, qbe))
+            if (!conn_test_dbi_library(conn, qof_be))
             {
                 if (T == DbType::DBI_PGSQL)
                     dbi_conn_select_db (conn, "template1");
@@ -742,15 +743,15 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
         }
         else
         {
-            qof_backend_set_error (qbe, ERR_BACKEND_NO_SUCH_DB);
-            qof_backend_set_message (qbe, "Database %s not found", uri.dbname());
+            qof_backend_set_error (qof_be, ERR_BACKEND_NO_SUCH_DB);
+            qof_backend_set_message (qof_be, "Database %s not found", uri.dbname());
         }
     }
 
-    be->connect(nullptr);
+    dbi_be->connect(nullptr);
     try
     {
-        be->connect(new GncDbiSqlConnection(T, qbe, conn, ignore_lock));
+        dbi_be->connect(new GncDbiSqlConnection(T, qof_be, conn, ignore_lock));
     }
     catch (std::runtime_error& err)
     {
@@ -769,7 +770,7 @@ gnc_dbi_session_begin (QofBackend* qbe, QofSession* session,
 template<> void
 error_handler<DbType::DBI_PGSQL> (dbi_conn conn, void* user_data)
 {
-    GncDbiBackend* be = (GncDbiBackend*)user_data;
+    GncDbiBackend* dbi_be = static_cast<decltype(dbi_be)>(user_data);
     const char* msg;
 
     (void)dbi_conn_error (conn, &msg);
@@ -777,68 +778,69 @@ error_handler<DbType::DBI_PGSQL> (dbi_conn conn, void* user_data)
         g_str_has_suffix (msg, "does not exist\n"))
     {
         PINFO ("DBI error: %s\n", msg);
-        be->set_exists(false);
+        dbi_be->set_exists(false);
     }
     else if (g_strrstr (msg,
                         "server closed the connection unexpectedly"))    // Connection lost
     {
-        if (!be->connected())
+        if (!dbi_be->connected())
         {
             PWARN ("DBI Error: Connection lost, connection pointer invalid");
             return;
         }
         PINFO ("DBI error: %s - Reconnecting...\n", msg);
-        be->set_error (ERR_BACKEND_CONN_LOST, 1, true);
-        be->retry_connection(msg);
+        dbi_be->set_error (ERR_BACKEND_CONN_LOST, 1, true);
+        dbi_be->retry_connection(msg);
     }
     else if (g_str_has_prefix (msg, "connection pointer is NULL") ||
              g_str_has_prefix (msg, "could not connect to server"))       // No connection
     {
 
-        if (!be->connected())
-            qof_backend_set_error((QofBackend*)be, ERR_BACKEND_CANT_CONNECT);
+        if (!dbi_be->connected())
+            qof_backend_set_error(reinterpret_cast<QofBackend*>(dbi_be),
+                                  ERR_BACKEND_CANT_CONNECT);
         else
         {
-            be->set_error(ERR_BACKEND_CANT_CONNECT, 1, true);
-            be->retry_connection (msg);
+            dbi_be->set_error(ERR_BACKEND_CANT_CONNECT, 1, true);
+            dbi_be->retry_connection (msg);
         }
     }
     else
     {
         PERR ("DBI error: %s\n", msg);
-        if (be->connected())
-            be->set_error (ERR_BACKEND_MISC, 0, false);
+        if (dbi_be->connected())
+            dbi_be->set_error (ERR_BACKEND_MISC, 0, false);
     }
 }
 
 /* ================================================================= */
 
 static void
-gnc_dbi_session_end (QofBackend* be_start)
+gnc_dbi_session_end (QofBackend* qof_be)
 {
-    GncDbiBackend* be = (GncDbiBackend*)be_start;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    g_return_if_fail (be_start != nullptr);
+    g_return_if_fail (dbi_be != nullptr);
 
     ENTER (" ");
 
-    be->finalize_version_info ();
-    be->connect(nullptr);
+    dbi_be->finalize_version_info ();
+    dbi_be->connect(nullptr);
 
     LEAVE (" ");
 }
 
 static void
-gnc_dbi_destroy_backend (QofBackend* be)
+gnc_dbi_destroy_backend (QofBackend* qof_be)
 {
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (qof_be != nullptr);
 
     /* Stop transaction logging */
     xaccLogSetBaseName (nullptr);
 
-    qof_backend_destroy (be);
+    qof_backend_destroy (qof_be);
 
-    g_free (be);
+    g_free (qof_be);
 }
 
 /* ================================================================= */
@@ -853,44 +855,44 @@ gnc_dbi_destroy_backend (QofBackend* be)
  * both values to match this version of Gnucash.
  */
 void
-gnc_dbi_load (QofBackend* qbe,  QofBook* book, QofBackendLoadType loadType)
+gnc_dbi_load (QofBackend* qof_be,  QofBook* book, QofBackendLoadType loadType)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    g_return_if_fail (qbe != nullptr);
+    g_return_if_fail (qof_be != nullptr);
     g_return_if_fail (book != nullptr);
 
-    ENTER ("be=%p, book=%p", be, book);
+    ENTER ("dbi_be=%p, book=%p", dbi_be, book);
 
     if (loadType == LOAD_TYPE_INITIAL_LOAD)
     {
 
         // Set up table version information
-        be->init_version_info ();
-        assert (be->m_book == nullptr);
+        dbi_be->init_version_info ();
+        assert (dbi_be->m_book == nullptr);
 
         // Call all object backends to create any required tables
         auto registry = gnc_sql_get_backend_registry();
         for (auto entry : registry)
-            create_tables(entry, be);
+            create_tables(entry, dbi_be);
     }
 
-    gnc_sql_load (be, book, loadType);
+    gnc_sql_load (dbi_be, book, loadType);
 
-    if (GNUCASH_RESAVE_VERSION > be->get_table_version("Gnucash"))
+    if (GNUCASH_RESAVE_VERSION > dbi_be->get_table_version("Gnucash"))
     {
         /* The database was loaded with an older database schema or
          * data semantics. In order to ensure consistency, the whole
          * thing needs to be saved anew. */
-        qof_backend_set_error (qbe, ERR_SQL_DB_TOO_OLD);
+        qof_backend_set_error (qof_be, ERR_SQL_DB_TOO_OLD);
     }
-    else if (GNUCASH_RESAVE_VERSION < be->get_table_version("Gnucash-Resave"))
+    else if (GNUCASH_RESAVE_VERSION < dbi_be->get_table_version("Gnucash-Resave"))
     {
         /* Worse, the database was created with a newer version. We
          * can't safely write to this database, so the user will have
          * to do a "save as" to make one that we can write to.
          */
-        qof_backend_set_error (qbe, ERR_SQL_DB_TOO_NEW);
+        qof_backend_set_error (qof_be, ERR_SQL_DB_TOO_NEW);
     }
 
 
@@ -921,24 +923,24 @@ save_may_clobber_data (dbi_conn conn, const std::string& dbname)
  * no errors. If there are errors, drop the new tables and restore the
  * originals.
  *
- * @param qbe: QofBackend for the session.
+ * @param qof_be: QofBackend for the session.
  * @param book: QofBook to be saved in the database.
  */
 void
-gnc_dbi_safe_sync_all (QofBackend* qbe, QofBook* book)
+gnc_dbi_safe_sync_all (QofBackend* qof_be, QofBook* book)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
-    auto conn = dynamic_cast<GncDbiSqlConnection*>(be->m_conn);
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
+    auto conn = dynamic_cast<GncDbiSqlConnection*>(dbi_be->m_conn);
 
     g_return_if_fail (conn != nullptr);
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (book != nullptr);
 
-    ENTER ("book=%p, primary=%p", book, be->m_book);
+    ENTER ("book=%p, primary=%p", book, dbi_be->m_book);
     auto table_list = conn->m_provider->get_table_list (conn->conn(), "");
     if (!conn->table_operation (table_list, backup))
     {
-        qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+        qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
         conn->table_operation (table_list, rollback);
         LEAVE ("Failed to rename tables");
         return;
@@ -950,15 +952,15 @@ gnc_dbi_safe_sync_all (QofBackend* qbe, QofBook* book)
         conn->m_provider->drop_index (conn->m_conn, index);
         if (DBI_ERROR_NONE != dbi_conn_error (conn->m_conn, &errmsg))
         {
-            qof_backend_set_error (qbe, ERR_BACKEND_SERVER_ERR);
+            qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR);
             conn->table_operation (table_list, rollback);
             LEAVE ("Failed to drop indexes %s", errmsg);
             return;
         }
     }
 
-    gnc_sql_sync_all (be, book);
-    if (qof_backend_check_error (qbe))
+    gnc_sql_sync_all (dbi_be, book);
+    if (qof_backend_check_error (qof_be))
     {
         conn->table_operation (table_list, rollback);
         LEAVE ("Failed to create new database tables");
@@ -969,36 +971,36 @@ gnc_dbi_safe_sync_all (QofBackend* qbe, QofBook* book)
 }
 /* ================================================================= */
 static void
-gnc_dbi_begin_edit (QofBackend* qbe, QofInstance* inst)
+gnc_dbi_begin_edit (QofBackend* qof_be, QofInstance* inst)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_begin_edit (be, inst);
+    gnc_sql_begin_edit (dbi_be, inst);
 }
 
 static void
-gnc_dbi_rollback_edit (QofBackend* qbe, QofInstance* inst)
+gnc_dbi_rollback_edit (QofBackend* qof_be, QofInstance* inst)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_rollback_edit (be, inst);
+    gnc_sql_rollback_edit (dbi_be, inst);
 }
 
 static void
-gnc_dbi_commit_edit (QofBackend* qbe, QofInstance* inst)
+gnc_dbi_commit_edit (QofBackend* qof_be, QofInstance* inst)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (dbi_be != nullptr);
     g_return_if_fail (inst != nullptr);
 
-    gnc_sql_commit_edit (be, inst);
+    gnc_sql_commit_edit (dbi_be, inst);
 }
 
 /* ================================================================= */
@@ -1006,26 +1008,24 @@ gnc_dbi_commit_edit (QofBackend* qbe, QofInstance* inst)
 static void
 init_sql_backend (GncDbiBackend* dbi_be)
 {
-    QofBackend* be;
+    QofBackend* qof_be = reinterpret_cast<decltype(qof_be)>(dbi_be);
 
-    be = (QofBackend*)dbi_be;
+    qof_be->session_end = gnc_dbi_session_end;
+    qof_be->destroy_backend = gnc_dbi_destroy_backend;
 
-    be->session_end = gnc_dbi_session_end;
-    be->destroy_backend = gnc_dbi_destroy_backend;
-
-    be->load = gnc_dbi_load;
+    qof_be->load = gnc_dbi_load;
 
     /* The gda backend treats accounting periods transactionally. */
-    be->begin = gnc_dbi_begin_edit;
-    be->commit = gnc_dbi_commit_edit;
-    be->rollback = gnc_dbi_rollback_edit;
+    qof_be->begin = gnc_dbi_begin_edit;
+    qof_be->commit = gnc_dbi_commit_edit;
+    qof_be->rollback = gnc_dbi_rollback_edit;
 
     /* The SQL/DBI backend doesn't need to be synced until it is
      * configured for multiuser access. */
-    be->sync = gnc_dbi_safe_sync_all;
-    be->safe_sync = gnc_dbi_safe_sync_all;
+    qof_be->sync = gnc_dbi_safe_sync_all;
+    qof_be->safe_sync = gnc_dbi_safe_sync_all;
     /* CoA Export function not implemented for the SQL backend. */
-    be->export_fn = nullptr;
+    qof_be->export_fn = nullptr;
 
     gnc_sql_init (dbi_be);
 }
@@ -1291,7 +1291,7 @@ dbi_library_test (dbi_conn conn)
 }
 
 static bool
-conn_test_dbi_library(dbi_conn conn, QofBackend* qbe)
+conn_test_dbi_library(dbi_conn conn, QofBackend* qof_be)
 {
     auto result = dbi_library_test (conn);
     switch (result)
@@ -1300,14 +1300,14 @@ conn_test_dbi_library(dbi_conn conn, QofBackend* qbe)
             break;
 
         case GNC_DBI_FAIL_SETUP:
-            qof_backend_set_error (qbe, ERR_SQL_DBI_UNTESTABLE);
-            qof_backend_set_message (qbe,
+            qof_backend_set_error (qof_be, ERR_SQL_DBI_UNTESTABLE);
+            qof_backend_set_message (qof_be,
                                      "DBI library large number test incomplete");
             break;
 
         case GNC_DBI_FAIL_TEST:
-            qof_backend_set_error (qbe, ERR_SQL_BAD_DBI);
-            qof_backend_set_message (qbe,
+            qof_backend_set_error (qof_be, ERR_SQL_BAD_DBI);
+            qof_backend_set_message (qof_be,
                                      "DBI library fails large number test");
             break;
     }
diff --git a/src/backend/dbi/test/test-backend-dbi-basic.cpp b/src/backend/dbi/test/test-backend-dbi-basic.cpp
index 816881f..593d7df 100644
--- a/src/backend/dbi/test/test-backend-dbi-basic.cpp
+++ b/src/backend/dbi/test/test-backend-dbi-basic.cpp
@@ -347,17 +347,17 @@ teardown (Fixture* fixture, gconstpointer pData)
 
 #if 0 //temporarily disable test pending refactor.
 static void
-test_conn_index_functions (QofBackend* qbe)
+test_conn_index_functions (QofBackend* qof_be)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    auto index_list = conn->provider()->get_index_list (be->conn);
+    auto index_list = conn->provider()->get_index_list (dbi_be->conn);
     g_test_message ("Returned from index list\n");
     g_assert_cmpint (index_list.size(), == , 4);
     for (auto index : index_list)
     {
         const char* errmsg;
-        conn->provider()->drop_index (be->conn, index);
+        conn->provider()->drop_index (dbi_be->conn, index);
         g_assert (DBI_ERROR_NONE == dbi_conn_error (conn->conn(), &errmsg));
     }
 
@@ -373,7 +373,6 @@ test_dbi_store_and_reload (Fixture* fixture, gconstpointer pData)
     const gchar* url = (const gchar*)pData;
     QofSession* session_2;
     QofSession* session_3;
-    QofBackend* be;
 
     auto msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
     auto log_domain = "gnc.backend.dbi";
@@ -426,7 +425,6 @@ test_dbi_safe_save (Fixture* fixture, gconstpointer pData)
 {
     auto url = (gchar*)pData;
     QofSession* session_1 = NULL, *session_2 = NULL;
-    QofBackend* be;
 
     auto msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
     auto log_domain = "gnc.backend.dbi";
@@ -477,8 +475,8 @@ test_dbi_safe_save (Fixture* fixture, gconstpointer pData)
     qof_session_load (session_2, NULL);
     compare_books (qof_session_get_book (session_1),
                    qof_session_get_book (session_2));
-    be = qof_book_get_backend (qof_session_get_book (session_2));
-//    test_conn_index_functions (be);
+//    auto qof_be = qof_book_get_backend (qof_session_get_book (session_2));
+//    test_conn_index_functions (qof_be);
 
 cleanup:
     fixture->hdlrs = test_log_set_fatal_handler (fixture->hdlrs, check,
@@ -507,7 +505,8 @@ test_dbi_version_control (Fixture* fixture, gconstpointer pData)
     QofBook* book;
     QofBackendError err;
     gint ourversion = gnc_prefs_get_long_version ();
-    GncSqlBackend* be;
+    GncSqlBackend* sql_be = nullptr;
+
     // Load the session data
     if (fixture->filename)
         url = fixture->filename;
@@ -523,10 +522,10 @@ test_dbi_version_control (Fixture* fixture, gconstpointer pData)
     }
     qof_session_swap_data (fixture->session, sess);
     qof_session_save (sess, NULL);
-    be = reinterpret_cast<GncSqlBackend*>(qof_session_get_backend (sess));
+    sql_be = reinterpret_cast<decltype(sql_be)>(qof_session_get_backend (sess));
     book = qof_session_get_book (sess);
     qof_book_begin_edit (book);
-    be->set_table_version ("Gnucash", GNUCASH_RESAVE_VERSION - 1);
+    sql_be->set_table_version ("Gnucash", GNUCASH_RESAVE_VERSION - 1);
     qof_book_commit_edit (book);
     qof_session_end (sess);
     qof_session_destroy (sess);
@@ -535,11 +534,11 @@ test_dbi_version_control (Fixture* fixture, gconstpointer pData)
     qof_session_load (sess, NULL);
     err = qof_session_pop_error (sess);
     g_assert_cmpint (err, == , ERR_SQL_DB_TOO_OLD);
-    be = reinterpret_cast<GncSqlBackend*>(qof_session_get_backend (sess));
+    sql_be = reinterpret_cast<decltype(sql_be)>(qof_session_get_backend (sess));
     book = qof_session_get_book (sess);
     qof_book_begin_edit (book);
-    be->set_table_version ("Gnucash", ourversion);
-    be->set_table_version ("Gnucash-Resave", ourversion + 1);
+    sql_be->set_table_version ("Gnucash", ourversion);
+    sql_be->set_table_version ("Gnucash-Resave", ourversion + 1);
     qof_book_commit_edit (book);
     qof_session_end (sess);
     qof_session_destroy (sess);
@@ -550,10 +549,10 @@ test_dbi_version_control (Fixture* fixture, gconstpointer pData)
     err = qof_session_pop_error (sess);
     g_assert_cmpint (err, == , ERR_SQL_DB_TOO_NEW);
 cleanup:
-    be = reinterpret_cast<GncSqlBackend*>(qof_session_get_backend (sess));
+    sql_be = reinterpret_cast<decltype(sql_be)>(qof_session_get_backend (sess));
     book = qof_session_get_book (sess);
     qof_book_begin_edit (book);
-    be->set_table_version ("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
+    sql_be->set_table_version ("Gnucash-Resave", GNUCASH_RESAVE_VERSION);
     qof_book_commit_edit (book);
     qof_session_end (sess);
     qof_session_destroy (sess);
diff --git a/src/backend/dbi/test/test-dbi-stuff.cpp b/src/backend/dbi/test/test-dbi-stuff.cpp
index 8c80065..0d0f56a 100644
--- a/src/backend/dbi/test/test-dbi-stuff.cpp
+++ b/src/backend/dbi/test/test-dbi-stuff.cpp
@@ -212,17 +212,17 @@ compare_lots (QofBook* book_1, QofBook* book_2)
 }
 #if 0 //Disable test temporarily 
 static void
-test_conn_index_functions (QofBackend* qbe)
+test_conn_index_functions (QofBackend* qof_be)
 {
-    GncDbiBackend* be = (GncDbiBackend*)qbe;
+    GncDbiBackend* dbi_be = reinterpret_cast<decltype(dbi_be)>(qof_be);
 
-    auto index_list = conn->provider()->get_index_list (be->conn);
+    auto index_list = conn->provider()->get_index_list (dbi_be->conn);
     g_test_message ("Returned from index list\n");
     g_assert_cmpint (index_list.size(), == , 4);
     for (auto index : index_list)
     {
         const char* errmsg;
-        conn->provider()->drop_index (be->conn, index); 
+        conn->provider()->drop_index (dbi_be->conn, index);
         g_assert (DBI_ERROR_NONE == dbi_conn_error (conn->conn(), &errmsg));
     }
 }
@@ -237,7 +237,6 @@ compare_pricedbs (QofBook* book_1, QofBook* book_2)
 void
 compare_books (QofBook* book_1, QofBook* book_2)
 {
-    QofBackend* be = qof_book_get_backend (book_2);
     compare_account_trees (book_1, book_2);
     compare_pricedbs (book_1, book_2);
     compare_txs (book_1, book_2);
diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp
index 5590ba3..8c58f07 100644
--- a/src/backend/sql/gnc-account-sql.cpp
+++ b/src/backend/sql/gnc-account-sql.cpp
@@ -171,39 +171,39 @@ set_parent_guid (gpointer pObject,  gpointer pValue)
 }
 
 static  Account*
-load_single_account (GncSqlBackend* be, GncSqlRow& row,
+load_single_account (GncSqlBackend* sql_be, GncSqlRow& row,
                      GList** l_accounts_needing_parents)
 {
     const GncGUID* guid;
     Account* pAccount = NULL;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (l_accounts_needing_parents != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
+    guid = gnc_sql_load_guid (sql_be, row);
     if (guid != NULL)
     {
-        pAccount = xaccAccountLookup (guid, be->book());
+        pAccount = xaccAccountLookup (guid, sql_be->book());
     }
     if (pAccount == NULL)
     {
-        pAccount = xaccMallocAccount (be->book());
+        pAccount = xaccMallocAccount (sql_be->book());
     }
     xaccAccountBeginEdit (pAccount);
-    gnc_sql_load_object (be, row, GNC_ID_ACCOUNT, pAccount, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_ACCOUNT, pAccount, col_table);
     xaccAccountCommitEdit (pAccount);
 
     /* If we don't have a parent and this isn't the root account, it might be because the parent
        account hasn't been loaded yet.  Remember the account and its parent guid for later. */
     if (gnc_account_get_parent (pAccount) == NULL
-        && pAccount != gnc_book_get_root_account (be->book()))
+        && pAccount != gnc_book_get_root_account (sql_be->book()))
     {
         account_parent_guid_struct* s = static_cast<decltype (s)> (
                                             g_malloc (sizeof (account_parent_guid_struct)));
         g_assert (s != NULL);
 
         s->pAccount = pAccount;
-        gnc_sql_load_object (be, row, GNC_ID_ACCOUNT, s, parent_col_table);
+        gnc_sql_load_object (sql_be, row, GNC_ID_ACCOUNT, s, parent_col_table);
         *l_accounts_needing_parents = g_list_prepend (*l_accounts_needing_parents, s);
     }
 
@@ -211,29 +211,29 @@ load_single_account (GncSqlBackend* be, GncSqlRow& row,
 }
 
 void
-GncSqlAccountBackend::load_all (GncSqlBackend* be)
+GncSqlAccountBackend::load_all (GncSqlBackend* sql_be)
 {
     QofBook* pBook;
     GList* l_accounts_needing_parents = NULL;
     GSList* bal_slist;
     GSList* bal;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     ENTER ("");
 
-    pBook = be->book();
+    pBook = sql_be->book();
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     for (auto row : *result)
-        load_single_account (be, row, &l_accounts_needing_parents);
+        load_single_account (sql_be, row, &l_accounts_needing_parents);
 
     sql.str("");
     sql << "SELECT DISTINCT guid FROM " << TABLE_NAME;
-    gnc_sql_slots_load_for_sql_subquery (be, sql.str().c_str(),
+    gnc_sql_slots_load_for_sql_subquery (sql_be, sql.str().c_str(),
                                          (BookLookupFn)xaccAccountLookup);
 
     /* While there are items on the list of accounts needing parents,
@@ -254,7 +254,7 @@ GncSqlAccountBackend::load_all (GncSqlBackend* be)
             for (elem = l_accounts_needing_parents; elem != NULL;)
             {
                 account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data;
-                pParent = xaccAccountLookup (&s->guid, be->book());
+                pParent = xaccAccountLookup (&s->guid, sql_be->book());
                 if (pParent != NULL)
                 {
                     GList* next_elem;
@@ -293,7 +293,7 @@ GncSqlAccountBackend::load_all (GncSqlBackend* be)
     }
 
     /* Load starting balances */
-    bal_slist = gnc_sql_get_account_balances_slist (be);
+    bal_slist = gnc_sql_get_account_balances_slist (sql_be);
     for (bal = bal_slist; bal != NULL; bal = bal->next)
     {
         acct_balances_t* balances = (acct_balances_t*)bal->data;
@@ -317,7 +317,7 @@ GncSqlAccountBackend::load_all (GncSqlBackend* be)
 
 /* ================================================================= */
 bool
-GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlAccountBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     Account* pAcc = GNC_ACCOUNT (inst);
     const GncGUID* guid;
@@ -326,7 +326,7 @@ GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
     gnc_commodity* commodity;
     E_DB_OPERATION op;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_ACCOUNT (inst), FALSE);
 
@@ -345,7 +345,7 @@ GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -357,12 +357,12 @@ GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
     // If not deleting the account, ensure the commodity is in the db
     if (op != OP_DB_DELETE && commodity != NULL)
     {
-        is_ok = gnc_sql_save_commodity (be, commodity);
+        is_ok = gnc_sql_save_commodity (sql_be, commodity);
     }
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc,
                                          col_table);
     }
 
@@ -372,11 +372,11 @@ GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -388,31 +388,31 @@ GncSqlAccountBackend::commit (GncSqlBackend* be, QofInstance* inst)
 /* ================================================================= */
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return xaccAccountLookup(g, be->book());
+                       [sql_be](GncGUID* g){
+                           return xaccAccountLookup(g, sql_be->book());
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ACCOUNTREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-account-sql.h b/src/backend/sql/gnc-account-sql.h
index c6e0935..84c01d8 100644
--- a/src/backend/sql/gnc-account-sql.h
+++ b/src/backend/sql/gnc-account-sql.h
@@ -35,6 +35,6 @@ extern "C"
 #include "qof.h"
 }
 void gnc_sql_init_account_handler (void);
-gboolean gnc_sql_save_account (GncSqlBackend* be, QofInstance* inst);
+gboolean gnc_sql_save_account (GncSqlBackend* sql_be, QofInstance* inst);
 
 #endif /* GNC_ACCOUNT_SQL_H */
diff --git a/src/backend/sql/gnc-address-sql.cpp b/src/backend/sql/gnc-address-sql.cpp
index 0c280c0..63bf9ce 100644
--- a/src/backend/sql/gnc-address-sql.cpp
+++ b/src/backend/sql/gnc-address-sql.cpp
@@ -73,7 +73,7 @@ typedef void (*AddressSetterFunc) (gpointer, GncAddress*);
 typedef GncAddress* (*AddressGetterFunc) (const gpointer);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* sql_be,
                                               GncSqlRow& row,
                                               QofIdTypeConst obj_name,
                                               gpointer pObject) const noexcept
@@ -81,10 +81,10 @@ GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* be,
     const gchar* s;
 
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pObject != NULL);
 
-    auto addr = gncAddressCreate (be->book(), QOF_INSTANCE(pObject));
+    auto addr = gncAddressCreate (sql_be->book(), QOF_INSTANCE(pObject));
 
     for (auto const& subtable_row : col_table)
     {
@@ -107,10 +107,10 @@ GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(const GncSqlBackend* sql_be,
                                                   ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     for (auto const& subtable_row : col_table)
     {
         auto buf = std::string{m_col_name} + "_" + subtable_row->m_col_name;
@@ -124,7 +124,7 @@ GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(const GncSqlBackend* be,
  * it to operator<<().
  */
 template<> void
-GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp
index 61cfb46..892dc0f 100644
--- a/src/backend/sql/gnc-backend-sql.cpp
+++ b/src/backend/sql/gnc-backend-sql.cpp
@@ -88,17 +88,17 @@ extern "C"
 #define VERSION_COL_NAME "table_version"
 
 static void gnc_sql_init_object_handlers (void);
-static GncSqlStatementPtr build_insert_statement (GncSqlBackend* be,
+static GncSqlStatementPtr build_insert_statement (GncSqlBackend* sql_be,
                                                   const gchar* table_name,
                                                   QofIdTypeConst obj_name,
                                                   gpointer pObject,
                                                   const EntryVec& table);
-static GncSqlStatementPtr build_update_statement (GncSqlBackend* be,
+static GncSqlStatementPtr build_update_statement (GncSqlBackend* sql_be,
                                                   const gchar* table_name,
                                                   QofIdTypeConst obj_name,
                                                   gpointer pObject,
                                                   const EntryVec& table);
-static GncSqlStatementPtr build_delete_statement (GncSqlBackend* be,
+static GncSqlStatementPtr build_delete_statement (GncSqlBackend* sql_be,
                                                   const gchar* table_name,
                                                   QofIdTypeConst obj_name,
                                                   gpointer pObject,
@@ -119,7 +119,7 @@ typedef struct
 {
     gboolean is_known;
     gboolean is_ok;
-    GncSqlBackend* be;
+    GncSqlBackend* sql_be;
     QofInstance* inst;
     QofQuery* pQuery;
     gpointer pCompiledQuery;
@@ -165,7 +165,7 @@ gnc_sql_get_object_backend(const std::string& type)
 }
 
 void
-gnc_sql_init(GncSqlBackend* be)
+gnc_sql_init(GncSqlBackend* sql_be)
 {
     static gboolean initialized = FALSE;
 
@@ -179,14 +179,14 @@ gnc_sql_init(GncSqlBackend* be)
 /* ================================================================= */
 
 static void
-create_tables(const OBEEntry& entry, GncSqlBackend* be)
+create_tables(const OBEEntry& entry, GncSqlBackend* sql_be)
 {
     std::string type;
     GncSqlObjectBackendPtr obe = nullptr;
     std::tie(type, obe) = entry;
     g_return_if_fail (obe->is_version (GNC_SQL_BACKEND_VERSION));
-    be->update_progress();
-    obe->create_tables(be);
+    sql_be->update_progress();
+    obe->create_tables(sql_be);
 }
 
 /* ================================================================= */
@@ -200,7 +200,7 @@ static const StrVec business_fixed_load_order =
 { GNC_ID_BILLTERM, GNC_ID_TAXTABLE, GNC_ID_INVOICE };
 
 static void
-initial_load(const OBEEntry& entry, GncSqlBackend* be)
+initial_load(const OBEEntry& entry, GncSqlBackend* sql_be)
 {
     std::string type;
     GncSqlObjectBackendPtr obe = nullptr;
@@ -215,11 +215,11 @@ initial_load(const OBEEntry& entry, GncSqlBackend* be)
     if (std::find(business_fixed_load_order.begin(), business_fixed_load_order.end(),
                   type) != business_fixed_load_order.end()) return;
 
-    obe->load_all (be);
+    obe->load_all (sql_be);
 }
 
 void
-gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* be,
+gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* sql_be,
                                                 gpointer comm)
 {
     post_load_commodities = g_list_prepend (post_load_commodities, comm);
@@ -233,21 +233,21 @@ commit_commodity (gpointer data)
 }
 
 void
-gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
+gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book, QofBackendLoadType loadType)
 {
     Account* root;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (book != NULL);
 
-    ENTER ("be=%p, book=%p", be, book);
+    ENTER ("sql_be=%p, book=%p", sql_be, book);
 
-    be->m_loading = TRUE;
+    sql_be->m_loading = TRUE;
 
     if (loadType == LOAD_TYPE_INITIAL_LOAD)
     {
-        g_assert (be->m_book == NULL);
-        be->m_book = book;
+        g_assert (sql_be->m_book == NULL);
+        sql_be->m_book = book;
 
         /* Load any initial stuff. Some of this needs to happen in a certain order */
         for (auto type : fixed_load_order)
@@ -255,8 +255,8 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
             auto obe = gnc_sql_get_object_backend(type);
             if (obe)
             {
-                be->update_progress();
-                obe->load_all (be);
+                sql_be->update_progress();
+                obe->load_all (sql_be);
             }
         }
         for (auto type : business_fixed_load_order)
@@ -264,8 +264,8 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
             auto obe = gnc_sql_get_object_backend(type);
             if (obe)
             {
-                be->update_progress();
-                obe->load_all (be);
+                sql_be->update_progress();
+                obe->load_all (sql_be);
             }
         }
 
@@ -274,7 +274,7 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
                                        nullptr);
 
         for (auto entry : backend_registry)
-            initial_load(entry, be);
+            initial_load(entry, sql_be);
 
         gnc_account_foreach_descendant(root, (AccountCb)xaccAccountCommitEdit,
                                        nullptr);
@@ -283,10 +283,10 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
     {
         // Load all transactions
         auto obe = gnc_sql_get_object_backend (GNC_ID_TRANS);
-        obe->load_all (be);
+        obe->load_all (sql_be);
     }
 
-    be->m_loading = FALSE;
+    sql_be->m_loading = FALSE;
     g_list_free_full (post_load_commodities, commit_commodity);
     post_load_commodities = NULL;
 
@@ -294,7 +294,7 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
      * dirty with this backend
      */
     qof_book_mark_session_saved (book);
-    be->finish_progress();
+    sql_be->finish_progress();
 
     LEAVE ("");
 }
@@ -302,45 +302,45 @@ gnc_sql_load (GncSqlBackend* be,  QofBook* book, QofBackendLoadType loadType)
 /* ================================================================= */
 
 static gboolean
-write_account_tree (GncSqlBackend* be, Account* root)
+write_account_tree (GncSqlBackend* sql_be, Account* root)
 {
     GList* descendants;
     GList* node;
     gboolean is_ok = TRUE;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (root != NULL, FALSE);
 
     auto obe = gnc_sql_get_object_backend (GNC_ID_ACCOUNT);
-    is_ok = obe->commit (be, QOF_INSTANCE (root));
+    is_ok = obe->commit (sql_be, QOF_INSTANCE (root));
     if (is_ok)
     {
         descendants = gnc_account_get_descendants (root);
         for (node = descendants; node != NULL && is_ok; node = g_list_next (node))
         {
-            is_ok = obe->commit(be, QOF_INSTANCE (GNC_ACCOUNT (node->data)));
+            is_ok = obe->commit(sql_be, QOF_INSTANCE (GNC_ACCOUNT (node->data)));
             if (!is_ok) break;
         }
         g_list_free (descendants);
     }
-    be->update_progress();
+    sql_be->update_progress();
 
     return is_ok;
 }
 
 static gboolean
-write_accounts (GncSqlBackend* be)
+write_accounts (GncSqlBackend* sql_be)
 {
     gboolean is_ok;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    be->update_progress();
-    is_ok = write_account_tree (be, gnc_book_get_root_account (be->book()));
+    sql_be->update_progress();
+    is_ok = write_account_tree (sql_be, gnc_book_get_root_account (sql_be->book()));
     if (is_ok)
     {
-        be->update_progress();
-        is_ok = write_account_tree (be, gnc_book_get_template_root (be->book()));
+        sql_be->update_progress();
+        is_ok = write_account_tree (sql_be, gnc_book_get_template_root (sql_be->book()));
     }
 
     return is_ok;
@@ -367,54 +367,54 @@ write_tx (Transaction* tx, gpointer data)
 }
 
 static gboolean
-write_transactions (GncSqlBackend* be)
+write_transactions (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     auto obe = gnc_sql_get_object_backend(GNC_ID_TRANS);
-    write_objects_t data{be, true, obe};
+    write_objects_t data{sql_be, true, obe};
 
     (void)xaccAccountTreeForEachTransaction (
-        gnc_book_get_root_account (be->book()), write_tx, &data);
-    be->update_progress();
+        gnc_book_get_root_account (sql_be->book()), write_tx, &data);
+    sql_be->update_progress();
     return data.is_ok;
 }
 
 static gboolean
-write_template_transactions (GncSqlBackend* be)
+write_template_transactions (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     auto obe = gnc_sql_get_object_backend(GNC_ID_TRANS);
-    write_objects_t data{be, true, obe};
-    auto ra = gnc_book_get_template_root (be->book());
+    write_objects_t data{sql_be, true, obe};
+    auto ra = gnc_book_get_template_root (sql_be->book());
     if (gnc_account_n_descendants (ra) > 0)
     {
         (void)xaccAccountTreeForEachTransaction (ra, write_tx, &data);
-        be->update_progress();
+        sql_be->update_progress();
     }
 
     return data.is_ok;
 }
 
 static gboolean
-write_schedXactions (GncSqlBackend* be)
+write_schedXactions (GncSqlBackend* sql_be)
 {
     GList* schedXactions;
     SchedXaction* tmpSX;
     gboolean is_ok = TRUE;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    schedXactions = gnc_book_get_schedxactions (be->book())->sx_list;
+    schedXactions = gnc_book_get_schedxactions (sql_be->book())->sx_list;
     auto obe = gnc_sql_get_object_backend(GNC_ID_SCHEDXACTION);
 
     for (; schedXactions != NULL && is_ok; schedXactions = schedXactions->next)
     {
         tmpSX = static_cast<decltype (tmpSX)> (schedXactions->data);
-        is_ok = obe->commit (be, QOF_INSTANCE (tmpSX));
+        is_ok = obe->commit (sql_be, QOF_INSTANCE (tmpSX));
     }
-    be->update_progress();
+    sql_be->update_progress();
 
     return is_ok;
 }
@@ -428,7 +428,7 @@ static EntryVec version_table
 
 GncSqlBackend::GncSqlBackend(GncSqlConnection *conn, QofBook* book,
                              const char* format) :
-        be {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+    qof_be {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
             nullptr, nullptr, nullptr, nullptr, ERR_BACKEND_NO_ERR, nullptr, 0,
             nullptr}, m_conn{conn}, m_book{book}, m_loading{false},
         m_in_query{false}, m_is_pristine_db{false}, m_timespec_format{format}
@@ -536,15 +536,15 @@ GncSqlBackend::add_columns_to_table(const std::string& table_name,
 void
 GncSqlBackend::update_progress() const noexcept
 {
-    if (be.percentage != nullptr)
-        (be.percentage) (nullptr, 101.0);
+    if (qof_be.percentage != nullptr)
+        (qof_be.percentage) (nullptr, 101.0);
 }
 
 void
 GncSqlBackend::finish_progress() const noexcept
 {
-    if (be.percentage != nullptr)
-        (be.percentage) (nullptr, -1.0);
+    if (qof_be.percentage != nullptr)
+        (qof_be.percentage) (nullptr, -1.0);
 }
 
 /**
@@ -719,61 +719,61 @@ GncSqlBackend::time64_to_string (time64 t) const noexcept
 #pragma GCC diagnostic warning "-Wformat-nonliteral"
 
 void
-gnc_sql_sync_all (GncSqlBackend* be,  QofBook* book)
+gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book)
 {
     gboolean is_ok;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (book != NULL);
 
-    be->reset_version_info();
-    ENTER ("book=%p, be->book=%p", book, be->book());
-    be->update_progress();
+    sql_be->reset_version_info();
+    ENTER ("book=%p, sql_be->book=%p", book, sql_be->book());
+    sql_be->update_progress();
 
     /* Create new tables */
-    be->m_is_pristine_db = true;
+    sql_be->m_is_pristine_db = true;
     for(auto entry : backend_registry)
-        create_tables(entry, be);
+        create_tables(entry, sql_be);
 
     /* Save all contents */
-    be->m_book = book;
-    is_ok = be->m_conn->begin_transaction ();
+    sql_be->m_book = book;
+    is_ok = sql_be->m_conn->begin_transaction ();
 
     // FIXME: should write the set of commodities that are used
-    //write_commodities( be, book );
+    //write_commodities( sql_be, book );
     if (is_ok)
     {
         auto obe = gnc_sql_get_object_backend(GNC_ID_BOOK);
-        is_ok = obe->commit (be, QOF_INSTANCE (book));
+        is_ok = obe->commit (sql_be, QOF_INSTANCE (book));
     }
     if (is_ok)
     {
-        is_ok = write_accounts (be);
+        is_ok = write_accounts (sql_be);
     }
     if (is_ok)
     {
-        is_ok = write_transactions (be);
+        is_ok = write_transactions (sql_be);
     }
     if (is_ok)
     {
-        is_ok = write_template_transactions (be);
+        is_ok = write_template_transactions (sql_be);
     }
     if (is_ok)
     {
-        is_ok = write_schedXactions (be);
+        is_ok = write_schedXactions (sql_be);
     }
     if (is_ok)
     {
         for (auto entry : backend_registry)
-            std::get<1>(entry)->write (be);
+            std::get<1>(entry)->write (sql_be);
     }
     if (is_ok)
     {
-        is_ok = be->m_conn->commit_transaction ();
+        is_ok = sql_be->m_conn->commit_transaction ();
     }
     if (is_ok)
     {
-        be->m_is_pristine_db = false;
+        sql_be->m_is_pristine_db = false;
 
         /* Mark the session as clean -- though it shouldn't ever get
          * marked dirty with this backend
@@ -782,11 +782,11 @@ gnc_sql_sync_all (GncSqlBackend* be,  QofBook* book)
     }
     else
     {
-        if (!qof_backend_check_error ((QofBackend*)be))
-            qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_SERVER_ERR);
-        is_ok = be->m_conn->rollback_transaction ();
+        if (!qof_backend_check_error ((QofBackend*)sql_be))
+            qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_SERVER_ERR);
+        is_ok = sql_be->m_conn->rollback_transaction ();
     }
-    be->finish_progress();
+    sql_be->finish_progress();
     LEAVE ("book=%p", book);
 }
 
@@ -794,9 +794,9 @@ gnc_sql_sync_all (GncSqlBackend* be,  QofBook* book)
 /* Routines to deal with the creation of multiple books. */
 
 void
-gnc_sql_begin_edit (GncSqlBackend* be, QofInstance* inst)
+gnc_sql_begin_edit (GncSqlBackend* sql_be, QofInstance* inst)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (inst != NULL);
 
     ENTER (" ");
@@ -804,9 +804,9 @@ gnc_sql_begin_edit (GncSqlBackend* be, QofInstance* inst)
 }
 
 void
-gnc_sql_rollback_edit (GncSqlBackend* be, QofInstance* inst)
+gnc_sql_rollback_edit (GncSqlBackend* sql_be, QofInstance* inst)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (inst != NULL);
 
     ENTER (" ");
@@ -827,7 +827,7 @@ commit(const OBEEntry& entry, sql_backend* be_data)
     if (type != std::string{be_data->inst->e_type}) return;
     if (be_data->is_known) return;
 
-    be_data->is_ok = obe->commit (be_data->be, be_data->inst);
+    be_data->is_ok = obe->commit (be_data->sql_be, be_data->inst);
     be_data->is_known = TRUE;
 }
 
@@ -835,25 +835,25 @@ commit(const OBEEntry& entry, sql_backend* be_data)
  * type and call its commit handler
  */
 void
-gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
+gnc_sql_commit_edit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     sql_backend be_data;
     gboolean is_dirty;
     gboolean is_destroying;
     gboolean is_infant;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (inst != NULL);
 
-    if (qof_book_is_readonly (be->book()))
+    if (qof_book_is_readonly (sql_be->book()))
     {
-        qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_READONLY);
-        (void)be->m_conn->rollback_transaction ();
+        qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_READONLY);
+        (void)sql_be->m_conn->rollback_transaction ();
         return;
     }
     /* During initial load where objects are being created, don't commit
     anything, but do mark the object as clean. */
-    if (be->m_loading)
+    if (sql_be->m_loading)
     {
         qof_instance_mark_clean (inst);
         return;
@@ -863,7 +863,7 @@ gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
     if (strcmp (inst->e_type, "PriceDB") == 0)
     {
         qof_instance_mark_clean (inst);
-        qof_book_mark_session_saved (be->book());
+        qof_book_mark_session_saved (sql_be->book());
         return;
     }
 
@@ -883,7 +883,7 @@ gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
         return;
     }
 
-    if (!be->m_conn->begin_transaction ())
+    if (!sql_be->m_conn->begin_transaction ())
     {
         PERR ("gnc_sql_commit_edit(): begin_transaction failed\n");
         LEAVE ("Rolled back - database transaction begin error");
@@ -891,7 +891,7 @@ gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
     }
 
     be_data.is_known = FALSE;
-    be_data.be = be;
+    be_data.sql_be = sql_be;
     be_data.inst = inst;
     be_data.is_ok = TRUE;
 
@@ -901,10 +901,10 @@ gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
     if (!be_data.is_known)
     {
         PERR ("gnc_sql_commit_edit(): Unknown object type '%s'\n", inst->e_type);
-        (void)be->m_conn->rollback_transaction ();
+        (void)sql_be->m_conn->rollback_transaction ();
 
         // Don't let unknown items still mark the book as being dirty
-        qof_book_mark_session_saved (be->book());
+        qof_book_mark_session_saved (sql_be->book());
         qof_instance_mark_clean (inst);
         LEAVE ("Rolled back - unknown object type");
         return;
@@ -912,16 +912,16 @@ gnc_sql_commit_edit (GncSqlBackend* be, QofInstance* inst)
     if (!be_data.is_ok)
     {
         // Error - roll it back
-        (void)be->m_conn->rollback_transaction ();
+        (void)sql_be->m_conn->rollback_transaction ();
 
         // This *should* leave things marked dirty
         LEAVE ("Rolled back - database error");
         return;
     }
 
-    (void)be->m_conn->commit_transaction ();
+    (void)sql_be->m_conn->commit_transaction ();
 
-    qof_book_mark_session_saved (be->book());
+    qof_book_mark_session_saved (sql_be->book());
     qof_instance_mark_clean (inst);
 
     LEAVE ("");
@@ -1097,22 +1097,22 @@ compile_query(const OBEEntry& entry, sql_backend* be_data)
     be_data->is_ok = TRUE;
 }
 
-gchar* gnc_sql_compile_query_to_sql (GncSqlBackend* be, QofQuery* query);
+gchar* gnc_sql_compile_query_to_sql (GncSqlBackend* sql_be, QofQuery* query);
 
 gpointer
-gnc_sql_compile_query (QofBackend* pBEnd, QofQuery* pQuery)
+gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery)
 {
-    GncSqlBackend* be = (GncSqlBackend*)pBEnd;
+    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
     QofIdType searchObj;
     sql_backend be_data;
     gnc_sql_query_info* pQueryInfo;
 
-    g_return_val_if_fail (pBEnd != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (pQuery != NULL, NULL);
 
     ENTER (" ");
 
-//gnc_sql_compile_query_to_sql( be, pQuery );
+//gnc_sql_compile_query_to_sql( sql_be, pQuery );
     searchObj = qof_query_get_search_for (pQuery);
 
     pQueryInfo = static_cast<decltype (pQueryInfo)> (
@@ -1123,7 +1123,7 @@ gnc_sql_compile_query (QofBackend* pBEnd, QofQuery* pQuery)
 
     // Try various objects first
     be_data.is_ok = FALSE;
-    be_data.be = be;
+    be_data.be = sql_be;
     be_data.pQuery = pQuery;
     be_data.pQueryInfo = pQueryInfo;
 
@@ -1147,12 +1147,12 @@ convert_search_obj (QofIdType objType)
 }
 
 gchar*
-gnc_sql_compile_query_to_sql (GncSqlBackend* be, QofQuery* query)
+gnc_sql_compile_query_to_sql (GncSqlBackend* sql_be, QofQuery* query)
 {
     QofIdType searchObj;
     GString* sql;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (query != NULL, NULL);
 
     searchObj = qof_query_get_search_for (query);
@@ -1210,20 +1210,20 @@ free_query(const OBEEntry& entry, sql_backend* be_data)
 }
 
 void
-gnc_sql_free_query (QofBackend* pBEnd, gpointer pQuery)
+gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery)
 {
-    GncSqlBackend* be = (GncSqlBackend*)pBEnd;
+    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
     gnc_sql_query_info* pQueryInfo = (gnc_sql_query_info*)pQuery;
     sql_backend be_data;
 
-    g_return_if_fail (pBEnd != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pQuery != NULL);
 
     ENTER (" ");
 
     // Try various objects first
     be_data.is_ok = FALSE;
-    be_data.be = be;
+    be_data.be = sql_be;
     be_data.pCompiledQuery = pQuery;
     be_data.pQueryInfo = pQueryInfo;
 
@@ -1265,32 +1265,32 @@ run_query(const OBEEntry& entry, sql_backend* be_data)
 }
 
 void
-gnc_sql_run_query (QofBackend* pBEnd, gpointer pQuery)
+gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery)
 {
-    GncSqlBackend* be = (GncSqlBackend*)pBEnd;
+    GncSqlBackend* sql_be = reinterpret_cast<decltype(sql_be)>(qof_be);
     gnc_sql_query_info* pQueryInfo = (gnc_sql_query_info*)pQuery;
     sql_backend be_data;
 
-    g_return_if_fail (pBEnd != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pQuery != NULL);
-    g_return_if_fail (!be->in_query);
+    g_return_if_fail (!sql_be->in_query);
 
     ENTER (" ");
 
-    be->loading = TRUE;
-    be->in_query = TRUE;
+    sql_be->loading = TRUE;
+    sql_be->in_query = TRUE;
 
     qof_event_suspend ();
 
     // Try various objects first
     be_data.is_ok = FALSE;
-    be_data.be = be;
+    be_data.be = sql_be;
     be_data.pCompiledQuery = pQueryInfo->pCompiledQuery;
     be_data.pQueryInfo = pQueryInfo;
     for (auto entry : backend_registry)
         run_query(entry, &be_data);
-    be->loading = FALSE;
-    be->in_query = FALSE;
+    sql_be->loading = FALSE;
+    sql_be->in_query = FALSE;
     qof_event_resume ();
 //    if( be_data.is_ok ) {
 //        LEAVE( "" );
@@ -1298,7 +1298,7 @@ gnc_sql_run_query (QofBackend* pBEnd, gpointer pQuery)
 //    }
 
     // Mark the book as clean
-    qof_instance_mark_clean (QOF_INSTANCE (be->book()));
+    qof_instance_mark_clean (QOF_INSTANCE (sql_be->book()));
 
 //    DEBUG( "%s\n", (gchar*)pQueryInfo->pCompiledQuery );
 
@@ -1398,7 +1398,7 @@ GncSqlColumnTableEntry::get_setter(QofIdTypeConst obj_name) const noexcept
 }
 
 void
-GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* be,
+GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* sql_be,
                                                      QofIdTypeConst obj_name,
                                                      const gpointer pObject,
                                                      PairVec& vec) const noexcept
@@ -1412,10 +1412,10 @@ GncSqlColumnTableEntry::add_objectref_guid_to_query (const GncSqlBackend* be,
 }
 
 void
-GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* be,
+GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* sql_be,
                                                      ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
     vec.emplace_back(std::move(info));
@@ -1424,7 +1424,7 @@ GncSqlColumnTableEntry::add_objectref_guid_to_table (const GncSqlBackend* be,
 
 /* ----------------------------------------------------------------- */
 template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* sql_be,
                                              GncSqlRow& row,
                                              QofIdTypeConst obj_name,
                                              gpointer pObject) const noexcept
@@ -1441,10 +1441,10 @@ GncSqlColumnTableEntryImpl<CT_STRING>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* sql_be,
                                                   ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_STRING, m_size, TRUE};
     vec.emplace_back(std::move(info));
@@ -1454,7 +1454,7 @@ GncSqlColumnTableEntryImpl<CT_STRING>::add_to_table(const GncSqlBackend* be,
  * it to operator<<().
  */
 template<> void
-GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_STRING>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
@@ -1475,7 +1475,8 @@ typedef gint (*IntAccessFunc) (const gpointer);
 typedef void (*IntSetterFunc) (const gpointer, gint);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* be, GncSqlRow& row,
+GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* sql_be,
+                                          GncSqlRow& row,
                                           QofIdTypeConst obj_name,
                                           gpointer pObject) const noexcept
 {
@@ -1489,22 +1490,22 @@ GncSqlColumnTableEntryImpl<CT_INT>::load (const GncSqlBackend* be, GncSqlRow& ro
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INT>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_value_to_vec<int>(be, obj_name, pObject, vec);
+    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
@@ -1512,7 +1513,7 @@ typedef gboolean (*BooleanAccessFunc) (const gpointer);
 typedef void (*BooleanSetterFunc) (const gpointer, gboolean);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* sql_be,
                                               GncSqlRow& row,
                                               QofIdTypeConst obj_name,
                                               gpointer pObject)
@@ -1528,22 +1529,22 @@ GncSqlColumnTableEntryImpl<CT_BOOLEAN>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_INT, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BOOLEAN>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_value_to_vec<int>(be, obj_name, pObject, vec);
+    add_value_to_vec<int>(sql_be, obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
@@ -1551,7 +1552,7 @@ typedef gint64 (*Int64AccessFunc) (const gpointer);
 typedef void (*Int64SetterFunc) (const gpointer, gint64);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* sql_be,
                                             GncSqlRow& row,
                                             QofIdTypeConst obj_name,
                                             gpointer pObject)
@@ -1566,27 +1567,27 @@ GncSqlColumnTableEntryImpl<CT_INT64>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_table(const GncSqlBackend* sql_be,
                                                    ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_INT64, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INT64>::add_to_query(const GncSqlBackend* sql_be,
                                                    QofIdTypeConst obj_name,
                                                    const gpointer pObject,
                                                    PairVec& vec) const noexcept
 {
-    add_value_to_vec<int64_t>(be, obj_name, pObject, vec);
+    add_value_to_vec<int64_t>(sql_be, obj_name, pObject, vec);
 }
 /* ----------------------------------------------------------------- */
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* sql_be,
                                              GncSqlRow& row,
                                              QofIdTypeConst obj_name,
                                              gpointer pObject)
@@ -1621,28 +1622,28 @@ GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_DOUBLE, 0, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_DOUBLE>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_value_to_vec<double*>(be, obj_name, pObject, vec);
+    add_value_to_vec<double*>(sql_be, obj_name, pObject, vec);
 }
 
 /* ----------------------------------------------------------------- */
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* sql_be,
                                            GncSqlRow& row,
                                            QofIdTypeConst obj_name,
                                            gpointer pObject)
@@ -1669,17 +1670,17 @@ GncSqlColumnTableEntryImpl<CT_GUID>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this, BCT_STRING, GUID_ENCODING_LENGTH, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
@@ -1702,7 +1703,7 @@ typedef void (*TimespecSetterFunc) (const gpointer, Timespec*);
 #define TIMESPEC_COL_SIZE (4+2+2+2+2+2)
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
                                                GncSqlRow& row,
                                                QofIdTypeConst obj_name,
                                                gpointer pObject) const noexcept
@@ -1744,17 +1745,17 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* be,
  }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (sql_be != nullptr);
 
     GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* sql_be,
                                                       QofIdTypeConst obj_name,
                                                       const gpointer pObject,
                                                       PairVec& vec) const noexcept
@@ -1765,7 +1766,7 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* be,
  * Timespec* and the getter returns a Timespec. Will be fixed by the
  * replacement of timespecs with time64s.
  */
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
@@ -1784,7 +1785,7 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* be,
 
     if (ts.tv_sec != 0 || ts.tv_nsec != 0)
     {
-        auto datebuf = be->time64_to_string (ts.tv_sec);
+        auto datebuf = sql_be->time64_to_string (ts.tv_sec);
         vec.emplace_back (std::make_pair (std::string{m_col_name}, datebuf));
         return;
     }
@@ -1794,7 +1795,7 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(const GncSqlBackend* be,
 #define DATE_COL_SIZE 8
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* sql_be,
                                             GncSqlRow& row,
                                             QofIdTypeConst obj_name,
                                             gpointer pObject) const noexcept
@@ -1840,17 +1841,17 @@ GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     GncSqlColumnInfo info{*this,  BCT_DATE, DATE_COL_SIZE, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_GDATE>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
@@ -1879,7 +1880,7 @@ static const EntryVec numeric_col_table =
 };
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* sql_be,
                                               GncSqlRow& row,
                                               QofIdTypeConst obj_name,
                                               gpointer pObject) const noexcept
@@ -1908,10 +1909,10 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* sql_be,
                                                      ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     for (auto const& subtable_row : numeric_col_table)
     {
@@ -1924,7 +1925,7 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_table(const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* sql_be,
                                                      QofIdTypeConst obj_name,
                                                      const gpointer pObject,
                                                      PairVec& vec) const noexcept
@@ -1933,7 +1934,7 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(const GncSqlBackend* be,
     NumericGetterFunc getter;
     gnc_numeric n;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
@@ -1990,13 +1991,13 @@ static EntryVec guid_table
 };
 
 const GncGUID*
-gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow& row)
+gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row)
 {
     static GncGUID guid;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    gnc_sql_load_object (be, row, NULL, &guid, guid_table);
+    gnc_sql_load_object (sql_be, row, NULL, &guid, guid_table);
 
     return &guid;
 }
@@ -2008,32 +2009,32 @@ static EntryVec tx_guid_table
  };
 
 void
-gnc_sql_load_object (const GncSqlBackend* be, GncSqlRow& row,
+gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
                      QofIdTypeConst obj_name, gpointer pObject,
                      const EntryVec& table)
 {
     QofSetterFunc setter;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pObject != NULL);
 
     for (auto const& table_row : table)
     {
-        table_row->load (be, row, obj_name, pObject);
+        table_row->load (sql_be, row, obj_name, pObject);
     }
 }
 
 /* ================================================================= */
 static GncSqlStatementPtr
-create_single_col_select_statement (GncSqlBackend* be,
+create_single_col_select_statement (GncSqlBackend* sql_be,
                                     const gchar* table_name,
                                     const GncSqlColumnTableEntryPtr table_row)
 {
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (table_name != NULL, NULL);
 
     auto sql = std::string{"SELECT "} + table_row->name() + " FROM " + table_name;
-    return be->create_statement_from_sql(sql.c_str());
+    return sql_be->create_statement_from_sql(sql.c_str());
 }
 
 /* ================================================================= */
@@ -2058,7 +2059,7 @@ gnc_sql_append_guids_to_sql (std::stringstream& sql, const InstanceVec& instance
 }
 /* ================================================================= */
 static PairVec
-get_object_values (GncSqlBackend* be, QofIdTypeConst obj_name,
+get_object_values (GncSqlBackend* sql_be, QofIdTypeConst obj_name,
                    gpointer pObject, const EntryVec& table)
 {
     PairVec vec;
@@ -2067,31 +2068,31 @@ get_object_values (GncSqlBackend* be, QofIdTypeConst obj_name,
     {
         if (!(table_row->is_autoincr()))
         {
-            table_row->add_to_query (be, obj_name, pObject, vec);
+            table_row->add_to_query (sql_be, obj_name, pObject, vec);
         }
     }
     return vec;
 }
 
 gboolean
-gnc_sql_object_is_it_in_db (GncSqlBackend* be, const gchar* table_name,
+gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be, const gchar* table_name,
                             QofIdTypeConst obj_name, gpointer pObject,
                             const EntryVec& table)
 {
     guint count;
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (table_name != NULL, FALSE);
     g_return_val_if_fail (obj_name != NULL, FALSE);
     g_return_val_if_fail (pObject != NULL, FALSE);
 
     /* SELECT * FROM */
-    auto stmt = create_single_col_select_statement (be, table_name, table[0]);
+    auto stmt = create_single_col_select_statement (sql_be, table_name, table[0]);
     g_assert (stmt != NULL);
 
     /* WHERE */
-    PairVec values{get_object_values(be, obj_name, pObject, table)};
+    PairVec values{get_object_values(sql_be, obj_name, pObject, table)};
     stmt->add_where_cond(obj_name, values);
-    auto result = be->execute_select_statement (stmt);
+    auto result = sql_be->execute_select_statement (stmt);
     if (result != NULL)
     {
         auto retval = result->size() > 0;
@@ -2101,7 +2102,7 @@ gnc_sql_object_is_it_in_db (GncSqlBackend* be, const gchar* table_name,
 }
 
 gboolean
-gnc_sql_do_db_operation (GncSqlBackend* be,
+gnc_sql_do_db_operation (GncSqlBackend* sql_be,
                          E_DB_OPERATION op,
                          const gchar* table_name,
                          QofIdTypeConst obj_name, gpointer pObject,
@@ -2110,35 +2111,35 @@ gnc_sql_do_db_operation (GncSqlBackend* be,
     GncSqlStatementPtr stmt;
     bool ok = false;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (table_name != NULL, FALSE);
     g_return_val_if_fail (obj_name != NULL, FALSE);
     g_return_val_if_fail (pObject != NULL, FALSE);
 
     if (op == OP_DB_INSERT)
     {
-        stmt = build_insert_statement (be, table_name, obj_name, pObject, table);
+        stmt = build_insert_statement (sql_be, table_name, obj_name, pObject, table);
     }
     else if (op == OP_DB_UPDATE)
     {
-        stmt = build_update_statement (be, table_name, obj_name, pObject, table);
+        stmt = build_update_statement (sql_be, table_name, obj_name, pObject, table);
     }
     else if (op == OP_DB_DELETE)
     {
-        stmt = build_delete_statement (be, table_name, obj_name, pObject, table);
+        stmt = build_delete_statement (sql_be, table_name, obj_name, pObject, table);
     }
     else
     {
         g_assert (FALSE);
     }
-    if (be->execute_nonselect_statement (stmt) != -1)
+    if (sql_be->execute_nonselect_statement (stmt) != -1)
         ok = true;
 
     return ok;
 }
 
 static GncSqlStatementPtr
-build_insert_statement (GncSqlBackend* be,
+build_insert_statement (GncSqlBackend* sql_be,
                         const gchar* table_name,
                         QofIdTypeConst obj_name, gpointer pObject,
                         const EntryVec& table)
@@ -2147,11 +2148,11 @@ build_insert_statement (GncSqlBackend* be,
     PairVec col_values;
     std::ostringstream sql;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (table_name != NULL, NULL);
     g_return_val_if_fail (obj_name != NULL, NULL);
     g_return_val_if_fail (pObject != NULL, NULL);
-    PairVec values{get_object_values(be, obj_name, pObject, table)};
+    PairVec values{get_object_values(sql_be, obj_name, pObject, table)};
 
     sql << "INSERT INTO " << table_name <<"(";
     for (auto const& col_value : values)
@@ -2166,16 +2167,16 @@ build_insert_statement (GncSqlBackend* be,
     {
         if (col_value != *values.begin())
             sql << ",";
-        sql << be->quote_string(col_value.second);
+        sql << sql_be->quote_string(col_value.second);
     }
     sql << ")";
 
-    stmt = be->create_statement_from_sql(sql.str());
+    stmt = sql_be->create_statement_from_sql(sql.str());
     return stmt;
 }
 
 static GncSqlStatementPtr
-build_update_statement (GncSqlBackend* be,
+build_update_statement (GncSqlBackend* sql_be,
                         const gchar* table_name,
                         QofIdTypeConst obj_name, gpointer pObject,
                         const EntryVec& table)
@@ -2183,13 +2184,13 @@ build_update_statement (GncSqlBackend* be,
     GncSqlStatementPtr stmt;
     std::ostringstream sql;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (table_name != NULL, NULL);
     g_return_val_if_fail (obj_name != NULL, NULL);
     g_return_val_if_fail (pObject != NULL, NULL);
 
 
-    PairVec values{get_object_values (be, obj_name, pObject, table)};
+    PairVec values{get_object_values (sql_be, obj_name, pObject, table)};
 
     // Create the SQL statement
     sql <<  "UPDATE " << table_name << " SET ";
@@ -2199,10 +2200,10 @@ build_update_statement (GncSqlBackend* be,
         if (col_value != *values.begin())
             sql << ",";
         sql << col_value.first << "=" <<
-            be->quote_string(col_value.second);
+            sql_be->quote_string(col_value.second);
     }
 
-    stmt = be->create_statement_from_sql(sql.str());
+    stmt = sql_be->create_statement_from_sql(sql.str());
     /* We want our where condition to be just the first column and
      * value, i.e. the guid of the object.
      */
@@ -2212,24 +2213,24 @@ build_update_statement (GncSqlBackend* be,
 }
 
 static GncSqlStatementPtr
-build_delete_statement (GncSqlBackend* be,
+build_delete_statement (GncSqlBackend* sql_be,
                         const gchar* table_name,
                         QofIdTypeConst obj_name, gpointer pObject,
                         const EntryVec& table)
 {
     std::ostringstream sql;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (table_name != NULL, NULL);
     g_return_val_if_fail (obj_name != NULL, NULL);
     g_return_val_if_fail (pObject != NULL, NULL);
 
     sql << "DELETE FROM " << table_name;
-    auto stmt = be->create_statement_from_sql (sql.str());
+    auto stmt = sql_be->create_statement_from_sql (sql.str());
 
     /* WHERE */
     PairVec values;
-    table[0]->add_to_query (be, obj_name, pObject, values);
+    table[0]->add_to_query (sql_be, obj_name, pObject, values);
     PairVec col_values{values[0]};
     stmt->add_where_cond (obj_name, col_values);
 
@@ -2238,7 +2239,7 @@ build_delete_statement (GncSqlBackend* be,
 
 /* ================================================================= */
 bool
-GncSqlObjectBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlObjectBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     const GncGUID* guid;
     gboolean is_infant;
@@ -2250,7 +2251,7 @@ GncSqlObjectBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -2258,7 +2259,7 @@ GncSqlObjectBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (be, op, m_table_name.c_str(),
+    is_ok = gnc_sql_do_db_operation (sql_be, op, m_table_name.c_str(),
                                      m_type_name.c_str(), inst, m_col_table);
 
     if (is_ok)
@@ -2267,11 +2268,11 @@ GncSqlObjectBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -2280,14 +2281,14 @@ GncSqlObjectBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
 /* ================================================================= */
 void
-GncSqlObjectBackend::create_tables (GncSqlBackend* be)
+GncSqlObjectBackend::create_tables (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != nullptr);
-    int version = be->get_table_version (m_table_name);
-    if (version == 0) //No tables, otherwise version will be >= 1.
+    g_return_if_fail (sql_be != nullptr);
+    int version = sql_be->get_table_version (m_table_name);
+    if (version == 0) //No tables, otherwise version will sql_be >= 1.
     {
-        be->create_table(m_table_name, m_col_table);
-        be->set_table_version(m_table_name, m_version);
+        sql_be->create_table(m_table_name, m_col_table);
+        sql_be->set_table_version(m_table_name, m_version);
     }
     else if (version != m_version)
         PERR("Version mismatch in table %s, expecting %d but backend is %d."
diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h
index a81e114..9721e68 100644
--- a/src/backend/sql/gnc-backend-sql.h
+++ b/src/backend/sql/gnc-backend-sql.h
@@ -89,15 +89,11 @@ public:
     void connect(GncSqlConnection *conn) noexcept;
     /**
      * Initializes DB table version information.
-     *
-     * @param be SQL backend struct
      */
     void init_version_info() noexcept;
     bool reset_version_info() noexcept;
     /**
      * Finalizes DB table version information.
-     *
-     * @param be SQL backend struct
      */
     void finalize_version_info() noexcept;
     /* FIXME: These are just pass-throughs of m_conn functions. */
@@ -192,7 +188,7 @@ public:
     friend void gnc_sql_commit_edit(GncSqlBackend*, QofInstance*);
 
 protected:
-    QofBackend be;           /**< QOF backend. Not a pointer, nor really a member */
+    QofBackend qof_be;           /**< QOF backend. Not a pointer, nor really a member */
     GncSqlConnection* m_conn;  /**< SQL connection */
     QofBook* m_book;           /**< The primary, main open book */
     bool m_loading;        /**< We are performing an initial load */
@@ -206,60 +202,60 @@ private:
 /**
  * Initialize the SQL backend.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  */
-void gnc_sql_init (GncSqlBackend* be);
+void gnc_sql_init (GncSqlBackend* sql_be);
 
 /**
  * Load the contents of an SQL database into a book.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param book Book to be loaded
  */
-void gnc_sql_load (GncSqlBackend* be,  QofBook* book,
+void gnc_sql_load (GncSqlBackend* sql_be,  QofBook* book,
                    QofBackendLoadType loadType);
 
 /**
  * Register a commodity to be committed after loading is complete.
  *
  * Necessary to save corrections made while loading.
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param comm The commodity item to be committed.
  */
-void gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* be,
+void gnc_sql_push_commodity_for_postload_processing (GncSqlBackend* sql_be,
                                                      gpointer comm);
 
 /**
  * Save the contents of a book to an SQL database.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param book Book to be saved
  */
-void gnc_sql_sync_all (GncSqlBackend* be,  QofBook* book);
+void gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook* book);
 
 /**
  * An object is about to be edited.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param inst Object being edited
  */
-void gnc_sql_begin_edit (GncSqlBackend* be, QofInstance* inst);
+void gnc_sql_begin_edit (GncSqlBackend* sql_be, QofInstance* inst);
 
 /**
  * Object editing has been cancelled.
  *
- * @param qbe SQL backend
+ * @param qsql_be SQL backend
  * @param inst Object being edited
  */
-void gnc_sql_rollback_edit (GncSqlBackend* qbe, QofInstance* inst);
+void gnc_sql_rollback_edit (GncSqlBackend* qsql_be, QofInstance* inst);
 
 /**
  * Object editting is complete and the object should be saved.
  *
- * @param qbe SQL backend
+ * @param qsql_be SQL backend
  * @param inst Object being edited
  */
-void gnc_sql_commit_edit (GncSqlBackend* qbe, QofInstance* inst);
+void gnc_sql_commit_edit (GncSqlBackend* qsql_be, QofInstance* inst);
 
 /**
  */
@@ -421,9 +417,9 @@ public:
         m_col_table(vec) {}
     /**
      * Load all objects of m_type in the database into memory.
-     * @param be The GncSqlBackend containing the database connection.
+     * @param sql_be The GncSqlBackend containing the database connection.
      */
-    virtual void load_all (GncSqlBackend*) = 0;
+    virtual void load_all (GncSqlBackend* sql_be) = 0;
     /**
      * Conditionally create or update a database table from m_col_table. The
      * condition is the version returned by querying the database's version
@@ -432,21 +428,21 @@ public:
      * compiled version then the table schema is upgraded but the data isn't,
      * that's the engine's responsibility when the object is loaded. If the
      * version is greater than the compiled version then nothing is touched.
-     * @param be The GncSqlBackend containing the database connection.
+     * @param sql_be The GncSqlBackend containing the database connection.
      */
-    virtual void create_tables (GncSqlBackend*);
+    virtual void create_tables (GncSqlBackend* sql_be);
     /**
      * UPDATE/INSERT a single instance of m_type_name into the database.
-     * @param be The GncSqlBackend containing the database.
+     * @param sql_be The GncSqlBackend containing the database.
      * @param inst The QofInstance to be written out.
      */
-    virtual bool commit (GncSqlBackend* be, QofInstance* inst);
+    virtual bool commit (GncSqlBackend* sql_be, QofInstance* inst);
     /**
      * Write all objects of m_type_name to the database.
-     * @param be The GncSqlBackend containing the database.
+     * @param sql_be The GncSqlBackend containing the database.
      * @return true if the objects were successfully written, false otherwise.
      */
-    virtual bool write (GncSqlBackend*) { return true; }
+    virtual bool write (GncSqlBackend* sql_be) { return true; }
     /**
      * Return the m_type_name for the class. This value is created at
      * compilation time and is called QofIdType or QofIdTypeConst in other parts
@@ -486,8 +482,8 @@ GncSqlObjectBackendPtr gnc_sql_get_object_backend(const std::string& table_name)
 struct write_objects_t
 {
     write_objects_t() = default;
-    write_objects_t (GncSqlBackend* b, bool o, GncSqlObjectBackendPtr e) :
-        be{b}, is_ok{o}, obe{e} {}
+    write_objects_t (GncSqlBackend* sql_be, bool o, GncSqlObjectBackendPtr e) :
+        be{sql_be}, is_ok{o}, obe{e} {}
     void commit (QofInstance* inst) {
         if (is_ok) is_ok = obe->commit (be, inst);
     }
@@ -577,19 +573,19 @@ public:
     /**
      * Load a value into an object from the database row.
      */
-    virtual void load(const GncSqlBackend* be, GncSqlRow& row,
+    virtual void load(const GncSqlBackend* sql_be, GncSqlRow& row,
                       QofIdTypeConst obj_name, gpointer pObject) const noexcept = 0;
     /**
      * Add a GncSqlColumnInfo structure for the column type to a
      * ColVec.
      */
-    virtual void add_to_table(const GncSqlBackend* be, ColVec& vec) const noexcept = 0;
+    virtual void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept = 0;
     /**
      * Add a pair of the table column heading and object's value's string
      * representation to a PairVec; used for constructing WHERE clauses and
      * UPDATE statements.
      */
-    virtual void add_to_query(const GncSqlBackend* be, QofIdTypeConst obj_name,
+    virtual void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
                               gpointer pObject, PairVec& vec) const noexcept = 0;
     /**
      * Retrieve the getter function depending on whether it's an auto-increment
@@ -639,27 +635,27 @@ protected:
     template <typename T> T
     get_row_value_from_object(QofIdTypeConst obj_name, const gpointer pObject) const;
     template <typename T> void
-    add_value_to_vec(const GncSqlBackend* be, QofIdTypeConst obj_name,
+    add_value_to_vec(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
                      const gpointer pObject, PairVec& vec) const;
 /**
  * Adds a name/guid std::pair to a PairVec for creating a query.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param obj_name QOF object type name
  * @param pObject Object
  * @param pList List
  */
-    void add_objectref_guid_to_query (const GncSqlBackend* be,
+    void add_objectref_guid_to_query (const GncSqlBackend* sql_be,
                                       QofIdTypeConst obj_name,
                                       const gpointer pObject,
                                       PairVec& vec) const noexcept;
 /**
  * Adds a column info structure for an object reference GncGUID to a ColVec.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param pList List
  */
-    void add_objectref_guid_to_table (const GncSqlBackend* be,
+    void add_objectref_guid_to_table (const GncSqlBackend* sql_be,
                                       ColVec& vec) const noexcept;
 private:
     const char* m_col_name;        /**< Column name */
@@ -676,11 +672,11 @@ private:
     template <typename T> T get_row_value_from_object(QofIdTypeConst obj_name,
                                                       const gpointer pObject,
                                                       std::false_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* be,
+    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
                                                 QofIdTypeConst obj_name,
                                                 const gpointer pObject,
                                                 PairVec& vec, std::true_type) const;
-    template <typename T> void add_value_to_vec(const GncSqlBackend* be,
+    template <typename T> void add_value_to_vec(const GncSqlBackend* sql_be,
                                                 QofIdTypeConst obj_name,
                                                 const gpointer pObject,
                                                 PairVec& vec, std::false_type) const;
@@ -699,10 +695,10 @@ public:
                                 QofSetterFunc set = nullptr) :
         GncSqlColumnTableEntry (name, type, s, f, gobj_name,qof_name, get, set)
         {} 
-    void load(const GncSqlBackend* be, GncSqlRow& row,  QofIdTypeConst obj_name,
+    void load(const GncSqlBackend* sql_be, GncSqlRow& row,  QofIdTypeConst obj_name,
               gpointer pObject) const noexcept override;
-    void add_to_table(const GncSqlBackend* be, ColVec& vec) const noexcept override;
-    void add_to_query(const GncSqlBackend* be, QofIdTypeConst obj_name,
+    void add_to_table(const GncSqlBackend* sql_be, ColVec& vec) const noexcept override;
+    void add_to_query(const GncSqlBackend* sql_be, QofIdTypeConst obj_name,
                       gpointer pObject, PairVec& vec) const noexcept override;
 };
 
@@ -857,7 +853,7 @@ void set_parameter(T object, P item, F setter, const char* property)
 /**
  * Performs an operation on the database.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param op Operation type
  * @param table_name SQL table name
  * @param obj_name QOF object type name
@@ -865,7 +861,7 @@ void set_parameter(T object, P item, F setter, const char* property)
  * @param table DB table description
  * @return TRUE if successful, FALSE if not
  */
-gboolean gnc_sql_do_db_operation (GncSqlBackend* be,
+gboolean gnc_sql_do_db_operation (GncSqlBackend* sql_be,
                                   E_DB_OPERATION op,
                                   const gchar* table_name,
                                   QofIdTypeConst obj_name,
@@ -876,27 +872,27 @@ gboolean gnc_sql_do_db_operation (GncSqlBackend* be,
 /**
  * Loads a Gnucash object from the database.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param row DB result row
  * @param obj_name QOF object type name
  * @param pObject Object to be loaded
  * @param table DB table description
  */
-void gnc_sql_load_object (const GncSqlBackend* be, GncSqlRow& row,
+void gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,
                           QofIdTypeConst obj_name, gpointer pObject,
                           const EntryVec& table);
 
 /**
  * Checks whether an object is in the database or not.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param table_name DB table name
  * @param obj_name QOF object type name
  * @param pObject Object to be checked
  * @param table DB table description
  * @return TRUE if the object is in the database, FALSE otherwise
  */
-gboolean gnc_sql_object_is_it_in_db (GncSqlBackend* be,
+gboolean gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be,
                                      const gchar* table_name,
                                      QofIdTypeConst obj_name,
                                      const gpointer pObject,
@@ -905,12 +901,12 @@ gboolean gnc_sql_object_is_it_in_db (GncSqlBackend* be,
  * Loads the object guid from a database row.  The table must have a column
  * named "guid" with type CT_GUID.
  *
- * @param be SQL backend struct
+ * @param sql_be SQL backend struct
  * @param row Database row
  * @return GncGUID
  */
 
-const GncGUID* gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow& row);
+const GncGUID* gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row);
 
 
 /**
@@ -926,9 +922,9 @@ uint_t gnc_sql_append_guids_to_sql (std::stringstream& sql,
 
 void _retrieve_guid_ (gpointer pObject,  gpointer pValue);
 
-gpointer gnc_sql_compile_query (QofBackend* pBEnd, QofQuery* pQuery);
-void gnc_sql_free_query (QofBackend* pBEnd, gpointer pQuery);
-void gnc_sql_run_query (QofBackend* pBEnd, gpointer pQuery);
+gpointer gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery);
+void gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery);
+void gnc_sql_run_query (QofBackend* qof_be, gpointer pQuery);
 
 template <typename T> T
 GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
@@ -976,16 +972,16 @@ GncSqlColumnTableEntry::get_row_value_from_object(QofIdTypeConst obj_name,
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* be,
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
                                          QofIdTypeConst obj_name,
                                          const gpointer pObject,
                                          PairVec& vec) const
 {
-    add_value_to_vec<T>(be, obj_name, pObject, vec, std::is_pointer<T>());
+    add_value_to_vec<T>(sql_be, obj_name, pObject, vec, std::is_pointer<T>());
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* be,
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
                                          QofIdTypeConst obj_name,
                                          const gpointer pObject,
                                          PairVec& vec, std::true_type) const
@@ -1002,7 +998,7 @@ GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* be,
 }
 
 template <typename T> void
-GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* be,
+GncSqlColumnTableEntry::add_value_to_vec(const GncSqlBackend* sql_be,
                                          QofIdTypeConst obj_name,
                                          const gpointer pObject,
                                          PairVec& vec, std::false_type) const
diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp
index 2317992..d81ad51 100644
--- a/src/backend/sql/gnc-bill-term-sql.cpp
+++ b/src/backend/sql/gnc-bill-term-sql.cpp
@@ -188,21 +188,21 @@ bt_set_parent_guid (gpointer pObject,  gpointer pValue)
 }
 
 static GncBillTerm*
-load_single_billterm (GncSqlBackend* be, GncSqlRow& row,
+load_single_billterm (GncSqlBackend* sql_be, GncSqlRow& row,
                       GList** l_billterms_needing_parents)
 {
     const GncGUID* guid;
     GncBillTerm* pBillTerm;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pBillTerm = gncBillTermLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pBillTerm = gncBillTermLookup (sql_be->book(), guid);
     if (pBillTerm == NULL)
     {
-        pBillTerm = gncBillTermCreate (be->book());
+        pBillTerm = gncBillTermCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_BILLTERM, pBillTerm, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_BILLTERM, pBillTerm, col_table);
 
     /* If the billterm doesn't have a parent, it might be because it hasn't been loaded yet.
        If so, add this billterm to the list of billterms with no parent, along with the parent
@@ -215,7 +215,7 @@ load_single_billterm (GncSqlBackend* be, GncSqlRow& row,
 
         s->billterm = pBillTerm;
         s->have_guid = FALSE;
-        gnc_sql_load_object (be, row, GNC_ID_TAXTABLE, s, billterm_parent_col_table);
+        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, s, billterm_parent_col_table);
         if (s->have_guid)
         {
             *l_billterms_needing_parents = g_list_prepend (*l_billterms_needing_parents,
@@ -233,28 +233,28 @@ load_single_billterm (GncSqlBackend* be, GncSqlRow& row,
 }
 
 void
-GncSqlBillTermBackend::load_all (GncSqlBackend* be)
+GncSqlBillTermBackend::load_all (GncSqlBackend* sql_be)
 {
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
     GList* l_billterms_needing_parents = NULL;
 
     for (auto row : *result)
     {
         auto pBillTerm =
-            load_single_billterm (be, row, &l_billterms_needing_parents);
+            load_single_billterm (sql_be, row, &l_billterms_needing_parents);
         if (pBillTerm != nullptr)
             instances.push_back(QOF_INSTANCE(pBillTerm));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 
     /* While there are items on the list of billterms needing parents,
        try to see if the parent has now been loaded.  Theory says that if
@@ -292,33 +292,33 @@ do_save_billterm (QofInstance* inst, void* p2)
 }
 
 bool
-GncSqlBillTermBackend::write (GncSqlBackend* be)
+GncSqlBillTermBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    write_objects_t data {be, true, this};
-    qof_object_foreach (GNC_ID_BILLTERM, be->book(), do_save_billterm, &data);
+    write_objects_t data {sql_be, true, this};
+    qof_object_foreach (GNC_ID_BILLTERM, sql_be->book(), do_save_billterm, &data);
     return data.is_ok;
 }
 
 /* ================================================================= */
 void
-GncSqlBillTermBackend::create_tables (GncSqlBackend* be)
+GncSqlBillTermBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Billterms table upgraded from version 1 to version %d\n",
                TABLE_VERSION);
@@ -328,31 +328,31 @@ GncSqlBillTermBackend::create_tables (GncSqlBackend* be)
 /* ================================================================= */
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return gncBillTermLookup(be->book(), g);
+                       [sql_be](GncGUID* g){
+                           return gncBillTermLookup(sql_be->book(), g);
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BILLTERMREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-book-sql.cpp b/src/backend/sql/gnc-book-sql.cpp
index 3fd70df..fc5bd96 100644
--- a/src/backend/sql/gnc-book-sql.cpp
+++ b/src/backend/sql/gnc-book-sql.cpp
@@ -144,39 +144,39 @@ set_root_template_guid (gpointer pObject,  gpointer pValue)
 
 /* ================================================================= */
 static void
-load_single_book (GncSqlBackend* be, GncSqlRow& row)
+load_single_book (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     QofBook* pBook;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    gnc_sql_load_guid (be, row);
+    gnc_sql_load_guid (sql_be, row);
 
-    pBook = be->book();
+    pBook = sql_be->book();
     if (pBook == NULL)
     {
         pBook = qof_book_new ();
     }
 
     qof_book_begin_edit (pBook);
-    gnc_sql_load_object (be, row, GNC_ID_BOOK, pBook, col_table);
-    gnc_sql_slots_load (be, QOF_INSTANCE (pBook));
+    gnc_sql_load_object (sql_be, row, GNC_ID_BOOK, pBook, col_table);
+    gnc_sql_slots_load (sql_be, QOF_INSTANCE (pBook));
     qof_book_commit_edit (pBook);
 
     qof_instance_mark_clean (QOF_INSTANCE (pBook));
 }
 
 void
-GncSqlBookBackend::load_all (GncSqlBackend* be)
+GncSqlBookBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << BOOK_TABLE;
-    auto stmt = be->create_statement_from_sql(sql.str());
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
     if (stmt != nullptr)
     {
-        auto result = be->execute_select_statement(stmt);
+        auto result = sql_be->execute_select_statement(stmt);
         auto row = result->begin();
 
         /* If there are no rows, try committing the book; unset
@@ -184,14 +184,14 @@ GncSqlBookBackend::load_all (GncSqlBackend* be)
          */
         if (row == result->end())
         {
-            be->set_loading(false);
-            commit (be, QOF_INSTANCE (be->book()));
-            be->set_loading(true);
+            sql_be->set_loading(false);
+            commit (sql_be, QOF_INSTANCE (sql_be->book()));
+            sql_be->set_loading(true);
         }
         else
         {
             // Otherwise, load the 1st book.
-            load_single_book (be, *row);
+            load_single_book (sql_be, *row);
         }
     }
 }
diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp
index df8f2f5..f25aada 100644
--- a/src/backend/sql/gnc-budget-sql.cpp
+++ b/src/backend/sql/gnc-budget-sql.cpp
@@ -84,7 +84,7 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
     bool write(GncSqlBackend*) override;
 private:
     static void save(QofInstance*, void*);
@@ -199,45 +199,45 @@ set_amount (gpointer pObj, gnc_numeric value)
 /**
  * Loads the budget amounts for a budget.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param budget Budget
  */
 static void
-load_budget_amounts (GncSqlBackend* be, GncBudget* budget)
+load_budget_amounts (GncSqlBackend* sql_be, GncBudget* budget)
 {
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (budget != NULL);
 
     (void)guid_to_string_buff (qof_instance_get_guid (QOF_INSTANCE (budget)),
                                guid_buf);
     auto sql = g_strdup_printf ("SELECT * FROM %s WHERE budget_guid='%s'",
                                 AMOUNTS_TABLE, guid_buf);
-    auto stmt = be->create_statement_from_sql(sql);
+    auto stmt = sql_be->create_statement_from_sql(sql);
     g_free (sql);
     if (stmt != nullptr)
     {
-        auto result = be->execute_select_statement(stmt);
+        auto result = sql_be->execute_select_statement(stmt);
         budget_amount_info_t info = { budget, NULL, 0 };
 
         for (auto row : *result)
-            gnc_sql_load_object (be, row, NULL, &info, budget_amounts_col_table);
+            gnc_sql_load_object (sql_be, row, NULL, &info, budget_amounts_col_table);
     }
 }
 
 /**
  * Deletes the budget amounts for a budget.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param budget Budget
  */
 static gboolean
-delete_budget_amounts (GncSqlBackend* be, GncBudget* budget)
+delete_budget_amounts (GncSqlBackend* sql_be, GncBudget* budget)
 {
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (budget != NULL, FALSE);
 
     (void)guid_to_string_buff (qof_instance_get_guid (QOF_INSTANCE (budget)),
@@ -245,8 +245,8 @@ delete_budget_amounts (GncSqlBackend* be, GncBudget* budget)
     std::stringstream sql;
     sql << "DELETE FROM " << AMOUNTS_TABLE << " WHERE budget_guid='"<<
         guid_buf << "'";
-    auto stmt = be->create_statement_from_sql(sql.str());
-    be->execute_nonselect_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    sql_be->execute_nonselect_statement(stmt);
 
     return true;
 }
@@ -254,11 +254,11 @@ delete_budget_amounts (GncSqlBackend* be, GncBudget* budget)
 /**
  * Saves the budget amounts for a budget.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param budget Budget
  */
 static gboolean
-save_budget_amounts (GncSqlBackend* be, GncBudget* budget)
+save_budget_amounts (GncSqlBackend* sql_be, GncBudget* budget)
 {
     GList* descendants;
     GList* node;
@@ -266,16 +266,16 @@ save_budget_amounts (GncSqlBackend* be, GncBudget* budget)
     guint num_periods;
     gboolean is_ok = TRUE;;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (budget != NULL, FALSE);
 
     // Delete the amounts, then save
-    delete_budget_amounts (be, budget);
+    delete_budget_amounts (sql_be, budget);
 
     info.budget = budget;
     num_periods = gnc_budget_get_num_periods (budget);
     descendants = gnc_account_get_descendants (gnc_book_get_root_account (
-                                                   be->book()));
+                                                   sql_be->book()));
     for (node = descendants; node != NULL && is_ok; node = g_list_next (node))
     {
         guint i;
@@ -286,7 +286,7 @@ save_budget_amounts (GncSqlBackend* be, GncBudget* budget)
             if (gnc_budget_is_account_period_value_set (budget, info.account, i))
             {
                 info.period_num = i;
-                is_ok = gnc_sql_do_db_operation (be, OP_DB_INSERT, AMOUNTS_TABLE, "", &info,
+                is_ok = gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, AMOUNTS_TABLE, "", &info,
                                                  budget_amounts_col_table);
             }
         }
@@ -297,28 +297,28 @@ save_budget_amounts (GncSqlBackend* be, GncBudget* budget)
 }
 /*----------------------------------------------------------------*/
 static  GncBudget*
-load_single_budget (GncSqlBackend* be, GncSqlRow& row)
+load_single_budget (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncBudget* pBudget = NULL;
     Recurrence* r;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
+    guid = gnc_sql_load_guid (sql_be, row);
     if (guid != NULL)
     {
-        pBudget = gnc_budget_lookup (guid, be->book());
+        pBudget = gnc_budget_lookup (guid, sql_be->book());
     }
     if (pBudget == NULL)
     {
-        pBudget = gnc_budget_new (be->book());
+        pBudget = gnc_budget_new (sql_be->book());
     }
 
     gnc_budget_begin_edit (pBudget);
-    gnc_sql_load_object (be, row, GNC_ID_BUDGET, pBudget, col_table);
-    load_budget_amounts (be, pBudget);
-    r = gnc_sql_recurrence_load (be, gnc_budget_get_guid (pBudget));
+    gnc_sql_load_object (sql_be, row, GNC_ID_BUDGET, pBudget, col_table);
+    load_budget_amounts (sql_be, pBudget);
+    r = gnc_sql_recurrence_load (sql_be, gnc_budget_get_guid (pBudget));
     if (r != NULL)
     {
         gnc_budget_set_recurrence (pBudget, r);
@@ -330,51 +330,51 @@ load_single_budget (GncSqlBackend* be, GncSqlRow& row)
 }
 
 void
-GncSqlBudgetBackend::load_all (GncSqlBackend* be)
+GncSqlBudgetBackend::load_all (GncSqlBackend* sql_be)
 {
     InstanceVec instances;
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << BUDGET_TABLE;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     for (auto row : *result)
     {
-        auto b = load_single_budget (be, row);
+        auto b = load_single_budget (sql_be, row);
         if (b != nullptr)
             instances.push_back(QOF_INSTANCE(b));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
 void
-GncSqlBudgetBackend::create_tables (GncSqlBackend* be)
+GncSqlBudgetBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( BUDGET_TABLE);
+    version = sql_be->get_table_version( BUDGET_TABLE);
     if (version == 0)
     {
-        (void)be->create_table(BUDGET_TABLE, TABLE_VERSION, col_table);
+        (void)sql_be->create_table(BUDGET_TABLE, TABLE_VERSION, col_table);
     }
 
-    version = be->get_table_version( AMOUNTS_TABLE);
+    version = sql_be->get_table_version( AMOUNTS_TABLE);
     if (version == 0)
     {
-        (void)be->create_table(AMOUNTS_TABLE, AMOUNTS_TABLE_VERSION,
+        (void)sql_be->create_table(AMOUNTS_TABLE, AMOUNTS_TABLE_VERSION,
                                     budget_amounts_col_table);
     }
 }
 
 /* ================================================================= */
 bool
-GncSqlBudgetBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlBudgetBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     GncBudget* pBudget = GNC_BUDGET (inst);
     const GncGUID* guid;
@@ -382,7 +382,7 @@ GncSqlBudgetBackend::commit (GncSqlBackend* be, QofInstance* inst)
     gboolean is_infant;
     gboolean is_ok;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_BUDGET (inst), FALSE);
 
@@ -391,7 +391,7 @@ GncSqlBudgetBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -399,7 +399,7 @@ GncSqlBudgetBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget,
+    is_ok = gnc_sql_do_db_operation (sql_be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget,
                                      col_table);
 
     // Now, commit any slots and recurrence
@@ -408,27 +408,27 @@ GncSqlBudgetBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = save_budget_amounts (be, pBudget);
+            is_ok = save_budget_amounts (sql_be, pBudget);
             if (is_ok)
             {
-                is_ok = gnc_sql_recurrence_save (be, guid,
+                is_ok = gnc_sql_recurrence_save (sql_be, guid,
                                                  gnc_budget_get_recurrence (pBudget));
             }
             if (is_ok)
             {
-                is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+                is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
             }
         }
         else
         {
-            is_ok = delete_budget_amounts (be, pBudget);
+            is_ok = delete_budget_amounts (sql_be, pBudget);
             if (is_ok)
             {
-                is_ok = gnc_sql_recurrence_delete (be, guid);
+                is_ok = gnc_sql_recurrence_delete (sql_be, guid);
             }
             if (is_ok)
             {
-                (void)gnc_sql_slots_delete (be, guid);
+                (void)gnc_sql_slots_delete (sql_be, guid);
             }
         }
     }
@@ -448,16 +448,16 @@ do_save (QofInstance* inst, gpointer data)
 }
 
 bool
-GncSqlBudgetBackend::write (GncSqlBackend* be)
+GncSqlBudgetBackend::write (GncSqlBackend* sql_be)
 {
     write_objects_t data;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    data.be = be;
+    data.be = sql_be;
     data.is_ok = TRUE;
     data.obe = this;
-    qof_collection_foreach (qof_book_get_collection (be->book(), GNC_ID_BUDGET),
+    qof_collection_foreach (qof_book_get_collection (sql_be->book(), GNC_ID_BUDGET),
                             (QofInstanceForeachCB)do_save, &data);
 
     return data.is_ok;
@@ -465,31 +465,31 @@ GncSqlBudgetBackend::write (GncSqlBackend* be)
 
 /* ================================================================= */
 template<> void
-GncSqlColumnTableEntryImpl<CT_BUDGETREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BUDGETREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                            return gnc_budget_lookup (g, be->book());
+                       [sql_be](GncGUID* g){
+                            return gnc_budget_lookup (g, sql_be->book());
                         });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_BUDGETREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp
index ca40e45..68d9ce5 100644
--- a/src/backend/sql/gnc-commodity-sql.cpp
+++ b/src/backend/sql/gnc-commodity-sql.cpp
@@ -127,33 +127,33 @@ set_quote_source_name (gpointer pObject, gpointer pValue)
 }
 
 static  gnc_commodity*
-load_single_commodity (GncSqlBackend* be, GncSqlRow& row)
+load_single_commodity (GncSqlBackend* sql_be, GncSqlRow& row)
 {
-    QofBook* pBook = be->book();
+    QofBook* pBook = sql_be->book();
     gnc_commodity* pCommodity;
 
     pCommodity = gnc_commodity_new (pBook, NULL, NULL, NULL, NULL, 100);
     gnc_commodity_begin_edit (pCommodity);
-    gnc_sql_load_object (be, row, GNC_ID_COMMODITY, pCommodity, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_COMMODITY, pCommodity, col_table);
     gnc_commodity_commit_edit (pCommodity);
 
     return pCommodity;
 }
 
 void
-GncSqlCommodityBackend::load_all (GncSqlBackend* be)
+GncSqlCommodityBackend::load_all (GncSqlBackend* sql_be)
 {
     gnc_commodity_table* pTable;
 
-    pTable = gnc_commodity_table_get_table (be->book());
+    pTable = gnc_commodity_table_get_table (sql_be->book());
     std::stringstream sql;
     sql << "SELECT * FROM " << COMMODITIES_TABLE;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
 
     for (auto row : *result)
     {
-        auto pCommodity = load_single_commodity (be, row);
+        auto pCommodity = load_single_commodity (sql_be, row);
 
         if (pCommodity != NULL)
         {
@@ -162,19 +162,19 @@ GncSqlCommodityBackend::load_all (GncSqlBackend* be)
             guid = *qof_instance_get_guid (QOF_INSTANCE (pCommodity));
             pCommodity = gnc_commodity_table_insert (pTable, pCommodity);
             if (qof_instance_is_dirty (QOF_INSTANCE (pCommodity)))
-                gnc_sql_push_commodity_for_postload_processing (be, (gpointer)pCommodity);
+                gnc_sql_push_commodity_for_postload_processing (sql_be, (gpointer)pCommodity);
             qof_instance_set_guid (QOF_INSTANCE (pCommodity), &guid);
         }
 
         auto sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", COMMODITIES_TABLE);
-        gnc_sql_slots_load_for_sql_subquery (be, sql,
+        gnc_sql_slots_load_for_sql_subquery (sql_be, sql,
                                              (BookLookupFn)gnc_commodity_find_commodity_by_guid);
         g_free (sql);
     }
 }
 /* ================================================================= */
 static gboolean
-do_commit_commodity (GncSqlBackend* be, QofInstance* inst,
+do_commit_commodity (GncSqlBackend* sql_be, QofInstance* inst,
                      gboolean force_insert)
 {
     const GncGUID* guid;
@@ -187,7 +187,7 @@ do_commit_commodity (GncSqlBackend* be, QofInstance* inst,
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant || force_insert)
+    else if (sql_be->pristine() || is_infant || force_insert)
     {
         op = OP_DB_INSERT;
     }
@@ -195,7 +195,7 @@ do_commit_commodity (GncSqlBackend* be, QofInstance* inst,
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (be, op, COMMODITIES_TABLE, GNC_ID_COMMODITY,
+    is_ok = gnc_sql_do_db_operation (sql_be, op, COMMODITIES_TABLE, GNC_ID_COMMODITY,
                                      inst, col_table);
 
     if (is_ok)
@@ -204,11 +204,11 @@ do_commit_commodity (GncSqlBackend* be, QofInstance* inst,
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -216,36 +216,36 @@ do_commit_commodity (GncSqlBackend* be, QofInstance* inst,
 }
 
 bool
-GncSqlCommodityBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlCommodityBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_COMMODITY (inst), FALSE);
 
-    return do_commit_commodity (be, inst, FALSE);
+    return do_commit_commodity (sql_be, inst, FALSE);
 }
 
 static gboolean
-is_commodity_in_db (GncSqlBackend* be, gnc_commodity* pCommodity)
+is_commodity_in_db (GncSqlBackend* sql_be, gnc_commodity* pCommodity)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (pCommodity != NULL, FALSE);
 
-    return gnc_sql_object_is_it_in_db (be, COMMODITIES_TABLE, GNC_ID_COMMODITY,
+    return gnc_sql_object_is_it_in_db (sql_be, COMMODITIES_TABLE, GNC_ID_COMMODITY,
                                        pCommodity, col_table);
 }
 
 gboolean
-gnc_sql_save_commodity (GncSqlBackend* be, gnc_commodity* pCommodity)
+gnc_sql_save_commodity (GncSqlBackend* sql_be, gnc_commodity* pCommodity)
 {
     gboolean is_ok = TRUE;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (pCommodity != NULL, FALSE);
 
-    if (!is_commodity_in_db (be, pCommodity))
+    if (!is_commodity_in_db (sql_be, pCommodity))
     {
-        is_ok = do_commit_commodity (be, QOF_INSTANCE (pCommodity), TRUE);
+        is_ok = do_commit_commodity (sql_be, QOF_INSTANCE (pCommodity), TRUE);
     }
 
     return is_ok;
@@ -262,31 +262,31 @@ gnc_sql_commit_commodity (gnc_commodity* pCommodity)
 
 /* ----------------------------------------------------------------- */
 template<> void
-GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return gnc_commodity_find_commodity_by_guid(g, be->book());
+                       [sql_be](GncGUID* g){
+                           return gnc_commodity_find_commodity_by_guid(g, sql_be->book());
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_COMMODITYREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-commodity-sql.h b/src/backend/sql/gnc-commodity-sql.h
index 79f558c..4e42572 100644
--- a/src/backend/sql/gnc-commodity-sql.h
+++ b/src/backend/sql/gnc-commodity-sql.h
@@ -35,7 +35,8 @@ extern "C"
 #include "gnc-commodity.h"
 }
 void gnc_sql_init_commodity_handler (void);
-gboolean gnc_sql_save_commodity (GncSqlBackend* be, gnc_commodity* pCommodity);
+gboolean gnc_sql_save_commodity (GncSqlBackend* sql_be,
+                                 gnc_commodity* pCommodity);
 void gnc_sql_commit_commodity (gnc_commodity* pCommodity);
 
 #endif /* GNC_COMMODITY_SQL_H */
diff --git a/src/backend/sql/gnc-customer-sql.cpp b/src/backend/sql/gnc-customer-sql.cpp
index e398e51..4061311 100644
--- a/src/backend/sql/gnc-customer-sql.cpp
+++ b/src/backend/sql/gnc-customer-sql.cpp
@@ -102,65 +102,65 @@ public:
 };
 
 static GncCustomer*
-load_single_customer (GncSqlBackend* be, GncSqlRow& row)
+load_single_customer (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncCustomer* pCustomer;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pCustomer = gncCustomerLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pCustomer = gncCustomerLookup (sql_be->book(), guid);
     if (pCustomer == NULL)
     {
-        pCustomer = gncCustomerCreate (be->book());
+        pCustomer = gncCustomerCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_CUSTOMER, pCustomer, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_CUSTOMER, pCustomer, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pCustomer));
 
     return pCustomer;
 }
 
 void
-GncSqlCustomerBackend::load_all (GncSqlBackend* be)
+GncSqlCustomerBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncCustomer* pCustomer = load_single_customer (be, row);
+        GncCustomer* pCustomer = load_single_customer (sql_be, row);
         if (pCustomer != nullptr)
             instances.push_back(QOF_INSTANCE(pCustomer));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
 void
-GncSqlCustomerBackend::create_tables (GncSqlBackend* be)
+GncSqlCustomerBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Customers table upgraded from version 1 to version %d\n",
                TABLE_VERSION);
@@ -201,16 +201,16 @@ write_single_customer (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlCustomerBackend::write (GncSqlBackend* be)
+GncSqlCustomerBackend::write (GncSqlBackend* sql_be)
 {
     write_objects_t data;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    data.be = be;
+    data.be = sql_be;
     data.is_ok = TRUE;
     data.obe = this;
-    qof_object_foreach (GNC_ID_CUSTOMER, be->book(), write_single_customer,
+    qof_object_foreach (GNC_ID_CUSTOMER, sql_be->book(), write_single_customer,
                         (gpointer)&data);
     return data.is_ok;
 }
diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp
index 188824f..25b406a 100644
--- a/src/backend/sql/gnc-employee-sql.cpp
+++ b/src/backend/sql/gnc-employee-sql.cpp
@@ -88,66 +88,66 @@ public:
 };
 
 static GncEmployee*
-load_single_employee (GncSqlBackend* be, GncSqlRow& row)
+load_single_employee (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncEmployee* pEmployee;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pEmployee = gncEmployeeLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pEmployee = gncEmployeeLookup (sql_be->book(), guid);
     if (pEmployee == NULL)
     {
-        pEmployee = gncEmployeeCreate (be->book());
+        pEmployee = gncEmployeeCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_EMPLOYEE, pEmployee, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_EMPLOYEE, pEmployee, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pEmployee));
 
     return pEmployee;
 }
 
 void
-GncSqlEmployeeBackend::load_all (GncSqlBackend* be)
+GncSqlEmployeeBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
 
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncEmployee* pEmployee = load_single_employee (be, row);
+        GncEmployee* pEmployee = load_single_employee (sql_be, row);
         if (pEmployee != nullptr)
             instances.push_back(QOF_INSTANCE(pEmployee));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
 void
-GncSqlEmployeeBackend::create_tables (GncSqlBackend* be)
+GncSqlEmployeeBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Employees table upgraded from version 1 to version %d\n",
                TABLE_VERSION);
@@ -156,7 +156,7 @@ GncSqlEmployeeBackend::create_tables (GncSqlBackend* be)
 
 /* ================================================================= */
 bool
-GncSqlEmployeeBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlEmployeeBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     GncEmployee* emp;
     const GncGUID* guid;
@@ -166,7 +166,7 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_EMPLOYEE (inst), FALSE);
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     emp = GNC_EMPLOYEE (inst);
 
@@ -175,7 +175,7 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -186,12 +186,12 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (be, gncEmployeeGetCurrency (emp));
+        is_ok = gnc_sql_save_commodity (sql_be, gncEmployeeGetCurrency (emp));
     }
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TABLE_NAME, GNC_ID_EMPLOYEE, emp,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_EMPLOYEE, emp,
                                          col_table);
     }
 
@@ -201,11 +201,11 @@ GncSqlEmployeeBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -246,16 +246,16 @@ write_single_employee (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlEmployeeBackend::write (GncSqlBackend* be)
+GncSqlEmployeeBackend::write (GncSqlBackend* sql_be)
 {
     write_objects_t data;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
-    data.be = be;
+    data.be = sql_be;
     data.is_ok = TRUE;
     data.obe = this;
-    qof_object_foreach (GNC_ID_EMPLOYEE, be->book(), write_single_employee, &data);
+    qof_object_foreach (GNC_ID_EMPLOYEE, sql_be->book(), write_single_employee, &data);
 
     return data.is_ok;
 }
diff --git a/src/backend/sql/gnc-entry-sql.cpp b/src/backend/sql/gnc-entry-sql.cpp
index 00dd649..d20152b 100644
--- a/src/backend/sql/gnc-entry-sql.cpp
+++ b/src/backend/sql/gnc-entry-sql.cpp
@@ -170,59 +170,59 @@ entry_set_bill (gpointer pObject, gpointer val)
 }
 
 static GncEntry*
-load_single_entry (GncSqlBackend* be, GncSqlRow& row)
+load_single_entry (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncEntry* pEntry;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pEntry = gncEntryLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pEntry = gncEntryLookup (sql_be->book(), guid);
     if (pEntry == NULL)
     {
-        pEntry = gncEntryCreate (be->book());
+        pEntry = gncEntryCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_ENTRY, pEntry, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_ENTRY, pEntry, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pEntry));
 
     return pEntry;
 }
 
 void
-GncSqlEntryBackend::load_all (GncSqlBackend* be)
+GncSqlEntryBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncEntry* pEntry = load_single_entry (be, row);
+        GncEntry* pEntry = load_single_entry (sql_be, row);
         if (pEntry != nullptr)
             instances.push_back(QOF_INSTANCE(pEntry));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec(be, instances);
+        gnc_sql_slots_load_for_instancevec(sql_be, instances);
 }
 
 /* ================================================================= */
 void
-GncSqlEntryBackend::create_tables (GncSqlBackend* be)
+GncSqlEntryBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version < TABLE_VERSION)
     {
@@ -230,8 +230,8 @@ GncSqlEntryBackend::create_tables (GncSqlBackend* be)
             1->2: 64 bit int handling
             2->3: "entered" -> "date_entered", and it can be NULL
         */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Entries table upgraded from version %d to version %d\n", version,
                TABLE_VERSION);
@@ -259,12 +259,12 @@ write_single_entry (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlEntryBackend::write (GncSqlBackend* be)
+GncSqlEntryBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_ENTRY, be->book(), write_single_entry, &data);
+    qof_object_foreach (GNC_ID_ENTRY, sql_be->book(), write_single_entry, &data);
 
     return data.is_ok;
 }
diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp
index a70c038..41e601a 100644
--- a/src/backend/sql/gnc-invoice-sql.cpp
+++ b/src/backend/sql/gnc-invoice-sql.cpp
@@ -104,64 +104,64 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
     bool write(GncSqlBackend*) override;
 };
 
 static GncInvoice*
-load_single_invoice (GncSqlBackend* be, GncSqlRow& row)
+load_single_invoice (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncInvoice* pInvoice;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pInvoice = gncInvoiceLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pInvoice = gncInvoiceLookup (sql_be->book(), guid);
     if (pInvoice == NULL)
     {
-        pInvoice = gncInvoiceCreate (be->book());
+        pInvoice = gncInvoiceCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_INVOICE, pInvoice, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_INVOICE, pInvoice, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pInvoice));
 
     return pInvoice;
 }
 
 void
-GncSqlInvoiceBackend::load_all (GncSqlBackend* be)
+GncSqlInvoiceBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncInvoice* pInvoice = load_single_invoice (be, row);
+        GncInvoice* pInvoice = load_single_invoice (sql_be, row);
         if (pInvoice != nullptr)
             instances.push_back(QOF_INSTANCE(pInvoice));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
 void
-GncSqlInvoiceBackend::create_tables (GncSqlBackend* be)
+GncSqlInvoiceBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version < TABLE_VERSION)
     {
@@ -169,8 +169,8 @@ GncSqlInvoiceBackend::create_tables (GncSqlBackend* be)
              1->2: 64 bit int handling
              2->3: invoice open date can be NULL
         */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Invoices table upgraded from version %d to version %d\n", version,
                TABLE_VERSION);
@@ -179,7 +179,7 @@ GncSqlInvoiceBackend::create_tables (GncSqlBackend* be)
 
 /* ================================================================= */
 bool
-GncSqlInvoiceBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlInvoiceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     const GncGUID* guid;
     GncInvoice* invoice;
@@ -189,7 +189,7 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_INVOICE (inst), FALSE);
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     invoice = GNC_INVOICE (inst);
 
@@ -198,7 +198,7 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -209,12 +209,12 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (be, gncInvoiceGetCurrency (invoice));
+        is_ok = gnc_sql_save_commodity (sql_be, gncInvoiceGetCurrency (invoice));
     }
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TABLE_NAME, GNC_ID_INVOICE, inst,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_INVOICE, inst,
                                          col_table);
     }
 
@@ -224,11 +224,11 @@ GncSqlInvoiceBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -269,43 +269,43 @@ write_single_invoice (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlInvoiceBackend::write (GncSqlBackend* be)
+GncSqlInvoiceBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_INVOICE, be->book(), write_single_invoice, &data);
+    qof_object_foreach (GNC_ID_INVOICE, sql_be->book(), write_single_invoice, &data);
 
     return data.is_ok;
 }
 
 /* ================================================================= */
 template<> void
-GncSqlColumnTableEntryImpl<CT_INVOICEREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INVOICEREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
      load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                            return gncInvoiceLookup (be->book(), g);
+                       [sql_be](GncGUID* g){
+                            return gncInvoiceLookup (sql_be->book(), g);
                         });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_INVOICEREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
 /* ================================================================= */
diff --git a/src/backend/sql/gnc-job-sql.cpp b/src/backend/sql/gnc-job-sql.cpp
index 9c9af58..3c79369 100644
--- a/src/backend/sql/gnc-job-sql.cpp
+++ b/src/backend/sql/gnc-job-sql.cpp
@@ -81,45 +81,45 @@ public:
 
 
 static GncJob*
-load_single_job (GncSqlBackend* be, GncSqlRow& row)
+load_single_job (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncJob* pJob;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pJob = gncJobLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pJob = gncJobLookup (sql_be->book(), guid);
     if (pJob == NULL)
     {
-        pJob = gncJobCreate (be->book());
+        pJob = gncJobCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_JOB, pJob, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_JOB, pJob, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pJob));
 
     return pJob;
 }
 
 void
-GncSqlJobBackend::load_all (GncSqlBackend* be)
+GncSqlJobBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncJob* pJob = load_single_job (be, row);
+        GncJob* pJob = load_single_job (sql_be, row);
         if (pJob != nullptr)
             instances.push_back(QOF_INSTANCE(pJob));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
@@ -156,12 +156,12 @@ write_single_job (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlJobBackend::write (GncSqlBackend* be)
+GncSqlJobBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_JOB, be->book(), write_single_job, &data);
+    qof_object_foreach (GNC_ID_JOB, sql_be->book(), write_single_job, &data);
 
     return data.is_ok;
 }
diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp
index e9bbf37..a5806a6 100644
--- a/src/backend/sql/gnc-lots-sql.cpp
+++ b/src/backend/sql/gnc-lots-sql.cpp
@@ -107,57 +107,57 @@ set_lot_account (gpointer pObject,  gpointer pValue)
 }
 
 static  GNCLot*
-load_single_lot (GncSqlBackend* be, GncSqlRow& row)
+load_single_lot (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     GNCLot* lot;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    lot = gnc_lot_new (be->book());
+    lot = gnc_lot_new (sql_be->book());
 
     gnc_lot_begin_edit (lot);
-    gnc_sql_load_object (be, row, GNC_ID_LOT, lot, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_LOT, lot, col_table);
     gnc_lot_commit_edit (lot);
 
     return lot;
 }
 
 void
-GncSqlLotsBackend::load_all (GncSqlBackend* be)
+GncSqlLotsBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
     if (stmt != nullptr)
     {
-        auto result = be->execute_select_statement(stmt);
+        auto result = sql_be->execute_select_statement(stmt);
         if (result->begin () == nullptr)
             return;
         for (auto row : *result)
-            load_single_lot (be, row);
+            load_single_lot (sql_be, row);
 
         auto sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s",
                                    TABLE_NAME);
-        gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)gnc_lot_lookup);
+        gnc_sql_slots_load_for_sql_subquery (sql_be, sql, (BookLookupFn)gnc_lot_lookup);
         g_free (sql);
     }
 }
 
 /* ================================================================= */
 void
-GncSqlLotsBackend::create_tables (GncSqlBackend* be)
+GncSqlLotsBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
         /* The table doesn't exist, so create it */
-        (void)be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        (void)sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version == 1)
     {
@@ -167,8 +167,8 @@ GncSqlLotsBackend::create_tables (GncSqlBackend* be)
         Create a temporary table, copy the data from the old table, delete the
         old table, then rename the new one. */
 
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Lots table upgraded from version 1 to version %d\n", TABLE_VERSION);
     }
@@ -186,43 +186,43 @@ do_save_lot (QofInstance* inst, gpointer data)
 }
 
 bool
-GncSqlLotsBackend::write (GncSqlBackend* be)
+GncSqlLotsBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_collection_foreach (qof_book_get_collection (be->book(), GNC_ID_LOT),
+    qof_collection_foreach (qof_book_get_collection (sql_be->book(), GNC_ID_LOT),
                             (QofInstanceForeachCB)do_save_lot, &data);
     return data.is_ok;
 }
 
 /* ================================================================= */
 template<> void
-GncSqlColumnTableEntryImpl<CT_LOTREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_LOTREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return gnc_lot_lookup(g, be->book());
+                       [sql_be](GncGUID* g){
+                           return gnc_lot_lookup(g, sql_be->book());
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_LOTREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp
index dce9583..8ea3970 100644
--- a/src/backend/sql/gnc-order-sql.cpp
+++ b/src/backend/sql/gnc-order-sql.cpp
@@ -81,45 +81,45 @@ public:
 };
 
 static GncOrder*
-load_single_order (GncSqlBackend* be, GncSqlRow& row)
+load_single_order (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncOrder* pOrder;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pOrder = gncOrderLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pOrder = gncOrderLookup (sql_be->book(), guid);
     if (pOrder == NULL)
     {
-        pOrder = gncOrderCreate (be->book());
+        pOrder = gncOrderCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_ORDER, pOrder, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_ORDER, pOrder, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pOrder));
 
     return pOrder;
 }
 
 void
-GncSqlOrderBackend::load_all (GncSqlBackend* be)
+GncSqlOrderBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncOrder* pOrder = load_single_order (be, row);
+        GncOrder* pOrder = load_single_order (sql_be, row);
         if (pOrder != nullptr)
             instances.push_back(QOF_INSTANCE(pOrder));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
@@ -156,43 +156,43 @@ write_single_order (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlOrderBackend::write (GncSqlBackend* be)
+GncSqlOrderBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_ORDER, be->book(), write_single_order, &data);
+    qof_object_foreach (GNC_ID_ORDER, sql_be->book(), write_single_order, &data);
 
     return data.is_ok;
 }
 
 /* ================================================================= */
 template<> void
-GncSqlColumnTableEntryImpl<CT_ORDERREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ORDERREF>::load (const GncSqlBackend* sql_be,
                                                  GncSqlRow& row,
                                                  QofIdTypeConst obj_name,
                                                  gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return gncOrderLookup(be->book(), g);
+                       [sql_be](GncGUID* g){
+                           return gncOrderLookup(sql_be->book(), g);
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_table(const GncSqlBackend* sql_be,
                                                  ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_ORDERREF>::add_to_query(const GncSqlBackend* sql_be,
                                                     QofIdTypeConst obj_name,
                                                     const gpointer pObject,
                                                     PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 /* ================================================================= */
 void
diff --git a/src/backend/sql/gnc-owner-sql.cpp b/src/backend/sql/gnc-owner-sql.cpp
index ca6b452..6c0d178 100644
--- a/src/backend/sql/gnc-owner-sql.cpp
+++ b/src/backend/sql/gnc-owner-sql.cpp
@@ -48,7 +48,7 @@ typedef void (*OwnerSetterFunc) (gpointer, GncOwner*);
 typedef GncOwner* (*OwnerGetterFunc) (const gpointer);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_OWNERREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_OWNERREF>::load (const GncSqlBackend* sql_be,
                                                GncSqlRow& row,
                                                QofIdTypeConst obj_name,
                                                gpointer pObject) const noexcept
@@ -58,10 +58,10 @@ GncSqlColumnTableEntryImpl<CT_OWNERREF>::load (const GncSqlBackend* be,
     GncOwner owner;
     GncGUID* pGuid = NULL;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pObject != NULL);
 
-    auto book = be->book();
+    auto book = sql_be->book();
     auto buf = std::string{m_col_name} + "_type";
     try
     {
@@ -153,10 +153,10 @@ GncSqlColumnTableEntryImpl<CT_OWNERREF>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(const GncSqlBackend* sql_be,
                                                       ColVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     auto buf = g_strdup_printf ("%s_type", m_col_name);
     GncSqlColumnInfo info(buf, BCT_INT, 0, false, false,
@@ -170,12 +170,12 @@ GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_table(const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_OWNERREF>::add_to_query(const GncSqlBackend* sql_be,
                                                       QofIdTypeConst obj_name,
                                                       const gpointer pObject,
                                                       PairVec& vec) const noexcept
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (obj_name != NULL);
     g_return_if_fail (pObject != NULL);
 
diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp
index 84450c9..386dec4 100644
--- a/src/backend/sql/gnc-price-sql.cpp
+++ b/src/backend/sql/gnc-price-sql.cpp
@@ -75,7 +75,7 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
     bool write(GncSqlBackend*) override;
 };
 
@@ -83,37 +83,37 @@ public:
 /* ================================================================= */
 
 static  GNCPrice*
-load_single_price (GncSqlBackend* be, GncSqlRow& row)
+load_single_price (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     GNCPrice* pPrice;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    pPrice = gnc_price_create (be->book());
+    pPrice = gnc_price_create (sql_be->book());
 
     gnc_price_begin_edit (pPrice);
-    gnc_sql_load_object (be, row, GNC_ID_PRICE, pPrice, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_PRICE, pPrice, col_table);
     gnc_price_commit_edit (pPrice);
 
     return pPrice;
 }
 
 void
-GncSqlPriceBackend::load_all (GncSqlBackend* be)
+GncSqlPriceBackend::load_all (GncSqlBackend* sql_be)
 {
     QofBook* pBook;
     GNCPriceDB* pPriceDB;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    pBook = be->book();
+    pBook = sql_be->book();
     pPriceDB = gnc_pricedb_get_db (pBook);
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
     if (stmt != nullptr)
     {
-        auto result = be->execute_select_statement(stmt);
+        auto result = sql_be->execute_select_statement(stmt);
         if (result->begin() == result->end())
             return;
 
@@ -123,7 +123,7 @@ GncSqlPriceBackend::load_all (GncSqlBackend* be)
         gnc_pricedb_set_bulk_update (pPriceDB, TRUE);
         for (auto row : *result)
         {
-            pPrice = load_single_price (be, row);
+            pPrice = load_single_price (sql_be, row);
 
             if (pPrice != NULL)
             {
@@ -134,29 +134,29 @@ GncSqlPriceBackend::load_all (GncSqlBackend* be)
         gnc_pricedb_set_bulk_update (pPriceDB, FALSE);
 
         sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", TABLE_NAME);
-        gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)gnc_price_lookup);
+        gnc_sql_slots_load_for_sql_subquery (sql_be, sql, (BookLookupFn)gnc_price_lookup);
         g_free (sql);
     }
 }
 
 /* ================================================================= */
 void
-GncSqlPriceBackend::create_tables (GncSqlBackend* be)
+GncSqlPriceBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        (void)be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        (void)sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TABLE_NAME, col_table);
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->upgrade_table(TABLE_NAME, col_table);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
 
         PINFO ("Prices table upgraded from version 1 to version %d\n", TABLE_VERSION);
     }
@@ -165,14 +165,14 @@ GncSqlPriceBackend::create_tables (GncSqlBackend* be)
 /* ================================================================= */
 
 bool
-GncSqlPriceBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlPriceBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     GNCPrice* pPrice = GNC_PRICE (inst);
     E_DB_OPERATION op;
     gboolean is_infant;
     gboolean is_ok = TRUE;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_PRICE (inst), FALSE);
 
@@ -181,7 +181,7 @@ GncSqlPriceBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -193,13 +193,13 @@ GncSqlPriceBackend::commit (GncSqlBackend* be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         /* Ensure commodity and currency are in the db */
-        (void)gnc_sql_save_commodity (be, gnc_price_get_commodity (pPrice));
-        is_ok = gnc_sql_save_commodity (be, gnc_price_get_currency (pPrice));
+        (void)gnc_sql_save_commodity (sql_be, gnc_price_get_commodity (pPrice));
+        is_ok = gnc_sql_save_commodity (sql_be, gnc_price_get_currency (pPrice));
     }
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TABLE_NAME, GNC_ID_PRICE, pPrice,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_PRICE, pPrice,
                                          col_table);
     }
 
@@ -223,12 +223,12 @@ write_price (GNCPrice* p, gpointer data)
 }
 
 bool
-GncSqlPriceBackend::write (GncSqlBackend* be)
+GncSqlPriceBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    auto priceDB = gnc_pricedb_get_db (be->book());
+    auto priceDB = gnc_pricedb_get_db (sql_be->book());
     return gnc_pricedb_foreach_price (priceDB, write_price, &data, TRUE);
 }
 
diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp
index c863735..0fa83c7 100644
--- a/src/backend/sql/gnc-recurrence-sql.cpp
+++ b/src/backend/sql/gnc-recurrence-sql.cpp
@@ -241,101 +241,101 @@ set_recurrence_period_start (gpointer pObject, gpointer pValue)
 /* ================================================================= */
 
 gboolean
-gnc_sql_recurrence_save (GncSqlBackend* be, const GncGUID* guid,
+gnc_sql_recurrence_save (GncSqlBackend* sql_be, const GncGUID* guid,
                          const Recurrence* r)
 {
     recurrence_info_t recurrence_info;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
     g_return_val_if_fail (r != NULL, FALSE);
 
-    (void)gnc_sql_recurrence_delete (be, guid);
+    (void)gnc_sql_recurrence_delete (sql_be, guid);
 
-    recurrence_info.be = be;
+    recurrence_info.be = sql_be;
     recurrence_info.guid = guid;
     recurrence_info.pRecurrence = (Recurrence*)r;
-    return gnc_sql_do_db_operation (be, OP_DB_INSERT, TABLE_NAME,
+    return gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, TABLE_NAME,
                                     TABLE_NAME, &recurrence_info, col_table);
 }
 
 void
-gnc_sql_recurrence_save_list (GncSqlBackend* be, const GncGUID* guid,
+gnc_sql_recurrence_save_list (GncSqlBackend* sql_be, const GncGUID* guid,
                               GList* schedule)
 {
     recurrence_info_t recurrence_info;
     GList* l;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (guid != NULL);
 
-    (void)gnc_sql_recurrence_delete (be, guid);
+    (void)gnc_sql_recurrence_delete (sql_be, guid);
 
-    recurrence_info.be = be;
+    recurrence_info.be = sql_be;
     recurrence_info.guid = guid;
     for (l = schedule; l != NULL; l = g_list_next (l))
     {
         recurrence_info.pRecurrence = (Recurrence*)l->data;
-        (void)gnc_sql_do_db_operation (be, OP_DB_INSERT, TABLE_NAME,
+        (void)gnc_sql_do_db_operation (sql_be, OP_DB_INSERT, TABLE_NAME,
                                        TABLE_NAME, &recurrence_info, col_table);
     }
 }
 
 gboolean
-gnc_sql_recurrence_delete (GncSqlBackend* be, const GncGUID* guid)
+gnc_sql_recurrence_delete (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     recurrence_info_t recurrence_info;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
 
-    recurrence_info.be = be;
+    recurrence_info.be = sql_be;
     recurrence_info.guid = guid;
-    return gnc_sql_do_db_operation (be, OP_DB_DELETE, TABLE_NAME,
+    return gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TABLE_NAME,
                                     TABLE_NAME, &recurrence_info, guid_col_table);
 }
 
 static void
-load_recurrence (GncSqlBackend* be, GncSqlRow& row,  Recurrence* r)
+load_recurrence (GncSqlBackend* sql_be, GncSqlRow& row,  Recurrence* r)
 {
     recurrence_info_t recurrence_info;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (r != NULL);
 
-    recurrence_info.be = be;
+    recurrence_info.be = sql_be;
     recurrence_info.pRecurrence = r;
 
-    gnc_sql_load_object (be, row, TABLE_NAME, &recurrence_info, col_table);
+    gnc_sql_load_object (sql_be, row, TABLE_NAME, &recurrence_info, col_table);
 }
 
 static  GncSqlResultPtr
-gnc_sql_set_recurrences_from_db (GncSqlBackend* be, const GncGUID* guid)
+gnc_sql_set_recurrences_from_db (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     gchar* buf;
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (guid != NULL, NULL);
 
     (void)guid_to_string_buff (guid, guid_buf);
     buf = g_strdup_printf ("SELECT * FROM %s WHERE obj_guid='%s'", TABLE_NAME,
                            guid_buf);
-    auto stmt = be->create_statement_from_sql (buf);
+    auto stmt = sql_be->create_statement_from_sql (buf);
     g_free (buf);
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     return result;
 }
 
 Recurrence*
-gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid)
+gnc_sql_recurrence_load (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     Recurrence* r = NULL;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (guid != NULL, NULL);
 
-    auto result = gnc_sql_set_recurrences_from_db (be, guid);
+    auto result = gnc_sql_set_recurrences_from_db (sql_be, guid);
     auto row = result->begin();
     if (row == nullptr)
     {
@@ -344,7 +344,7 @@ gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid)
     }
     r = g_new0 (Recurrence, 1);
     g_assert (r != NULL);
-    load_recurrence (be, *(result->begin()), r);
+    load_recurrence (sql_be, *(result->begin()), r);
 
     if (++row != nullptr)
         g_warning ("More than 1 recurrence found: first one used");
@@ -353,19 +353,19 @@ gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid)
 }
 
 GList*
-gnc_sql_recurrence_load_list (GncSqlBackend* be, const GncGUID* guid)
+gnc_sql_recurrence_load_list (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     GList* list = NULL;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (guid != NULL, NULL);
 
-    auto result = gnc_sql_set_recurrences_from_db (be, guid);
+    auto result = gnc_sql_set_recurrences_from_db (sql_be, guid);
     for (auto row : *result)
     {
         Recurrence* pRecurrence = g_new0 (Recurrence, 1);
         g_assert (pRecurrence != NULL);
-        load_recurrence (be, row, pRecurrence);
+        load_recurrence (sql_be, row, pRecurrence);
         list = g_list_append (list, pRecurrence);
     }
 
@@ -374,10 +374,10 @@ gnc_sql_recurrence_load_list (GncSqlBackend* be, const GncGUID* guid)
 
 /* ================================================================= */
 static void
-upgrade_recurrence_table_1_2 (GncSqlBackend* be)
+upgrade_recurrence_table_1_2 (GncSqlBackend* sql_be)
 {
     /* Step 1: add field, but allow it to be null */
-    gboolean ok = be->add_columns_to_table(TABLE_NAME,
+    gboolean ok = sql_be->add_columns_to_table(TABLE_NAME,
                                            weekend_adjust_col_table);
     if (!ok)
     {
@@ -392,28 +392,28 @@ upgrade_recurrence_table_1_2 (GncSqlBackend* be)
         sql << "UPDATE " << TABLE_NAME << " SET " <<
             weekend_adjust_col_table[0]->name() << "='" <<
             weekend_adj_str << "'";
-        auto stmt = be->create_statement_from_sql(sql.str());
-        be->execute_nonselect_statement(stmt);
+        auto stmt = sql_be->create_statement_from_sql(sql.str());
+        sql_be->execute_nonselect_statement(stmt);
         g_free (weekend_adj_str);
     }
 
     /* Step 3: rewrite the table, requiring the weekend_adj column to be non-null */
-    be->upgrade_table(TABLE_NAME, col_table);
+    sql_be->upgrade_table(TABLE_NAME, col_table);
 
 }
 
 void
-GncSqlRecurrenceBackend::create_tables (GncSqlBackend* be)
+GncSqlRecurrenceBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
     gboolean ok;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        (void)be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        (void)sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
     }
     else if (version < TABLE_VERSION)
     {
@@ -422,9 +422,9 @@ GncSqlRecurrenceBackend::create_tables (GncSqlBackend* be)
         */
         if (version == 1)
         {
-            upgrade_recurrence_table_1_2 (be);
+            upgrade_recurrence_table_1_2 (sql_be);
         }
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
         PINFO ("Recurrence table upgraded from version %d to version %d\n", version,
                TABLE_VERSION);
     }
diff --git a/src/backend/sql/gnc-recurrence-sql.h b/src/backend/sql/gnc-recurrence-sql.h
index 9466d00..add28dd 100644
--- a/src/backend/sql/gnc-recurrence-sql.h
+++ b/src/backend/sql/gnc-recurrence-sql.h
@@ -36,13 +36,13 @@ extern "C"
 }
 #include "gnc-backend-sql.h"
 
-gboolean gnc_sql_recurrence_save (GncSqlBackend* be, const GncGUID* guid,
+gboolean gnc_sql_recurrence_save (GncSqlBackend* sql_be, const GncGUID* guid,
                                   const Recurrence* pRecurrence);
-void gnc_sql_recurrence_save_list (GncSqlBackend* be, const GncGUID* guid,
+void gnc_sql_recurrence_save_list (GncSqlBackend* sql_be, const GncGUID* guid,
                                    GList* schedule);
-gboolean gnc_sql_recurrence_delete (GncSqlBackend* be, const GncGUID* guid);
-Recurrence* gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid);
-GList* gnc_sql_recurrence_load_list (GncSqlBackend* be, const GncGUID* guid);
+gboolean gnc_sql_recurrence_delete (GncSqlBackend* sql_be, const GncGUID* guid);
+Recurrence* gnc_sql_recurrence_load (GncSqlBackend* sql_be, const GncGUID* guid);
+GList* gnc_sql_recurrence_load_list (GncSqlBackend* sql_be, const GncGUID* guid);
 
 void gnc_sql_init_recurrence_handler (void);
 
diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp
index 0705ec6..326cf83 100644
--- a/src/backend/sql/gnc-schedxaction-sql.cpp
+++ b/src/backend/sql/gnc-schedxaction-sql.cpp
@@ -88,30 +88,30 @@ public:
                       const std::string& table, const EntryVec& vec) :
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
 };
 
 /* ================================================================= */
 static  SchedXaction*
-load_single_sx (GncSqlBackend* be, GncSqlRow& row)
+load_single_sx (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     SchedXaction* pSx;
     GList* schedule;
     GDate start_date;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
+    guid = gnc_sql_load_guid (sql_be, row);
     g_assert (guid != NULL);
-    pSx = xaccSchedXactionMalloc (be->book());
+    pSx = xaccSchedXactionMalloc (sql_be->book());
 
     gnc_sx_begin_edit (pSx);
-    gnc_sql_load_object (be, row, GNC_SX_ID, pSx, col_table);
-    schedule = gnc_sql_recurrence_load_list (be, guid);
+    gnc_sql_load_object (sql_be, row, GNC_SX_ID, pSx, col_table);
+    schedule = gnc_sql_recurrence_load_list (sql_be, guid);
     gnc_sx_set_schedule (pSx, schedule);
     gnc_sx_commit_edit (pSx);
-    gnc_sql_transaction_load_tx_for_account (be, pSx->template_acct);
+    gnc_sql_transaction_load_tx_for_account (sql_be, pSx->template_acct);
 
     g_object_get (pSx, "start-date", &start_date, NULL);
 
@@ -119,24 +119,24 @@ load_single_sx (GncSqlBackend* be, GncSqlRow& row)
 }
 
 void
-GncSqlSchedXactionBackend::load_all (GncSqlBackend* be)
+GncSqlSchedXactionBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << SCHEDXACTION_TABLE;
-    auto stmt = be->create_statement_from_sql(sql.str());
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
     if (stmt == NULL) return;
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     SchedXactions* sxes;
     InstanceVec instances;
-    sxes = gnc_book_get_schedxactions (be->book());
+    sxes = gnc_book_get_schedxactions (sql_be->book());
 
     for (auto row : *result)
     {
         SchedXaction* sx;
 
-        sx = load_single_sx (be, row);
+        sx = load_single_sx (sql_be, row);
         if (sx != nullptr)
         {
             gnc_sxes_add_sx (sxes, sx);
@@ -145,13 +145,13 @@ GncSqlSchedXactionBackend::load_all (GncSqlBackend* be)
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 
 /* ================================================================= */
 bool
-GncSqlSchedXactionBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlSchedXactionBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     SchedXaction* pSx;
     const GncGUID* guid;
@@ -159,7 +159,7 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* be, QofInstance* inst)
     gboolean is_infant;
     gboolean is_ok;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_SX (inst), FALSE);
 
@@ -170,7 +170,7 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -178,16 +178,16 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (be, op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx,
+    is_ok = gnc_sql_do_db_operation (sql_be, op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx,
                                      col_table);
     guid = qof_instance_get_guid (inst);
     if (op == OP_DB_INSERT || op == OP_DB_UPDATE)
     {
-        gnc_sql_recurrence_save_list (be, guid, gnc_sx_get_schedule (pSx));
+        gnc_sql_recurrence_save_list (sql_be, guid, gnc_sx_get_schedule (pSx));
     }
     else
     {
-        gnc_sql_recurrence_delete (be, guid);
+        gnc_sql_recurrence_delete (sql_be, guid);
     }
 
     if (is_ok)
@@ -195,11 +195,11 @@ GncSqlSchedXactionBackend::commit (GncSqlBackend* be, QofInstance* inst)
         // Now, commit any slots
         if (op == OP_DB_INSERT || op == OP_DB_UPDATE)
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
diff --git a/src/backend/sql/gnc-schedxaction-sql.h b/src/backend/sql/gnc-schedxaction-sql.h
index 3b22713..95a362f 100644
--- a/src/backend/sql/gnc-schedxaction-sql.h
+++ b/src/backend/sql/gnc-schedxaction-sql.h
@@ -35,6 +35,6 @@ extern "C"
 #include "gnc-backend-sql.h"
 
 void gnc_sql_init_schedxaction_handler (void);
-gboolean gnc_sql_save_schedxaction (GncSqlBackend* be, QofInstance* inst);
+gboolean gnc_sql_save_schedxaction (GncSqlBackend* sql_be, QofInstance* inst);
 
 #endif /* GNC_SCHEDXACTION_SQL_H */
diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp
index 05985eb..b87c641 100644
--- a/src/backend/sql/gnc-slots-sql.cpp
+++ b/src/backend/sql/gnc-slots-sql.cpp
@@ -703,23 +703,23 @@ save_slot (const gchar* key, KvpValue* value, gpointer data)
 }
 
 gboolean
-gnc_sql_slots_save (GncSqlBackend* be, const GncGUID* guid, gboolean is_infant,
+gnc_sql_slots_save (GncSqlBackend* sql_be, const GncGUID* guid, gboolean is_infant,
                     QofInstance* inst)
 {
     slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
     KvpFrame* pFrame = qof_instance_get_slots (inst);
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
     g_return_val_if_fail (pFrame != NULL, FALSE);
 
     // If this is not saving into a new db, clear out the old saved slots first
-    if (!be->pristine() && !is_infant)
+    if (!sql_be->pristine() && !is_infant)
     {
-        (void)gnc_sql_slots_delete (be, guid);
+        (void)gnc_sql_slots_delete (sql_be, guid);
     }
 
-    slot_info.be = be;
+    slot_info.be = sql_be;
     slot_info.guid = guid;
     pFrame->for_each_slot (save_slot, &slot_info);
     (void)g_string_free (slot_info.path, TRUE);
@@ -728,24 +728,24 @@ gnc_sql_slots_save (GncSqlBackend* be, const GncGUID* guid, gboolean is_infant,
 }
 
 gboolean
-gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid)
+gnc_sql_slots_delete (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     gchar* buf;
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
     slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
 
     (void)guid_to_string_buff (guid, guid_buf);
 
     buf = g_strdup_printf ("SELECT * FROM %s WHERE obj_guid='%s' and slot_type in ('%d', '%d') and not guid_val is null",
                            TABLE_NAME, guid_buf, KvpValue::Type::FRAME, KvpValue::Type::GLIST);
-    auto stmt = be->create_statement_from_sql(buf);
+    auto stmt = sql_be->create_statement_from_sql(buf);
     g_free (buf);
     if (stmt != nullptr)
     {
-        auto result = be->execute_select_statement(stmt);
+        auto result = sql_be->execute_select_statement(stmt);
         for (auto row : *result)
         {
             try
@@ -755,7 +755,7 @@ gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid)
                 GncGUID child_guid;
                 auto val = row.get_string_at_col (table_row->name());
                 (void)string_to_guid (val.c_str(), &child_guid);
-                gnc_sql_slots_delete (be, &child_guid);
+                gnc_sql_slots_delete (sql_be, &child_guid);
             }
             catch (std::invalid_argument)
             {
@@ -764,10 +764,10 @@ gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid)
         }
     }
 
-    slot_info.be = be;
+    slot_info.be = sql_be;
     slot_info.guid = guid;
     slot_info.is_ok = TRUE;
-    slot_info.is_ok = gnc_sql_do_db_operation (be, OP_DB_DELETE, TABLE_NAME,
+    slot_info.is_ok = gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TABLE_NAME,
                                                TABLE_NAME, &slot_info, obj_guid_col_table);
 
     return slot_info.is_ok;
@@ -807,13 +807,13 @@ load_slot (slot_info_t* pInfo, GncSqlRow& row)
 }
 
 void
-gnc_sql_slots_load (GncSqlBackend* be, QofInstance* inst)
+gnc_sql_slots_load (GncSqlBackend* sql_be, QofInstance* inst)
 {
     slot_info_t info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) };
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (inst != NULL);
 
-    info.be = be;
+    info.be = sql_be;
     info.guid = qof_instance_get_guid (inst);
     info.pKvpFrame = qof_instance_get_slots (inst);
     info.context = NONE;
@@ -846,37 +846,37 @@ slots_load_info (slot_info_t* pInfo)
 }
 
 static  const GncGUID*
-load_obj_guid (const GncSqlBackend* be, GncSqlRow& row)
+load_obj_guid (const GncSqlBackend* sql_be, GncSqlRow& row)
 {
     static GncGUID guid;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    gnc_sql_load_object (be, row, NULL, &guid, obj_guid_col_table);
+    gnc_sql_load_object (sql_be, row, NULL, &guid, obj_guid_col_table);
 
     return &guid;
 }
 
 static void
-load_slot_for_list_item (GncSqlBackend* be, GncSqlRow& row,
+load_slot_for_list_item (GncSqlBackend* sql_be, GncSqlRow& row,
                          QofCollection* coll)
 {
     slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL };
     const GncGUID* guid;
     QofInstance* inst;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (coll != NULL);
 
-    guid = load_obj_guid (be, row);
+    guid = load_obj_guid (sql_be, row);
     g_assert (guid != NULL);
     inst = qof_collection_lookup_entity (coll, guid);
 
-    slot_info.be = be;
+    slot_info.be = sql_be;
     slot_info.pKvpFrame = qof_instance_get_slots (inst);
     slot_info.context = NONE;
 
-    gnc_sql_load_object (be, row, TABLE_NAME, &slot_info, col_table);
+    gnc_sql_load_object (sql_be, row, TABLE_NAME, &slot_info, col_table);
 
     if (slot_info.path != NULL)
     {
@@ -885,12 +885,12 @@ load_slot_for_list_item (GncSqlBackend* be, GncSqlRow& row,
 }
 
 void
-gnc_sql_slots_load_for_instancevec (GncSqlBackend* be, InstanceVec& instances)
+gnc_sql_slots_load_for_instancevec (GncSqlBackend* sql_be, InstanceVec& instances)
 {
     QofCollection* coll;
     std::stringstream sql;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     // Ignore empty list
     if (instances.empty()) return;
@@ -911,38 +911,38 @@ gnc_sql_slots_load_for_instancevec (GncSqlBackend* be, InstanceVec& instances)
         sql << ")";
 
     // Execute the query and load the slots
-    auto stmt = be->create_statement_from_sql(sql.str());
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
     if (stmt == nullptr)
     {
         PERR ("stmt == NULL, SQL = '%s'\n", sql.str().c_str());
         return;
     }
-    auto result = be->execute_select_statement (stmt);
+    auto result = sql_be->execute_select_statement (stmt);
     for (auto row : *result)
-        load_slot_for_list_item (be, row, coll);
+        load_slot_for_list_item (sql_be, row, coll);
 }
 
 static void
-load_slot_for_book_object (GncSqlBackend* be, GncSqlRow& row,
+load_slot_for_book_object (GncSqlBackend* sql_be, GncSqlRow& row,
                            BookLookupFn lookup_fn)
 {
     slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL };
     const GncGUID* guid;
     QofInstance* inst;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (lookup_fn != NULL);
 
-    guid = load_obj_guid (be, row);
+    guid = load_obj_guid (sql_be, row);
     g_return_if_fail (guid != NULL);
-    inst = lookup_fn (guid, be->book());
+    inst = lookup_fn (guid, sql_be->book());
     g_return_if_fail (inst != NULL);
 
-    slot_info.be = be;
+    slot_info.be = sql_be;
     slot_info.pKvpFrame = qof_instance_get_slots (inst);
     slot_info.path = NULL;
 
-    gnc_sql_load_object (be, row, TABLE_NAME, &slot_info, col_table);
+    gnc_sql_load_object (sql_be, row, TABLE_NAME, &slot_info, col_table);
 
     if (slot_info.path != NULL)
     {
@@ -955,17 +955,17 @@ load_slot_for_book_object (GncSqlBackend* be, GncSqlRow& row,
  * supplied by a subquery.  The subquery should be of the form "SELECT DISTINCT guid FROM ...".
  * This is faster than loading for one object at a time because fewer SQL queries * are used.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param subquery Subquery SQL string
  * @param lookup_fn Lookup function
  */
-void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be,
+void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* sql_be,
                                           const gchar* subquery,
                                           BookLookupFn lookup_fn)
 {
     gchar* sql;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     // Ignore empty subquery
     if (subquery == NULL) return;
@@ -975,7 +975,7 @@ void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be,
                            subquery);
 
     // Execute the query and load the slots
-    auto stmt = be->create_statement_from_sql(sql);
+    auto stmt = sql_be->create_statement_from_sql(sql);
     if (stmt == nullptr)
     {
         PERR ("stmt == NULL, SQL = '%s'\n", sql);
@@ -983,26 +983,26 @@ void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be,
         return;
     }
     g_free (sql);
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     for (auto row : *result)
-        load_slot_for_book_object (be, row, lookup_fn);
+        load_slot_for_book_object (sql_be, row, lookup_fn);
 }
 
 /* ================================================================= */
 void
-GncSqlSlotsBackend::create_tables (GncSqlBackend* be)
+GncSqlSlotsBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
     gboolean ok;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TABLE_NAME);
+    version = sql_be->get_table_version( TABLE_NAME);
     if (version == 0)
     {
-        (void)be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
+        (void)sql_be->create_table(TABLE_NAME, TABLE_VERSION, col_table);
 
-        ok = be->create_index ("slots_guid_index", TABLE_NAME,
+        ok = sql_be->create_index ("slots_guid_index", TABLE_NAME,
                                obj_guid_col_table);
         if (!ok)
         {
@@ -1017,8 +1017,8 @@ GncSqlSlotsBackend::create_tables (GncSqlBackend* be)
         */
         if (version == 1)
         {
-            be->upgrade_table(TABLE_NAME, col_table);
-            ok = be->create_index ("slots_guid_index", TABLE_NAME,
+            sql_be->upgrade_table(TABLE_NAME, col_table);
+            ok = sql_be->create_index ("slots_guid_index", TABLE_NAME,
                                    obj_guid_col_table);
             if (!ok)
             {
@@ -1027,13 +1027,13 @@ GncSqlSlotsBackend::create_tables (GncSqlBackend* be)
         }
         else if (version == 2)
         {
-            ok = be->add_columns_to_table(TABLE_NAME, gdate_col_table);
+            ok = sql_be->add_columns_to_table(TABLE_NAME, gdate_col_table);
             if (!ok)
             {
                 PERR ("Unable to add gdate column\n");
             }
         }
-        be->set_table_version (TABLE_NAME, TABLE_VERSION);
+        sql_be->set_table_version (TABLE_NAME, TABLE_VERSION);
         PINFO ("Slots table upgraded from version %d to version %d\n", version,
                TABLE_VERSION);
     }
diff --git a/src/backend/sql/gnc-slots-sql.h b/src/backend/sql/gnc-slots-sql.h
index e931eda..ba4072d 100644
--- a/src/backend/sql/gnc-slots-sql.h
+++ b/src/backend/sql/gnc-slots-sql.h
@@ -39,39 +39,39 @@ extern "C"
 /**
  * gnc_sql_slots_save - Saves slots for an object to the db.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param guid Object guid
  * @param is_infant Is this an infant object?
  * @param inst The QodInstance owning the slots.
  * @return TRUE if successful, FALSE if error
  */
-gboolean gnc_sql_slots_save (GncSqlBackend* be, const GncGUID* guid,
+gboolean gnc_sql_slots_save (GncSqlBackend* sql_be, const GncGUID* guid,
                              gboolean is_infant, QofInstance* inst);
 
 /**
  * gnc_sql_slots_delete - Deletes slots for an object from the db.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param guid Object guid
  * @return TRUE if successful, FALSE if error
  */
-gboolean gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid);
+gboolean gnc_sql_slots_delete (GncSqlBackend* sql_be, const GncGUID* guid);
 
 /** Loads slots for an object from the db.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  */
-void gnc_sql_slots_load (GncSqlBackend* be, QofInstance* inst);
+void gnc_sql_slots_load (GncSqlBackend* sql_be, QofInstance* inst);
 
 /**
  * gnc_sql_slots_load_for_instancevec - Loads slots for a set of QofInstance*
  * from the db.  Loading slots for a set is faster than loading for one object
  * at a time because fewer SQL queries are used.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param list List of objects
  */
-void gnc_sql_slots_load_for_instancevec (GncSqlBackend* be,
+void gnc_sql_slots_load_for_instancevec (GncSqlBackend* sql_be,
                                          InstanceVec& instances);
 
 typedef QofInstance* (*BookLookupFn) (const GncGUID* guid,
@@ -82,11 +82,11 @@ typedef QofInstance* (*BookLookupFn) (const GncGUID* guid,
  * supplied by a subquery.  The subquery should be of the form "SELECT DISTINCT guid FROM ...".
  * This is faster than loading for one object at a time because fewer SQL queries * are used.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param subquery Subquery SQL string
  * @param lookup_fn Lookup function to get the right object from the book
  */
-void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be,
+void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* sql_be,
                                           const gchar* subquery,
                                           BookLookupFn lookup_fn);
 
diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp
index da4beb0..407200d 100644
--- a/src/backend/sql/gnc-tax-table-sql.cpp
+++ b/src/backend/sql/gnc-tax-table-sql.cpp
@@ -121,7 +121,7 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
     bool write(GncSqlBackend*) override;
 };
 
@@ -210,25 +210,25 @@ tt_set_parent_guid (gpointer pObject,  gpointer pValue)
 }
 
 static void
-load_single_ttentry (GncSqlBackend* be, GncSqlRow& row, GncTaxTable* tt)
+load_single_ttentry (GncSqlBackend* sql_be, GncSqlRow& row, GncTaxTable* tt)
 {
     GncTaxTableEntry* e = gncTaxTableEntryCreate ();
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (tt != NULL);
 
-    gnc_sql_load_object (be, row, GNC_ID_TAXTABLE, e, ttentries_col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, e, ttentries_col_table);
     gncTaxTableAddEntry (tt, e);
 }
 
 static void
-load_taxtable_entries (GncSqlBackend* be, GncTaxTable* tt)
+load_taxtable_entries (GncSqlBackend* sql_be, GncTaxTable* tt)
 {
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
     GValue value;
     gchar* buf;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (tt != NULL);
 
     guid_to_string_buff (qof_instance_get_guid (QOF_INSTANCE (tt)), guid_buf);
@@ -237,31 +237,31 @@ load_taxtable_entries (GncSqlBackend* be, GncTaxTable* tt)
     g_value_set_string (&value, guid_buf);
     buf = g_strdup_printf ("SELECT * FROM %s WHERE taxtable='%s'",
                            TTENTRIES_TABLE_NAME, guid_buf);
-    auto stmt = be->create_statement_from_sql (buf);
+    auto stmt = sql_be->create_statement_from_sql (buf);
     g_free (buf);
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     for (auto row : *result)
-        load_single_ttentry (be, row, tt);
+        load_single_ttentry (sql_be, row, tt);
 }
 
 static void
-load_single_taxtable (GncSqlBackend* be, GncSqlRow& row,
+load_single_taxtable (GncSqlBackend* sql_be, GncSqlRow& row,
                       GList** l_tt_needing_parents)
 {
     const GncGUID* guid;
     GncTaxTable* tt;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    tt = gncTaxTableLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    tt = gncTaxTableLookup (sql_be->book(), guid);
     if (tt == NULL)
     {
-        tt = gncTaxTableCreate (be->book());
+        tt = gncTaxTableCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_TAXTABLE, tt, tt_col_table);
-    gnc_sql_slots_load (be, QOF_INSTANCE (tt));
-    load_taxtable_entries (be, tt);
+    gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, tt, tt_col_table);
+    gnc_sql_slots_load (sql_be, QOF_INSTANCE (tt));
+    load_taxtable_entries (sql_be, tt);
 
     /* If the tax table doesn't have a parent, it might be because it hasn't been loaded yet.
        If so, add this tax table to the list of tax tables with no parent, along with the parent
@@ -274,7 +274,7 @@ load_single_taxtable (GncSqlBackend* be, GncSqlRow& row,
 
         s->tt = tt;
         s->have_guid = FALSE;
-        gnc_sql_load_object (be, row, GNC_ID_TAXTABLE, s, tt_parent_col_table);
+        gnc_sql_load_object (sql_be, row, GNC_ID_TAXTABLE, s, tt_parent_col_table);
         if (s->have_guid)
         {
             *l_tt_needing_parents = g_list_prepend (*l_tt_needing_parents, s);
@@ -289,19 +289,19 @@ load_single_taxtable (GncSqlBackend* be, GncSqlRow& row,
 }
 
 void
-GncSqlTaxTableBackend::load_all (GncSqlBackend* be)
+GncSqlTaxTableBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     /* First time, create the query */
     std::stringstream sql;
     sql << "SELECT * FROM " << TT_TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     GList* tt_needing_parents = NULL;
 
     for (auto row : *result)
-        load_single_taxtable (be, row, &tt_needing_parents);
+        load_single_taxtable (sql_be, row, &tt_needing_parents);
 
     /* While there are items on the list of taxtables needing parents,
        try to see if the parent has now been loaded.  Theory says that if
@@ -329,37 +329,37 @@ GncSqlTaxTableBackend::load_all (GncSqlBackend* be)
 
 /* ================================================================= */
 void
-GncSqlTaxTableBackend::create_tables (GncSqlBackend* be)
+GncSqlTaxTableBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( TT_TABLE_NAME);
+    version = sql_be->get_table_version( TT_TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TT_TABLE_NAME, TT_TABLE_VERSION, tt_col_table);
+        sql_be->create_table(TT_TABLE_NAME, TT_TABLE_VERSION, tt_col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TT_TABLE_NAME, tt_col_table);
-        be->set_table_version (TT_TABLE_NAME, TT_TABLE_VERSION);
+        sql_be->upgrade_table(TT_TABLE_NAME, tt_col_table);
+        sql_be->set_table_version (TT_TABLE_NAME, TT_TABLE_VERSION);
         PINFO ("Taxtables table upgraded from version 1 to version %d\n",
                TT_TABLE_VERSION);
     }
 
-    version = be->get_table_version( TTENTRIES_TABLE_NAME);
+    version = sql_be->get_table_version( TTENTRIES_TABLE_NAME);
     if (version == 0)
     {
-        be->create_table(TTENTRIES_TABLE_NAME, TTENTRIES_TABLE_VERSION,
+        sql_be->create_table(TTENTRIES_TABLE_NAME, TTENTRIES_TABLE_VERSION,
                               ttentries_col_table);
     }
     else if (version == 1)
     {
         /* Upgrade 64 bit int handling */
-        be->upgrade_table(TTENTRIES_TABLE_NAME, ttentries_col_table);
-        be->set_table_version (TTENTRIES_TABLE_NAME, TTENTRIES_TABLE_VERSION);
+        sql_be->upgrade_table(TTENTRIES_TABLE_NAME, ttentries_col_table);
+        sql_be->set_table_version (TTENTRIES_TABLE_NAME, TTENTRIES_TABLE_VERSION);
         PINFO ("Taxtable entries table upgraded from version 1 to version %d\n",
                TTENTRIES_TABLE_VERSION);
     }
@@ -367,35 +367,35 @@ GncSqlTaxTableBackend::create_tables (GncSqlBackend* be)
 
 /* ================================================================= */
 static gboolean
-delete_all_tt_entries (GncSqlBackend* be, const GncGUID* guid)
+delete_all_tt_entries (GncSqlBackend* sql_be, const GncGUID* guid)
 {
     guid_info_t guid_info;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
 
-    guid_info.be = be;
+    guid_info.be = sql_be;
     guid_info.guid = guid;
-    return gnc_sql_do_db_operation (be, OP_DB_DELETE, TTENTRIES_TABLE_NAME,
+    return gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, TTENTRIES_TABLE_NAME,
                                     TTENTRIES_TABLE_NAME, &guid_info, guid_col_table);
 }
 
 static gboolean
-save_tt_entries (GncSqlBackend* be, const GncGUID* guid, GList* entries)
+save_tt_entries (GncSqlBackend* sql_be, const GncGUID* guid, GList* entries)
 {
     GList* entry;
     gboolean is_ok;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (guid != NULL, FALSE);
 
     /* First, delete the old entries for this object */
-    is_ok = delete_all_tt_entries (be, guid);
+    is_ok = delete_all_tt_entries (sql_be, guid);
 
     for (entry = entries; entry != NULL && is_ok; entry = entry->next)
     {
         GncTaxTableEntry* e = (GncTaxTableEntry*)entry->data;
-        is_ok = gnc_sql_do_db_operation (be,
+        is_ok = gnc_sql_do_db_operation (sql_be,
                                          OP_DB_INSERT,
                                          TTENTRIES_TABLE_NAME,
                                          GNC_ID_TAXTABLE, e,
@@ -406,7 +406,7 @@ save_tt_entries (GncSqlBackend* be, const GncGUID* guid, GList* entries)
 }
 
 bool
-GncSqlTaxTableBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlTaxTableBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     GncTaxTable* tt;
     const GncGUID* guid;
@@ -416,7 +416,7 @@ GncSqlTaxTableBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_TAXTABLE (inst), FALSE);
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     tt = GNC_TAXTABLE (inst);
 
@@ -425,7 +425,7 @@ GncSqlTaxTableBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -433,7 +433,7 @@ GncSqlTaxTableBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_UPDATE;
     }
-    is_ok = gnc_sql_do_db_operation (be, op, TT_TABLE_NAME, GNC_ID_TAXTABLE, tt,
+    is_ok = gnc_sql_do_db_operation (sql_be, op, TT_TABLE_NAME, GNC_ID_TAXTABLE, tt,
                                      tt_col_table);
 
     if (is_ok)
@@ -442,18 +442,18 @@ GncSqlTaxTableBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
             if (is_ok)
             {
-                is_ok = save_tt_entries (be, guid, gncTaxTableGetEntries (tt));
+                is_ok = save_tt_entries (sql_be, guid, gncTaxTableGetEntries (tt));
             }
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
             if (is_ok)
             {
-                is_ok = delete_all_tt_entries (be, guid);
+                is_ok = delete_all_tt_entries (sql_be, guid);
             }
         }
     }
@@ -474,43 +474,43 @@ save_next_taxtable (QofInstance* inst, gpointer data)
 }
 
 bool
-GncSqlTaxTableBackend::write (GncSqlBackend* be)
+GncSqlTaxTableBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_TAXTABLE, be->book(), save_next_taxtable, &data);
+    qof_object_foreach (GNC_ID_TAXTABLE, sql_be->book(), save_next_taxtable, &data);
 
     return data.is_ok;
 }
 
 /* ================================================================= */
 template<> void
-GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::load (const GncSqlBackend* sql_be,
                                                   GncSqlRow& row,
                                                   QofIdTypeConst obj_name,
                                                   gpointer pObject) const noexcept
 {
     load_from_guid_ref(row, obj_name, pObject,
-                       [be](GncGUID* g){
-                           return gncTaxTableLookup(be->book(), g);
+                       [sql_be](GncGUID* g){
+                           return gncTaxTableLookup(sql_be->book(), g);
                        });
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_table(const GncSqlBackend* sql_be,
                                                          ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TAXTABLEREF>::add_to_query(const GncSqlBackend* sql_be,
                                                          QofIdTypeConst obj_name,
                                                          const gpointer pObject,
                                                          PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
 /* ================================================================= */
diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp
index 1ac88ae..bbca8a4 100644
--- a/src/backend/sql/gnc-transaction-sql.cpp
+++ b/src/backend/sql/gnc-transaction-sql.cpp
@@ -69,9 +69,9 @@ static QofLogModule log_module = G_LOG_DOMAIN;
 struct split_info_t : public write_objects_t
 {
     split_info_t () = default;
-    split_info_t (GncSqlBackend* be, bool o,
+    split_info_t (GncSqlBackend* sql_be, bool o,
                   GncSqlObjectBackendPtr e, const GncGUID* g):
-        write_objects_t(be, o, e), guid{g} {}
+        write_objects_t(sql_be, o, e), guid{g} {}
     const GncGUID* guid;
 };
 
@@ -143,7 +143,7 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override;
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
 };
 
 class GncSqlSplitBackend : public GncSqlObjectBackend
@@ -154,7 +154,7 @@ public:
         GncSqlObjectBackend(version, type, table, vec) {}
     void load_all(GncSqlBackend*) override { return; } // loaded by transaction.
     void create_tables(GncSqlBackend*) override;
-    bool commit (GncSqlBackend* be, QofInstance* inst) override;
+    bool commit (GncSqlBackend* sql_be, QofInstance* inst) override;
 };
 static GncSqlSplitBackend be_data_split {
     GNC_SQL_BACKEND_VERSION, GNC_ID_SPLIT, SPLIT_TABLE, split_col_table};
@@ -211,16 +211,16 @@ set_split_lot (gpointer pObject,  gpointer pLot)
 }
 
 static  Split*
-load_single_split (GncSqlBackend* be, GncSqlRow& row)
+load_single_split (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncGUID split_guid;
     Split* pSplit = NULL;
     gboolean bad_guid = FALSE;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
+    guid = gnc_sql_load_guid (sql_be, row);
     if (guid == NULL) return NULL;
     if (guid_equal (guid, guid_null ()))
     {
@@ -231,36 +231,36 @@ load_single_split (GncSqlBackend* be, GncSqlRow& row)
     else
     {
         split_guid = *guid;
-        pSplit = xaccSplitLookup (&split_guid, be->book());
+        pSplit = xaccSplitLookup (&split_guid, sql_be->book());
     }
 
     if (pSplit == NULL)
     {
-        pSplit = xaccMallocSplit (be->book());
+        pSplit = xaccMallocSplit (sql_be->book());
     }
 
     /* If the split is dirty, don't overwrite it */
     if (!qof_instance_is_dirty (QOF_INSTANCE (pSplit)))
     {
-        gnc_sql_load_object (be, row, GNC_ID_SPLIT, pSplit, split_col_table);
+        gnc_sql_load_object (sql_be, row, GNC_ID_SPLIT, pSplit, split_col_table);
     }
 
     /*# -ifempty */
-    if (pSplit != xaccSplitLookup (&split_guid, be->book()))
+    if (pSplit != xaccSplitLookup (&split_guid, sql_be->book()))
     {
         gchar guidstr[GUID_ENCODING_LENGTH + 1];
         guid_to_string_buff (qof_instance_get_guid (pSplit), guidstr);
         PERR ("A malformed split with id %s was found in the dataset.", guidstr);
-        qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_DATA_CORRUPT);
+        qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_DATA_CORRUPT);
         pSplit = NULL;
     }
     return pSplit;
 }
 
 static void
-load_splits_for_tx_list (GncSqlBackend* be, InstanceVec& transactions)
+load_splits_for_tx_list (GncSqlBackend* sql_be, InstanceVec& transactions)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
 
@@ -270,51 +270,51 @@ load_splits_for_tx_list (GncSqlBackend* be, InstanceVec& transactions)
     sql << ")";
 
     // Execute the query and load the splits
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement (stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement (stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        Split* s = load_single_split (be, row);
+        Split* s = load_single_split (sql_be, row);
         if (s != nullptr)
             instances.push_back(QOF_INSTANCE(s));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 static  Transaction*
-load_single_tx (GncSqlBackend* be, GncSqlRow& row)
+load_single_tx (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncGUID tx_guid;
     Transaction* pTx;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
+    guid = gnc_sql_load_guid (sql_be, row);
     if (guid == NULL) return NULL;
     tx_guid = *guid;
 
     // Don't overwrite the transaction if it's already been loaded (and possibly modified).
-    pTx = xaccTransLookup (&tx_guid, be->book());
+    pTx = xaccTransLookup (&tx_guid, sql_be->book());
     if (pTx != NULL)
     {
         return NULL;
     }
 
-    pTx = xaccMallocTransaction (be->book());
+    pTx = xaccMallocTransaction (sql_be->book());
     xaccTransBeginEdit (pTx);
-    gnc_sql_load_object (be, row, GNC_ID_TRANS, pTx, tx_col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_TRANS, pTx, tx_col_table);
 
-    if (pTx != xaccTransLookup (&tx_guid, be->book()))
+    if (pTx != xaccTransLookup (&tx_guid, sql_be->book()))
     {
         gchar guidstr[GUID_ENCODING_LENGTH + 1];
         guid_to_string_buff (qof_instance_get_guid (pTx), guidstr);
         PERR ("A malformed transaction with id %s was found in the dataset.", guidstr);
-        qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_DATA_CORRUPT);
+        qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_DATA_CORRUPT);
         pTx = NULL;
     }
 
@@ -342,16 +342,16 @@ typedef struct
  * Executes a transaction query statement and loads the transactions and all
  * of the splits.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param stmt SQL statement
  */
 static void
-query_transactions (GncSqlBackend* be, const GncSqlStatementPtr& stmt)
+query_transactions (GncSqlBackend* sql_be, const GncSqlStatementPtr& stmt)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (stmt != NULL);
 
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     if (result->begin() == result->end())
         return;
 
@@ -360,14 +360,14 @@ query_transactions (GncSqlBackend* be, const GncSqlStatementPtr& stmt)
 #if LOAD_TRANSACTIONS_AS_NEEDED
     GSList* bal_list = NULL;
     GSList* nextbal;
-    Account* root = gnc_book_get_root_account (be->book());
+    Account* root = gnc_book_get_root_account (sql_be->book());
 
     qof_event_suspend ();
     xaccAccountBeginEdit (root);
 
     // Save the start/ending balances (balance, cleared and reconciled) for
     // every account.
-    gnc_account_foreach_descendant (gnc_book_get_root_account (be->primary_book),
+    gnc_account_foreach_descendant (gnc_book_get_root_account (sql_be->primary_book),
                                     save_account_balances,
                                     &bal_list);
 #endif
@@ -376,7 +376,7 @@ query_transactions (GncSqlBackend* be, const GncSqlStatementPtr& stmt)
     InstanceVec instances;
     for (auto row : *result)
     {
-        tx = load_single_tx (be, row);
+        tx = load_single_tx (sql_be, row);
         if (tx != nullptr)
         {
             xaccTransScrubPostedDate (tx);
@@ -387,8 +387,8 @@ query_transactions (GncSqlBackend* be, const GncSqlStatementPtr& stmt)
     // Load all splits and slots for the transactions
     if (!instances.empty())
     {
-        gnc_sql_slots_load_for_instancevec (be, instances);
-        load_splits_for_tx_list (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
+        load_splits_for_tx_list (sql_be, instances);
     }
 
     // Commit all of the transactions
@@ -464,22 +464,22 @@ query_transactions (GncSqlBackend* be, const GncSqlStatementPtr& stmt)
 /**
  * Creates the transaction and split tables.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  */
 void
-GncSqlTransBackend::create_tables (GncSqlBackend* be)
+GncSqlTransBackend::create_tables (GncSqlBackend* sql_be)
 {
     gint version;
     gboolean ok;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
-    version = be->get_table_version( m_table_name.c_str());
+    version = sql_be->get_table_version( m_table_name.c_str());
     if (version == 0)
     {
-        (void)be->create_table(TRANSACTION_TABLE, TX_TABLE_VERSION,
+        (void)sql_be->create_table(TRANSACTION_TABLE, TX_TABLE_VERSION,
                                     tx_col_table);
-        ok = be->create_index ("tx_post_date_index", TRANSACTION_TABLE,
+        ok = sql_be->create_index ("tx_post_date_index", TRANSACTION_TABLE,
                                    post_date_col_table);
         if (!ok)
         {
@@ -492,26 +492,26 @@ GncSqlTransBackend::create_tables (GncSqlBackend* be)
             1->2: 64 bit int handling
             2->3: allow dates to be NULL
         */
-        be->upgrade_table(m_table_name.c_str(), tx_col_table);
-        be->set_table_version (m_table_name.c_str(), m_version);
+        sql_be->upgrade_table(m_table_name.c_str(), tx_col_table);
+        sql_be->set_table_version (m_table_name.c_str(), m_version);
         PINFO ("Transactions table upgraded from version %d to version %d\n",
                version, m_version);
     }
 }
 void
-GncSqlSplitBackend::create_tables (GncSqlBackend* be)
+GncSqlSplitBackend::create_tables (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != nullptr);
+    g_return_if_fail (sql_be != nullptr);
 
-    auto version = be->get_table_version( m_table_name.c_str());
+    auto version = sql_be->get_table_version( m_table_name.c_str());
     if (version == 0)
     {
-        (void)be->create_table(m_table_name.c_str(),
+        (void)sql_be->create_table(m_table_name.c_str(),
                                     m_version, m_col_table);
-        if (!be->create_index("splits_tx_guid_index",
+        if (!sql_be->create_index("splits_tx_guid_index",
                                    m_table_name.c_str(), tx_guid_col_table))
             PERR ("Unable to create index\n");
-        if (!be->create_index("splits_account_guid_index",
+        if (!sql_be->create_index("splits_account_guid_index",
                                    m_table_name.c_str(),
                                    account_guid_col_table))
             PERR ("Unable to create index\n");
@@ -522,16 +522,16 @@ GncSqlSplitBackend::create_tables (GncSqlBackend* be)
         /* Upgrade:
            1->2: 64 bit int handling
            3->4: Split reconcile date can be NULL */
-        be->upgrade_table(m_table_name.c_str(), split_col_table);
-        if (!be->create_index("splits_tx_guid_index",
+        sql_be->upgrade_table(m_table_name.c_str(), split_col_table);
+        if (!sql_be->create_index("splits_tx_guid_index",
                                    m_table_name.c_str(),
                                    tx_guid_col_table))
             PERR ("Unable to create index\n");
-        if (!be->create_index("splits_account_guid_index",
+        if (!sql_be->create_index("splits_account_guid_index",
                                    m_table_name.c_str(),
                                    account_guid_col_table))
             PERR ("Unable to create index\n");
-        be->set_table_version (m_table_name.c_str(), m_version);
+        sql_be->set_table_version (m_table_name.c_str(), m_version);
         PINFO ("Splits table upgraded from version %d to version %d\n", version,
                m_version);
     }
@@ -563,24 +563,24 @@ delete_split_slots_cb (gpointer data, gpointer user_data)
 /**
  * Deletes all of the splits for a transaction
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param pTx Transaction
  * @return TRUE if successful, FALSE if unsuccessful
  */
 static gboolean
-delete_splits (GncSqlBackend* be, Transaction* pTx)
+delete_splits (GncSqlBackend* sql_be, Transaction* pTx)
 {
     split_info_t split_info;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (pTx != NULL, FALSE);
 
-    if (!gnc_sql_do_db_operation (be, OP_DB_DELETE, SPLIT_TABLE,
+    if (!gnc_sql_do_db_operation (sql_be, OP_DB_DELETE, SPLIT_TABLE,
                                   SPLIT_TABLE, pTx, tx_guid_col_table))
     {
         return FALSE;
     }
-    split_info.be = be;
+    split_info.be = sql_be;
     split_info.is_ok = TRUE;
 
     g_list_foreach (xaccTransGetSplitList (pTx), delete_split_slots_cb,
@@ -592,12 +592,12 @@ delete_splits (GncSqlBackend* be, Transaction* pTx)
 /**
  * Commits a split to the database
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param inst Split
  * @return TRUE if successful, FALSE if error
  */
 bool
-GncSqlSplitBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlSplitBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     E_DB_OPERATION op;
     gboolean is_infant;
@@ -605,14 +605,14 @@ GncSqlSplitBackend::commit (GncSqlBackend* be, QofInstance* inst)
     GncGUID* guid = (GncGUID*)qof_instance_get_guid (inst);
 
     g_return_val_if_fail (inst != NULL, FALSE);
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     is_infant = qof_instance_get_infant (inst);
     if (qof_instance_get_destroying (inst))
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -627,12 +627,12 @@ GncSqlSplitBackend::commit (GncSqlBackend* be, QofInstance* inst)
         qof_instance_set_guid (inst, guid);
     }
 
-    is_ok = gnc_sql_do_db_operation (be, op, SPLIT_TABLE, GNC_ID_SPLIT,
+    is_ok = gnc_sql_do_db_operation (sql_be, op, SPLIT_TABLE, GNC_ID_SPLIT,
                                      inst, split_col_table);
 
     if (is_ok && !qof_instance_get_destroying (inst))
     {
-        is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+        is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
     }
 
     return is_ok;
@@ -640,13 +640,13 @@ GncSqlSplitBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
 
 bool
-GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlTransBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     E_DB_OPERATION op;
     gboolean is_ok = TRUE;
     const char* err = NULL;
 
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
     g_return_val_if_fail (inst != NULL, FALSE);
 
     auto pTx = GNC_TRANS(inst);
@@ -655,7 +655,7 @@ GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -668,17 +668,17 @@ GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         gnc_commodity* commodity = xaccTransGetCurrency (pTx);
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (be, commodity);
+        is_ok = gnc_sql_save_commodity (sql_be, commodity);
         if (! is_ok)
         {
             err = "Commodity save failed: Probably an invalid or missing currency";
-            qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_DATA_CORRUPT);
+            qof_backend_set_error ((QofBackend*)sql_be, ERR_BACKEND_DATA_CORRUPT);
         }
     }
 
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx,
                                          tx_col_table);
         if (! is_ok)
         {
@@ -692,7 +692,7 @@ GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
         auto guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
             if (! is_ok)
             {
                 err = "Slots save failed. Check trace log for SQL errors";
@@ -700,14 +700,14 @@ GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
             if (! is_ok)
             {
                 err = "Slots delete failed. Check trace log for SQL errors";
             }
             if (is_ok)
             {
-                is_ok = delete_splits (be, pTx);
+                is_ok = delete_splits (sql_be, pTx);
                 if (! is_ok)
                 {
                     err = "Split delete failed. Check trace log for SQL errors";
@@ -743,17 +743,17 @@ GncSqlTransBackend::commit (GncSqlBackend* be, QofInstance* inst)
 /**
  * Loads all transactions for an account.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param account Account
  */
-void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* be,
+void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* sql_be,
                                               Account* account)
 {
     const GncGUID* guid;
     gchar guid_buf[GUID_ENCODING_LENGTH + 1];
     gchar* query_sql;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (account != NULL);
 
     guid = qof_instance_get_guid (QOF_INSTANCE (account));
@@ -761,11 +761,11 @@ void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* be,
     query_sql = g_strdup_printf (
                     "SELECT DISTINCT t.* FROM %s AS t, %s AS s WHERE s.tx_guid=t.guid AND s.account_guid ='%s'",
                     TRANSACTION_TABLE, SPLIT_TABLE, guid_buf);
-    auto stmt = be->create_statement_from_sql(query_sql);
+    auto stmt = sql_be->create_statement_from_sql(query_sql);
     g_free (query_sql);
     if (stmt != nullptr)
     {
-        query_transactions (be, stmt);
+        query_transactions (sql_be, stmt);
     }
 }
 
@@ -773,19 +773,19 @@ void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* be,
  * Loads all transactions.  This might be used during a save-as operation to ensure that
  * all data is in memory and ready to be saved.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  */
 void
-GncSqlTransBackend::load_all (GncSqlBackend* be)
+GncSqlTransBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     auto query_sql = g_strdup_printf ("SELECT * FROM %s", TRANSACTION_TABLE);
-    auto stmt = be->create_statement_from_sql(query_sql);
+    auto stmt = sql_be->create_statement_from_sql(query_sql);
     g_free (query_sql);
     if (stmt != nullptr)
     {
-        query_transactions (be, stmt);
+        query_transactions (sql_be, stmt);
     }
 }
 
@@ -831,7 +831,7 @@ convert_query_comparison_to_sql (QofQueryPredData* pPredData,
 }
 
 static void
-convert_query_term_to_sql (const GncSqlBackend* be, const gchar* fieldName,
+convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
                            QofQueryTerm* pTerm, GString* sql)
 {
     QofQueryPredData* pPredData;
@@ -970,7 +970,7 @@ convert_query_term_to_sql (const GncSqlBackend* be, const gchar* fieldName,
         {
             query_date_t date_data = (query_date_t)pPredData;
 
-            auto datebuf = be->time64_to_string (date_data->date.tv_sec);
+            auto datebuf = sql_be->time64_to_string (date_data->date.tv_sec);
             g_string_append_printf (sql, "'%s'", datebuf.c_str());
 
         }
@@ -1020,12 +1020,12 @@ typedef struct
 #define TX_GUID_CHECK 0
 
 G_GNUC_UNUSED static  gpointer
-compile_split_query (GncSqlBackend* be, QofQuery* query)
+compile_split_query (GncSqlBackend* sql_be, QofQuery* query)
 {
     split_query_info_t* query_info = NULL;
     gchar* query_sql;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
     g_return_val_if_fail (query != NULL, NULL);
 
     query_info = static_cast<decltype (query_info)> (
@@ -1076,7 +1076,7 @@ compile_split_query (GncSqlBackend* be, QofQuery* query)
                 if (strcmp (path, SPLIT_ACCOUNT) == 0 &&
                     strcmp (next_path, QOF_PARAM_GUID) == 0)
                 {
-                    convert_query_term_to_sql (be, "s.account_guid", term, sql);
+                    convert_query_term_to_sql (sql_be, "s.account_guid", term, sql);
 #if SIMPLE_QUERY_COMPILATION
                     goto done_compiling_query;
 #endif
@@ -1084,7 +1084,7 @@ compile_split_query (GncSqlBackend* be, QofQuery* query)
                 }
                 else if (strcmp (path, SPLIT_RECONCILE) == 0)
                 {
-                    convert_query_term_to_sql (be, "s.reconcile_state", term, sql);
+                    convert_query_term_to_sql (sql_be, "s.reconcile_state", term, sql);
 
                 }
                 else if (strcmp (path, SPLIT_TRANS) == 0)
@@ -1098,11 +1098,11 @@ compile_split_query (GncSqlBackend* be, QofQuery* query)
 #endif
                     if (strcmp (next_path, TRANS_DATE_POSTED) == 0)
                     {
-                        convert_query_term_to_sql (be, "t.post_date", term, sql);
+                        convert_query_term_to_sql (sql_be, "t.post_date", term, sql);
                     }
                     else if (strcmp (next_path, TRANS_DESCRIPTION) == 0)
                     {
-                        convert_query_term_to_sql (be, "t.description", term, sql);
+                        convert_query_term_to_sql (sql_be, "t.description", term, sql);
                     }
                     else
                     {
@@ -1112,7 +1112,7 @@ compile_split_query (GncSqlBackend* be, QofQuery* query)
                 }
                 else if (strcmp (path, SPLIT_VALUE) == 0)
                 {
-                    convert_query_term_to_sql (be, "s.value_num/s.value_denom", term, sql);
+                    convert_query_term_to_sql (sql_be, "s.value_num/s.value_denom", term, sql);
 
                 }
                 else
@@ -1165,7 +1165,7 @@ done_compiling_query:
         {
             query_sql = g_strdup_printf ("SELECT * FROM %s", TRANSACTION_TABLE);
         }
-        query_info->stmt = be->create_statement_from_sql(query_sql);
+        query_info->stmt = sql_be->create_statement_from_sql(query_sql);
 
         g_string_free (sql, TRUE);
         g_free (query_sql);
@@ -1174,7 +1174,7 @@ done_compiling_query:
     else
     {
         query_sql = g_strdup_printf ("SELECT * FROM %s", TRANSACTION_TABLE);
-        query_info->stmt = be->create_statement_from_sql(query_sql);
+        query_info->stmt = sql_be->create_statement_from_sql(query_sql);
         g_free (query_sql);
     }
 
@@ -1182,25 +1182,25 @@ done_compiling_query:
 }
 
 G_GNUC_UNUSED static void
-run_split_query (GncSqlBackend* be, gpointer pQuery)
+run_split_query (GncSqlBackend* sql_be, gpointer pQuery)
 {
     split_query_info_t* query_info = (split_query_info_t*)pQuery;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pQuery != NULL);
 
     if (!query_info->has_been_run)
     {
-        query_transactions (be, query_info->stmt);
+        query_transactions (sql_be, query_info->stmt);
         query_info->has_been_run = TRUE;
         query_info->stmt = nullptr;
     }
 }
 
 G_GNUC_UNUSED static void
-free_split_query (GncSqlBackend* be, gpointer pQuery)
+free_split_query (GncSqlBackend* sql_be, gpointer pQuery)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pQuery != NULL);
 
     g_free (pQuery);
@@ -1209,7 +1209,7 @@ free_split_query (GncSqlBackend* be, gpointer pQuery)
 /* ----------------------------------------------------------------- */
 typedef struct
 {
-    const GncSqlBackend* be;
+    const GncSqlBackend* sql_be;
     Account* acct;
     char reconcile_state;
     gnc_numeric balance;
@@ -1224,7 +1224,7 @@ set_acct_bal_account_from_guid (gpointer pObject, gpointer pValue)
     g_return_if_fail (pObject != NULL);
     g_return_if_fail (pValue != NULL);
 
-    bal->acct = xaccAccountLookup (guid, bal->be->book());
+    bal->acct = xaccAccountLookup (guid, bal->sql_be->book());
 }
 
 static void
@@ -1260,36 +1260,36 @@ static const EntryVec acct_balances_col_table
 };
 
 G_GNUC_UNUSED static  single_acct_balance_t*
-load_single_acct_balances (const GncSqlBackend* be, GncSqlRow& row)
+load_single_acct_balances (const GncSqlBackend* sql_be, GncSqlRow& row)
 {
     single_acct_balance_t* bal = NULL;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
     bal = static_cast<decltype (bal)> (g_malloc (sizeof (single_acct_balance_t)));
     g_assert (bal != NULL);
 
-    bal->be = be;
-    gnc_sql_load_object (be, row, NULL, bal, acct_balances_col_table);
+    bal->sql_be = sql_be;
+    gnc_sql_load_object (sql_be, row, NULL, bal, acct_balances_col_table);
 
     return bal;
 }
 
 GSList*
-gnc_sql_get_account_balances_slist (GncSqlBackend* be)
+gnc_sql_get_account_balances_slist (GncSqlBackend* sql_be)
 {
 #if LOAD_TRANSACTIONS_AS_NEEDED
     gchar* buf;
     GSList* bal_slist = NULL;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
     buf = g_strdup_printf ("SELECT account_guid, reconcile_state, sum(quantity_num) as quantity_num, quantity_denom FROM %s GROUP BY account_guid, reconcile_state, quantity_denom ORDER BY account_guid, reconcile_state",
                            SPLIT_TABLE);
-    auto stmt = be->create_statement_from_sql(buf);
+    auto stmt = sql_be->create_statement_from_sql(buf);
     g_assert (stmt != nullptr);
     g_free (buf);
-    auto result = be->execute_select_statement(stmt);
+    auto result = sql_be->execute_select_statement(stmt);
     acct_balances_t* bal = NULL;
 
     for (auto row : *result)
@@ -1297,7 +1297,7 @@ gnc_sql_get_account_balances_slist (GncSqlBackend* be)
         single_acct_balance_t* single_bal;
 
         // Get the next reconcile state balance and merge with other balances
-        single_bal = load_single_acct_balances (be, row);
+        single_bal = load_single_acct_balances (sql_be, row);
         if (single_bal != NULL)
         {
             if (bal != NULL && bal->acct != single_bal->acct)
@@ -1360,14 +1360,14 @@ gnc_sql_get_account_balances_slist (GncSqlBackend* be)
 
 /* ----------------------------------------------------------------- */
 template<> void
-GncSqlColumnTableEntryImpl<CT_TXREF>::load (const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TXREF>::load (const GncSqlBackend* sql_be,
                                             GncSqlRow& row,
                                             QofIdTypeConst obj_name,
                                             gpointer pObject) const noexcept
 {
     const gchar* guid_str;
 
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
     g_return_if_fail (pObject != NULL);
 
     try
@@ -1375,16 +1375,16 @@ GncSqlColumnTableEntryImpl<CT_TXREF>::load (const GncSqlBackend* be,
         auto val = row.get_string_at_col (m_col_name);
         GncGUID guid;
         (void)string_to_guid (val.c_str(), &guid);
-        auto tx = xaccTransLookup (&guid, be->book());
+        auto tx = xaccTransLookup (&guid, sql_be->book());
 
         // If the transaction is not found, try loading it
         if (tx == nullptr)
         {
             auto buf = std::string{"SELECT * FROM "} + TRANSACTION_TABLE +
                                        " WHERE guid='" + val + "'";
-            auto stmt = be->create_statement_from_sql (buf);
-            query_transactions ((GncSqlBackend*)be, stmt);
-            tx = xaccTransLookup (&guid, be->book());
+            auto stmt = sql_be->create_statement_from_sql (buf);
+            query_transactions ((GncSqlBackend*)sql_be, stmt);
+            tx = xaccTransLookup (&guid, sql_be->book());
         }
 
         if (tx != nullptr)
@@ -1394,19 +1394,19 @@ GncSqlColumnTableEntryImpl<CT_TXREF>::load (const GncSqlBackend* be,
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_table(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_table(const GncSqlBackend* sql_be,
                                                    ColVec& vec) const noexcept
 {
-    add_objectref_guid_to_table(be, vec);
+    add_objectref_guid_to_table(sql_be, vec);
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_query(const GncSqlBackend* be,
+GncSqlColumnTableEntryImpl<CT_TXREF>::add_to_query(const GncSqlBackend* sql_be,
                                                    QofIdTypeConst obj_name,
                                                    const gpointer pObject,
                                                    PairVec& vec) const noexcept
 {
-    add_objectref_guid_to_query(be, obj_name, pObject, vec);
+    add_objectref_guid_to_query(sql_be, obj_name, pObject, vec);
 }
 
 /* ================================================================= */
diff --git a/src/backend/sql/gnc-transaction-sql.h b/src/backend/sql/gnc-transaction-sql.h
index 9bec050..1658da7 100644
--- a/src/backend/sql/gnc-transaction-sql.h
+++ b/src/backend/sql/gnc-transaction-sql.h
@@ -41,10 +41,10 @@ void gnc_sql_init_transaction_handler (void);
 /**
  * Loads all transactions which have splits for a specific account.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @param account Account
  */
-void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* be,
+void gnc_sql_transaction_load_tx_for_account (GncSqlBackend* sql_be,
                                               Account* account);
 typedef struct
 {
@@ -58,9 +58,9 @@ typedef struct
  * Returns a list of acct_balances_t structures, one for each account which
  * has splits.
  *
- * @param be SQL backend
+ * @param sql_be SQL backend
  * @return GSList of acct_balances_t structures
  */
-GSList* gnc_sql_get_account_balances_slist (GncSqlBackend* be);
+GSList* gnc_sql_get_account_balances_slist (GncSqlBackend* sql_be);
 
 #endif /* GNC_TRANSACTION_SQL_H */
diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp
index c429f46..777456d 100644
--- a/src/backend/sql/gnc-vendor-sql.cpp
+++ b/src/backend/sql/gnc-vendor-sql.cpp
@@ -91,50 +91,50 @@ public:
 };
 
 static GncVendor*
-load_single_vendor (GncSqlBackend* be, GncSqlRow& row)
+load_single_vendor (GncSqlBackend* sql_be, GncSqlRow& row)
 {
     const GncGUID* guid;
     GncVendor* pVendor;
 
-    g_return_val_if_fail (be != NULL, NULL);
+    g_return_val_if_fail (sql_be != NULL, NULL);
 
-    guid = gnc_sql_load_guid (be, row);
-    pVendor = gncVendorLookup (be->book(), guid);
+    guid = gnc_sql_load_guid (sql_be, row);
+    pVendor = gncVendorLookup (sql_be->book(), guid);
     if (pVendor == NULL)
     {
-        pVendor = gncVendorCreate (be->book());
+        pVendor = gncVendorCreate (sql_be->book());
     }
-    gnc_sql_load_object (be, row, GNC_ID_VENDOR, pVendor, col_table);
+    gnc_sql_load_object (sql_be, row, GNC_ID_VENDOR, pVendor, col_table);
     qof_instance_mark_clean (QOF_INSTANCE (pVendor));
 
     return pVendor;
 }
 
 void
-GncSqlVendorBackend::load_all (GncSqlBackend* be)
+GncSqlVendorBackend::load_all (GncSqlBackend* sql_be)
 {
-    g_return_if_fail (be != NULL);
+    g_return_if_fail (sql_be != NULL);
 
     std::stringstream sql;
     sql << "SELECT * FROM " << TABLE_NAME;
-    auto stmt = be->create_statement_from_sql(sql.str());
-    auto result = be->execute_select_statement(stmt);
+    auto stmt = sql_be->create_statement_from_sql(sql.str());
+    auto result = sql_be->execute_select_statement(stmt);
     InstanceVec instances;
 
     for (auto row : *result)
     {
-        GncVendor* pVendor = load_single_vendor (be, row);
+        GncVendor* pVendor = load_single_vendor (sql_be, row);
         if (pVendor != nullptr)
             instances.push_back(QOF_INSTANCE(pVendor));
     }
 
     if (!instances.empty())
-        gnc_sql_slots_load_for_instancevec (be, instances);
+        gnc_sql_slots_load_for_instancevec (sql_be, instances);
 }
 
 /* ================================================================= */
 bool
-GncSqlVendorBackend::commit (GncSqlBackend* be, QofInstance* inst)
+GncSqlVendorBackend::commit (GncSqlBackend* sql_be, QofInstance* inst)
 {
     GncVendor* v;
     const GncGUID* guid;
@@ -144,7 +144,7 @@ GncSqlVendorBackend::commit (GncSqlBackend* be, QofInstance* inst)
 
     g_return_val_if_fail (inst != NULL, FALSE);
     g_return_val_if_fail (GNC_IS_VENDOR (inst), FALSE);
-    g_return_val_if_fail (be != NULL, FALSE);
+    g_return_val_if_fail (sql_be != NULL, FALSE);
 
     v = GNC_VENDOR (inst);
 
@@ -153,7 +153,7 @@ GncSqlVendorBackend::commit (GncSqlBackend* be, QofInstance* inst)
     {
         op = OP_DB_DELETE;
     }
-    else if (be->pristine() || is_infant)
+    else if (sql_be->pristine() || is_infant)
     {
         op = OP_DB_INSERT;
     }
@@ -164,11 +164,11 @@ GncSqlVendorBackend::commit (GncSqlBackend* be, QofInstance* inst)
     if (op != OP_DB_DELETE)
     {
         // Ensure the commodity is in the db
-        is_ok = gnc_sql_save_commodity (be, gncVendorGetCurrency (v));
+        is_ok = gnc_sql_save_commodity (sql_be, gncVendorGetCurrency (v));
     }
     if (is_ok)
     {
-        is_ok = gnc_sql_do_db_operation (be, op, TABLE_NAME, GNC_ID_VENDOR, v,
+        is_ok = gnc_sql_do_db_operation (sql_be, op, TABLE_NAME, GNC_ID_VENDOR, v,
                                          col_table);
     }
 
@@ -178,11 +178,11 @@ GncSqlVendorBackend::commit (GncSqlBackend* be, QofInstance* inst)
         guid = qof_instance_get_guid (inst);
         if (!qof_instance_get_destroying (inst))
         {
-            is_ok = gnc_sql_slots_save (be, guid, is_infant, inst);
+            is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
         }
         else
         {
-            is_ok = gnc_sql_slots_delete (be, guid);
+            is_ok = gnc_sql_slots_delete (sql_be, guid);
         }
     }
 
@@ -223,12 +223,12 @@ write_single_vendor (QofInstance* term_p, gpointer data_p)
 }
 
 bool
-GncSqlVendorBackend::write (GncSqlBackend* be)
+GncSqlVendorBackend::write (GncSqlBackend* sql_be)
 {
-    g_return_val_if_fail (be != NULL, FALSE);
-    write_objects_t data{be, true, this};
+    g_return_val_if_fail (sql_be != NULL, FALSE);
+    write_objects_t data{sql_be, true, this};
 
-    qof_object_foreach (GNC_ID_VENDOR, be->book(), write_single_vendor, &data);
+    qof_object_foreach (GNC_ID_VENDOR, sql_be->book(), write_single_vendor, &data);
 
     return data.is_ok;
 }
diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp
index f968a91..2a05d19 100644
--- a/src/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -114,7 +114,7 @@ private:
 
 /* gnc_sql_init
 void
-gnc_sql_init (GncSqlBackend* be)// C: 1 */
+gnc_sql_init (GncSqlBackend* sql_be)// C: 1 */
 /* static void
 test_gnc_sql_init (Fixture *fixture, gconstpointer pData)
 {
@@ -137,14 +137,14 @@ test_initial_load_cb (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_load
 void
-gnc_sql_load (GncSqlBackend* be,  QofBook *book, QofBackendLoadType loadType)// C: 1 */
+gnc_sql_load (GncSqlBackend* sql_be,  QofBook *book, QofBackendLoadType loadType)// C: 1 */
 /* static void
 test_gnc_sql_load (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* write_account_tree
 static gboolean
-write_account_tree (GncSqlBackend* be, Account* root)// 3
+write_account_tree (GncSqlBackend* sql_be, Account* root)// 3
 */
 /* static void
 test_write_account_tree (Fixture *fixture, gconstpointer pData)
@@ -152,7 +152,7 @@ test_write_account_tree (Fixture *fixture, gconstpointer pData)
 }*/
 /* write_accounts
 static gboolean
-write_accounts (GncSqlBackend* be)// 2
+write_accounts (GncSqlBackend* sql_be)// 2
 */
 /* static void
 test_write_accounts (Fixture *fixture, gconstpointer pData)
@@ -168,7 +168,7 @@ test_write_tx (Fixture *fixture, gconstpointer pData)
 }*/
 /* write_transactions
 static gboolean
-write_transactions (GncSqlBackend* be)// 2
+write_transactions (GncSqlBackend* sql_be)// 2
 */
 /* static void
 test_write_transactions (Fixture *fixture, gconstpointer pData)
@@ -176,7 +176,7 @@ test_write_transactions (Fixture *fixture, gconstpointer pData)
 }*/
 /* write_template_transactions
 static gboolean
-write_template_transactions (GncSqlBackend* be)// 2
+write_template_transactions (GncSqlBackend* sql_be)// 2
 */
 /* static void
 test_write_template_transactions (Fixture *fixture, gconstpointer pData)
@@ -184,7 +184,7 @@ test_write_template_transactions (Fixture *fixture, gconstpointer pData)
 }*/
 /* write_schedXactions
 static gboolean
-write_schedXactions (GncSqlBackend* be)// 2
+write_schedXactions (GncSqlBackend* sql_be)// 2
 */
 /* static void
 test_write_schedXactions (Fixture *fixture, gconstpointer pData)
@@ -200,7 +200,7 @@ test_write_cb (Fixture *fixture, gconstpointer pData)
 }*/
 /* update_progress
 static void
-update_progress (GncSqlBackend* be)// 17
+update_progress (GncSqlBackend* sql_be)// 17
 */
 /* static void
 test_update_progress (Fixture *fixture, gconstpointer pData)
@@ -208,7 +208,7 @@ test_update_progress (Fixture *fixture, gconstpointer pData)
 }*/
 /* finish_progress
 static void
-finish_progress (GncSqlBackend* be)// 4
+finish_progress (GncSqlBackend* sql_be)// 4
 */
 /* static void
 test_finish_progress (Fixture *fixture, gconstpointer pData)
@@ -216,21 +216,21 @@ test_finish_progress (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_sync_all
 void
-gnc_sql_sync_all (GncSqlBackend* be,  QofBook *book)// C: 2 in 1 */
+gnc_sql_sync_all (GncSqlBackend* sql_be,  QofBook *book)// C: 2 in 1 */
 /* static void
 test_gnc_sql_sync_all (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_begin_edit
 void
-gnc_sql_begin_edit (GncSqlBackend *be, QofInstance *inst)// C: 1 */
+gnc_sql_begin_edit (GncSqlBackend *sql_be, QofInstance *inst)// C: 1 */
 /* static void
 test_gnc_sql_begin_edit (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_rollback_edit
 void
-gnc_sql_rollback_edit (GncSqlBackend *be, QofInstance *inst)// C: 1 */
+gnc_sql_rollback_edit (GncSqlBackend *sql_be, QofInstance *inst)// C: 1 */
 /* static void
 test_gnc_sql_rollback_edit (Fixture *fixture, gconstpointer pData)
 {
@@ -245,7 +245,7 @@ test_commit_cb (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_commit_edit
 void
-gnc_sql_commit_edit (GncSqlBackend *be, QofInstance *inst)// C: 1 */
+gnc_sql_commit_edit (GncSqlBackend *sql_be, QofInstance *inst)// C: 1 */
 static void
 test_dirty_cb (QofBook* book, gboolean dirty, gpointer data)
 {
@@ -285,7 +285,7 @@ test_gnc_sql_commit_edit (void)
 
     qof_object_initialize ();
     auto book = qof_book_new();
-    GncSqlBackend be (&conn, book);
+    GncSqlBackend sql_be (&conn, book);
     inst  = static_cast<decltype (inst)> (g_object_new (QOF_TYPE_INSTANCE, NULL));
     qof_instance_init_data (inst, QOF_ID_NULL, book);
     qof_book_set_dirty_cb (book, test_dirty_cb, &dirty_called);
@@ -295,7 +295,7 @@ test_gnc_sql_commit_edit (void)
     g_assert (qof_instance_get_dirty_flag (inst));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&be, inst);
+    gnc_sql_commit_edit (&sql_be, inst);
     g_assert (!qof_instance_get_dirty_flag (inst));
     g_assert (!qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 0);
@@ -307,7 +307,7 @@ test_gnc_sql_commit_edit (void)
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&be, QOF_INSTANCE (book));
+    gnc_sql_commit_edit (&sql_be, QOF_INSTANCE (book));
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
@@ -319,7 +319,7 @@ test_gnc_sql_commit_edit (void)
     g_assert (qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 1);
-    gnc_sql_commit_edit (&be, QOF_INSTANCE (book));
+    gnc_sql_commit_edit (&sql_be, QOF_INSTANCE (book));
     g_assert (!qof_instance_get_dirty_flag (QOF_INSTANCE (book)));
     g_assert (!qof_book_session_not_saved (book));
     g_assert_cmpint (dirty_called, == , 0);
@@ -349,7 +349,7 @@ test_compile_query_cb (Fixture *fixture, gconstpointer pData)
 // Make Static
 /* gnc_sql_compile_query
 gpointer
-gnc_sql_compile_query (QofBackend* pBEnd, QofQuery* pQuery)// 4
+gnc_sql_compile_query (QofBackend* qof_be, QofQuery* pQuery)// 4
 */
 /* static void
 test_gnc_sql_compile_query (Fixture *fixture, gconstpointer pData)
@@ -366,7 +366,7 @@ test_convert_search_obj (Fixture *fixture, gconstpointer pData)
 // Make Static
 /* gnc_sql_compile_query_to_sql
 gchar*
-gnc_sql_compile_query_to_sql (GncSqlBackend* be, QofQuery* query)// 3
+gnc_sql_compile_query_to_sql (GncSqlBackend* sql_be, QofQuery* query)// 3
 */
 /* static void
 test_gnc_sql_compile_query_to_sql (Fixture *fixture, gconstpointer pData)
@@ -383,7 +383,7 @@ test_free_query_cb (Fixture *fixture, gconstpointer pData)
 // Not Used
 /* gnc_sql_free_query
 void
-gnc_sql_free_query (QofBackend* pBEnd, gpointer pQuery)// 1
+gnc_sql_free_query (QofBackend* qof_be, gpointer pQuery)// 1
 */
 /* static void
 test_gnc_sql_free_query (Fixture *fixture, gconstpointer pData)
@@ -446,7 +446,7 @@ test_gnc_sql_get_getter (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_string
 static void
-load_string (const GncSqlBackend* be, GncSqlRow& row,
+load_string (const GncSqlBackend* sql_be, GncSqlRow& row,
 const GncSqlColumnTableEntry& table_row)// 2
 */
 /* static void
@@ -455,7 +455,7 @@ test_load_string (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_int
 static void
-load_int (const GncSqlBackend* be, GncSqlRow& row,// 4
+load_int (const GncSqlBackend* sql_be, GncSqlRow& row,// 4
 */
 /* static void
 test_load_int (Fixture *fixture, gconstpointer pData)
@@ -463,7 +463,7 @@ test_load_int (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_int_col_info_to_list
 static void
-add_int_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_int_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_int_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -471,7 +471,7 @@ test_add_int_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_gvalue_int_to_slist
 static void
-add_gvalue_int_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_int_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_gvalue_int_to_slist (Fixture *fixture, gconstpointer pData)
@@ -479,7 +479,7 @@ test_add_gvalue_int_to_slist (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_boolean
 static void
-load_boolean (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_boolean (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_boolean (Fixture *fixture, gconstpointer pData)
@@ -487,7 +487,7 @@ test_load_boolean (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_boolean_col_info_to_list
 static void
-add_boolean_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_boolean_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_boolean_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -495,7 +495,7 @@ test_add_boolean_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_gvalue_boolean_to_slist
 static void
-add_gvalue_boolean_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_boolean_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_gvalue_boolean_to_slist (Fixture *fixture, gconstpointer pData)
@@ -503,7 +503,7 @@ test_add_gvalue_boolean_to_slist (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_int64
 static void
-load_int64 (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_int64 (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_int64 (Fixture *fixture, gconstpointer pData)
@@ -511,7 +511,7 @@ test_load_int64 (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_int64_col_info_to_list
 static void
-add_int64_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_int64_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_int64_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -519,7 +519,7 @@ test_add_int64_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_gvalue_int64_to_slist
 static void
-add_gvalue_int64_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_int64_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_gvalue_int64_to_slist (Fixture *fixture, gconstpointer pData)
@@ -527,7 +527,7 @@ test_add_gvalue_int64_to_slist (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_double
 static void
-load_double (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_double (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_double (Fixture *fixture, gconstpointer pData)
@@ -535,7 +535,7 @@ test_load_double (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_double_col_info_to_list
 static void
-add_double_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_double_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_double_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -543,7 +543,7 @@ test_add_double_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_gvalue_double_to_slist
 static void
-add_gvalue_double_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_double_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_gvalue_double_to_slist (Fixture *fixture, gconstpointer pData)
@@ -551,7 +551,7 @@ test_add_gvalue_double_to_slist (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_guid
 static void
-load_guid (const GncSqlBackend* be, GncSqlRow& row,// 3
+load_guid (const GncSqlBackend* sql_be, GncSqlRow& row,// 3
 */
 /* static void
 test_load_guid (Fixture *fixture, gconstpointer pData)
@@ -559,7 +559,7 @@ test_load_guid (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_guid_col_info_to_list
 static void
-add_guid_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 3
+add_guid_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 3
 */
 /* static void
 test_add_guid_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -567,7 +567,7 @@ test_add_guid_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_gvalue_guid_to_slist
 static void
-add_gvalue_guid_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_guid_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_gvalue_guid_to_slist (Fixture *fixture, gconstpointer pData)
@@ -576,7 +576,7 @@ test_add_gvalue_guid_to_slist (Fixture *fixture, gconstpointer pData)
 // Not Used
 /* gnc_sql_add_objectref_guid_to_vec
 void
-gnc_sql_add_objectref_guid_to_vec (const GncSqlBackend* be, QofIdTypeConst obj_name,// 1
+gnc_sql_add_objectref_guid_to_vec (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 1
 */
 /* static void
 test_gnc_sql_add_objectref_guid_to_vec (Fixture *fixture, gconstpointer pData)
@@ -585,7 +585,7 @@ test_gnc_sql_add_objectref_guid_to_vec (Fixture *fixture, gconstpointer pData)
 // Not Used
 /* gnc_sql_add_objectref_guid_col_info_to_list
 void
-gnc_sql_add_objectref_guid_col_info_to_list (const GncSqlBackend* be,// 1
+gnc_sql_add_objectref_guid_col_info_to_list (const GncSqlBackend* sql_be,// 1
 */
 /* static void
 test_gnc_sql_add_objectref_guid_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -599,7 +599,7 @@ GncDbiBackend::time64_to_string (time64 t)// C: 1 */
 static void
 test_time64_to_string ()
 {
-    GncSqlBackend be {nullptr, nullptr, "%4d-%02d-%02d %02d:%02d:%02d"};
+    GncSqlBackend sql_be {nullptr, nullptr, "%4d-%02d-%02d %02d:%02d:%02d"};
     const char* dates[numtests] = {"1995-03-11 19:17:26",
                                   "2001-04-20 11:44:07",
                                   "1964-02-29 09:15:23",
@@ -612,14 +612,14 @@ test_time64_to_string ()
     {
 
         Timespec ts = gnc_iso8601_to_timespec_gmt (date);
-        auto datestr = be.time64_to_string (ts.tv_sec);
+        auto datestr = sql_be.time64_to_string (ts.tv_sec);
         g_assert_cmpstr (date, == , datestr.c_str());
     }
 
 }
 /* load_timespec
 static void
-load_timespec (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_timespec (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_timespec (Fixture *fixture, gconstpointer pData)
@@ -627,7 +627,7 @@ test_load_timespec (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_timespec_col_info_to_list
 static void
-add_timespec_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_timespec_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_timespec_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -635,7 +635,7 @@ test_add_timespec_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_value_timespec_to_vec
 static void
-add_gvalue_timespec_to_slist (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_gvalue_timespec_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_value_timespec_to_vec (Fixture *fixture, gconstpointer pData)
@@ -643,7 +643,7 @@ test_add_value_timespec_to_vec (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_date
 static void
-load_date (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_date (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_date (Fixture *fixture, gconstpointer pData)
@@ -651,7 +651,7 @@ test_load_date (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_date_col_info_to_list
 static void
-add_date_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_date_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_date_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -659,7 +659,7 @@ test_add_date_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_value_date_to_vec
 static void
-add_value_date_to_vec (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_value_date_to_vec (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_value_date_to_vec (Fixture *fixture, gconstpointer pData)
@@ -667,7 +667,7 @@ test_add_value_date_to_vec (Fixture *fixture, gconstpointer pData)
 }*/
 /* load_numeric
 static void
-load_numeric (const GncSqlBackend* be, GncSqlRow& row,// 2
+load_numeric (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
 */
 /* static void
 test_load_numeric (Fixture *fixture, gconstpointer pData)
@@ -675,7 +675,7 @@ test_load_numeric (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_numeric_col_info_to_list
 static void
-add_numeric_col_info_to_list (const GncSqlBackend* be, const GncSqlColumnTableEntry& table_row,// 2
+add_numeric_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
 */
 /* static void
 test_add_numeric_col_info_to_list (Fixture *fixture, gconstpointer pData)
@@ -683,7 +683,7 @@ test_add_numeric_col_info_to_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* add_value_numeric_to_vec
 static void
-add_value_numeric_to_vec (const GncSqlBackend* be, QofIdTypeConst obj_name,// 2
+add_value_numeric_to_vec (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
 */
 /* static void
 test_add_value_numeric_to_vec (Fixture *fixture, gconstpointer pData)
@@ -714,60 +714,60 @@ test__retrieve_guid_ (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_load_guid
 const GncGUID*
-gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow& row)// C: 15 in 14 */
+gnc_sql_load_guid (const GncSqlBackend* sql_be, GncSqlRow& row)// C: 15 in 14 */
 /* static void
 test_gnc_sql_load_guid (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_load_object
 void
-gnc_sql_load_object (const GncSqlBackend* be, GncSqlRow& row,// C: 29 in 19 */
+gnc_sql_load_object (const GncSqlBackend* sql_be, GncSqlRow& row,// C: 29 in 19 */
 /* static void
 test_gnc_sql_load_object (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_create_select_statement
-gnc_sql_create_select_statement (GncSqlBackend* be, const gchar* table_name)// C: 16 in 16 */
+gnc_sql_create_select_statement (GncSqlBackend* sql_be, const gchar* table_name)// C: 16 in 16 */
 /* static void
 test_gnc_sql_create_select_statement (Fixture *fixture, gconstpointer pData)
 {
 }*/
 // Make Static
 /* create_single_col_select_statement
-create_single_col_select_statement (GncSqlBackend* be,// 2
+create_single_col_select_statement (GncSqlBackend* sql_be,// 2
 */
 /* static void
 test_create_single_col_select_statement (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_execute_select_statement
-gnc_sql_execute_select_statement (GncSqlBackend* be, GncSqlStatement* stmt)// C: 25 in 19 */
+gnc_sql_execute_select_statement (GncSqlBackend* sql_be, GncSqlStatement* stmt)// C: 25 in 19 */
 /* static void
 test_gnc_sql_execute_select_statement (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_create_statement_from_sql
-gnc_sql_create_statement_from_sql (GncSqlBackend* be, const gchar* sql)// C: 11 in 3 */
+gnc_sql_create_statement_from_sql (GncSqlBackend* sql_be, const gchar* sql)// C: 11 in 3 */
 /* static void
 test_gnc_sql_create_statement_from_sql (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_execute_select_sql
-gnc_sql_execute_select_sql (GncSqlBackend* be, const gchar* sql)// C: 1 */
+gnc_sql_execute_select_sql (GncSqlBackend* sql_be, const gchar* sql)// C: 1 */
 /* static void
 test_gnc_sql_execute_select_sql (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_execute_nonselect_sql
 gint
-gnc_sql_execute_nonselect_sql (GncSqlBackend* be, const gchar* sql)// C: 1 */
+gnc_sql_execute_nonselect_sql (GncSqlBackend* sql_be, const gchar* sql)// C: 1 */
 /* static void
 test_gnc_sql_execute_nonselect_sql (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* execute_statement_get_count
 static guint
-execute_statement_get_count (GncSqlBackend* be, GncSqlStatement* stmt)// 2
+execute_statement_get_count (GncSqlBackend* sql_be, GncSqlStatement* stmt)// 2
 */
 /* static void
 test_execute_statement_get_count (Fixture *fixture, gconstpointer pData)
@@ -775,14 +775,14 @@ test_execute_statement_get_count (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_object_is_it_in_db
 gboolean
-gnc_sql_object_is_it_in_db (GncSqlBackend* be, const gchar* table_name,// C: 1 */
+gnc_sql_object_is_it_in_db (GncSqlBackend* sql_be, const gchar* table_name,// C: 1 */
 /* static void
 test_gnc_sql_object_is_it_in_db (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_do_db_operation
 gboolean
-gnc_sql_do_db_operation (GncSqlBackend* be,// C: 22 in 12 */
+gnc_sql_do_db_operation (GncSqlBackend* sql_be,// C: 22 in 12 */
 /* static void
 test_gnc_sql_do_db_operation (Fixture *fixture, gconstpointer pData)
 {
@@ -796,7 +796,7 @@ test_gnc_sql_get_sql_value (Fixture *fixture, gconstpointer pData)
 }*/
 // Make Static
 /* build_insert_statement
-build_insert_statement (GncSqlBackend* be,// 3
+build_insert_statement (GncSqlBackend* sql_be,// 3
 */
 /* static void
 test_build_insert_statement (Fixture *fixture, gconstpointer pData)
@@ -804,7 +804,7 @@ test_build_insert_statement (Fixture *fixture, gconstpointer pData)
 }*/
 // Make Static
 /* build_update_statement
-build_update_statement (GncSqlBackend* be,// 3
+build_update_statement (GncSqlBackend* sql_be,// 3
 */
 /* static void
 test_build_update_statement (Fixture *fixture, gconstpointer pData)
@@ -812,7 +812,7 @@ test_build_update_statement (Fixture *fixture, gconstpointer pData)
 }*/
 // Make Static
 /* build_delete_statement
-build_delete_statement (GncSqlBackend* be,// 3
+build_delete_statement (GncSqlBackend* sql_be,// 3
 */
 /* static void
 test_build_delete_statement (Fixture *fixture, gconstpointer pData)
@@ -820,7 +820,7 @@ test_build_delete_statement (Fixture *fixture, gconstpointer pData)
 }*/
 /* do_create_table
 static gboolean
-do_create_table (const GncSqlBackend* be, const gchar* table_name,// 5
+do_create_table (const GncSqlBackend* sql_be, const gchar* table_name,// 5
 */
 /* static void
 test_do_create_table (Fixture *fixture, gconstpointer pData)
@@ -829,7 +829,7 @@ test_do_create_table (Fixture *fixture, gconstpointer pData)
 // Make Static
 /* gnc_sql_create_temp_table
 gboolean
-gnc_sql_create_temp_table (const GncSqlBackend* be, const gchar* table_name,// 2
+gnc_sql_create_temp_table (const GncSqlBackend* sql_be, const gchar* table_name,// 2
 */
 /* static void
 test_gnc_sql_create_temp_table (Fixture *fixture, gconstpointer pData)
@@ -837,34 +837,34 @@ test_gnc_sql_create_temp_table (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_create_index
 gboolean
-gnc_sql_create_index (const GncSqlBackend* be, const gchar* index_name,// C: 7 in 2 */
+gnc_sql_create_index (const GncSqlBackend* sql_be, const gchar* index_name,// C: 7 in 2 */
 /* static void
 test_gnc_sql_create_index (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_upgrade_table
 void
-gnc_sql_upgrade_table (GncSqlBackend* be, const gchar* table_name,// C: 12 in 10 */
+gnc_sql_upgrade_table (GncSqlBackend* sql_be, const gchar* table_name,// C: 12 in 10 */
 /* static void
 test_gnc_sql_upgrade_table (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_add_columns_to_table
-gboolean gnc_sql_add_columns_to_table (GncSqlBackend* be, const gchar* table_name,// C: 1 */
+gboolean gnc_sql_add_columns_to_table (GncSqlBackend* sql_be, const gchar* table_name,// C: 1 */
 /* static void
 test_gnc_sql_add_columns_to_table (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_sql_init_version_info
 void
-gnc_sql_init_version_info (GncSqlBackend* be)// C: 1 */
+gnc_sql_init_version_info (GncSqlBackend* sql_be)// C: 1 */
 /* static void
 test_gnc_sql_init_version_info (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* reset_version_info
 static gboolean
-reset_version_info (GncSqlBackend* be)// 3
+reset_version_info (GncSqlBackend* sql_be)// 3
 */
 /* static void
 test_reset_version_info (Fixture *fixture, gconstpointer pData)
@@ -872,7 +872,7 @@ test_reset_version_info (Fixture *fixture, gconstpointer pData)
 }*/
 /* gnc_sql_finalize_version_info
 void
-gnc_sql_finalize_version_info (GncSqlBackend* be)// C: 1 */
+gnc_sql_finalize_version_info (GncSqlBackend* sql_be)// C: 1 */
 /* static void
 test_gnc_sql_finalize_version_info (Fixture *fixture, gconstpointer pData)
 {



Summary of changes:
 src/backend/dbi/gnc-backend-dbi.cpp                |  311 ++-
 src/backend/dbi/gnc-backend-dbi.hpp                |   10 +-
 src/backend/dbi/gnc-dbiprovider.hpp                |    4 +-
 src/backend/dbi/gnc-dbiproviderimpl.hpp            |    7 +
 src/backend/dbi/gnc-dbisqlconnection.hpp           |    6 +
 src/backend/dbi/gnc-dbisqlresult.cpp               |    1 -
 src/backend/dbi/gnc-dbisqlresult.hpp               |    1 +
 src/backend/dbi/test/test-backend-dbi-basic.cpp    |   37 +-
 src/backend/dbi/test/test-dbi-stuff.cpp            |    9 +-
 src/backend/sql/CMakeLists.txt                     |   11 +-
 src/backend/sql/Makefile.am                        |   11 +-
 src/backend/sql/gnc-account-sql.cpp                |  208 +-
 src/backend/sql/gnc-account-sql.h                  |   14 +-
 src/backend/sql/gnc-address-sql.cpp                |   21 +-
 src/backend/sql/gnc-backend-sql.cpp                | 2345 --------------------
 src/backend/sql/gnc-backend-sql.h                  | 1022 ---------
 src/backend/sql/gnc-bill-term-sql.cpp              |  181 +-
 src/backend/sql/gnc-bill-term-sql.h                |   14 +-
 src/backend/sql/gnc-book-sql.cpp                   |   53 +-
 src/backend/sql/gnc-book-sql.h                     |   13 +-
 src/backend/sql/gnc-budget-sql.cpp                 |  152 +-
 src/backend/sql/gnc-budget-sql.h                   |   14 +-
 src/backend/sql/gnc-commodity-sql.cpp              |  117 +-
 src/backend/sql/gnc-commodity-sql.h                |   15 +-
 src/backend/sql/gnc-customer-sql.cpp               |   70 +-
 src/backend/sql/gnc-customer-sql.h                 |   11 +-
 src/backend/sql/gnc-employee-sql.cpp               |   88 +-
 src/backend/sql/gnc-employee-sql.h                 |   12 +-
 src/backend/sql/gnc-entry-sql.cpp                  |   72 +-
 src/backend/sql/gnc-entry-sql.h                    |   11 +-
 src/backend/sql/gnc-invoice-sql.cpp                |  104 +-
 src/backend/sql/gnc-invoice-sql.h                  |   12 +-
 src/backend/sql/gnc-job-sql.cpp                    |   58 +-
 src/backend/sql/gnc-job-sql.h                      |   10 +-
 src/backend/sql/gnc-lots-sql.cpp                   |   83 +-
 src/backend/sql/gnc-lots-sql.h                     |   11 +-
 src/backend/sql/gnc-order-sql.cpp                  |   74 +-
 src/backend/sql/gnc-order-sql.h                    |   10 +-
 src/backend/sql/gnc-owner-sql.cpp                  |   27 +-
 src/backend/sql/gnc-price-sql.cpp                  |   85 +-
 src/backend/sql/gnc-price-sql.h                    |   12 +-
 src/backend/sql/gnc-recurrence-sql.cpp             |  113 +-
 src/backend/sql/gnc-recurrence-sql.h               |   23 +-
 src/backend/sql/gnc-schedxaction-sql.cpp           |   72 +-
 src/backend/sql/gnc-schedxaction-sql.h             |   13 +-
 src/backend/sql/gnc-slots-sql.cpp                  |  365 ++-
 src/backend/sql/gnc-slots-sql.h                    |   35 +-
 src/backend/sql/gnc-sql-backend.cpp                | 1006 +++++++++
 src/backend/sql/gnc-sql-backend.hpp                |  292 +++
 src/backend/sql/gnc-sql-column-table-entry.cpp     |  713 ++++++
 src/backend/sql/gnc-sql-column-table-entry.hpp     |  510 +++++
 src/backend/sql/gnc-sql-connection.hpp             |  103 +
 src/backend/sql/gnc-sql-object-backend.cpp         |   97 +
 src/backend/sql/gnc-sql-object-backend.hpp         |  140 ++
 .../sql/gnc-sql-result.cpp}                        |   37 +-
 src/backend/sql/gnc-sql-result.hpp                 |  114 +
 src/backend/sql/gnc-tax-table-sql.cpp              |  245 +-
 src/backend/sql/gnc-tax-table-sql.h                |   12 +-
 src/backend/sql/gnc-transaction-sql.cpp            |  482 ++--
 src/backend/sql/gnc-transaction-sql.h              |   27 +-
 src/backend/sql/gnc-vendor-sql.cpp                 |   75 +-
 src/backend/sql/gnc-vendor-sql.h                   |   12 +-
 src/backend/sql/test/Makefile.am                   |    3 -
 src/backend/sql/test/test-column-types.cpp         |    2 -
 src/backend/sql/test/utest-gnc-backend-sql.cpp     |  183 +-
 src/libqof/qof/gnc-datetime.cpp                    |   20 +
 src/libqof/qof/gnc-datetime.hpp                    |   13 +-
 src/libqof/qof/test/gtest-gnc-datetime.cpp         |    7 +
 68 files changed, 4714 insertions(+), 5327 deletions(-)
 delete mode 100644 src/backend/sql/gnc-backend-sql.cpp
 delete mode 100644 src/backend/sql/gnc-backend-sql.h
 create mode 100644 src/backend/sql/gnc-sql-backend.cpp
 create mode 100644 src/backend/sql/gnc-sql-backend.hpp
 create mode 100644 src/backend/sql/gnc-sql-column-table-entry.cpp
 create mode 100644 src/backend/sql/gnc-sql-column-table-entry.hpp
 create mode 100644 src/backend/sql/gnc-sql-connection.hpp
 create mode 100644 src/backend/sql/gnc-sql-object-backend.cpp
 create mode 100644 src/backend/sql/gnc-sql-object-backend.hpp
 copy src/{gnome-utils/dialog-reset-warnings.h => backend/sql/gnc-sql-result.cpp} (70%)
 create mode 100644 src/backend/sql/gnc-sql-result.hpp



More information about the gnucash-changes mailing list