diff --git a/src/backend/dbi/gnc-backend-dbi-priv.h b/src/backend/dbi/gnc-backend-dbi-priv.h index 0e0d3b6762..0743771217 100644 --- a/src/backend/dbi/gnc-backend-dbi-priv.h +++ b/src/backend/dbi/gnc-backend-dbi-priv.h @@ -119,22 +119,47 @@ typedef struct /* external access required for tests */ std::string adjust_sql_options_string(const std::string&); -class GncDbiSqlRow : public GncSqlRow + +class GncDbiSqlResult : public GncSqlResult { public: - GncDbiSqlRow (dbi_result result) : m_result{result} {} - ~GncDbiSqlRow() = default; - int64_t get_int_at_col(const char*); - float get_float_at_col(const char*); - double get_double_at_col(const char*); - std::string get_string_at_col(const char*); - time64 get_time64_at_col(const char*); - bool is_col_null(const char* col) const noexcept - { - return dbi_result_field_is_null(m_result, col); - } + GncDbiSqlResult(GncDbiSqlConnection* conn, dbi_result result) : + m_conn{conn}, m_dbi_result{result}, m_iter{this}, m_row{&m_iter}, + m_sentinel{nullptr} {} + ~GncDbiSqlResult(); + int dberror(); + uint64_t size() const noexcept; + GncSqlRow& begin(); + GncSqlRow& end() { return m_sentinel; } +protected: + class IteratorImpl : public GncSqlResult::IteratorImpl + { + public: + ~IteratorImpl() = default; + IteratorImpl(GncDbiSqlResult* inst) : m_inst{inst} {} + virtual GncSqlRow& operator++(); + virtual GncSqlRow& operator++(int) { return ++(*this); }; + virtual GncSqlResult* operator*() { return m_inst; } + virtual int64_t get_int_at_col (const char* col) const; + virtual float get_float_at_col (const char* col) const; + virtual double get_double_at_col (const char* col) const; + virtual std::string get_string_at_col (const char* col)const; + virtual time64 get_time64_at_col (const char* col) const; + virtual bool is_col_null(const char* col) const noexcept + { + return dbi_result_field_is_null(m_inst->m_dbi_result, col); + } + private: + GncDbiSqlResult* m_inst; + }; private: - dbi_result m_result; + GncDbiSqlConnection* m_conn; + dbi_result m_dbi_result; + IteratorImpl m_iter; + GncSqlRow m_row; + GncSqlRow m_sentinel; + }; + #endif //GNC_BACKEND_DBI_PRIV_H diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp index db0c1ec04b..b6a3aaafd4 100644 --- a/src/backend/dbi/gnc-backend-dbi.cpp +++ b/src/backend/dbi/gnc-backend-dbi.cpp @@ -2156,53 +2156,66 @@ gnc_module_finalize_backend_dbi (void) } /* --------------------------------------------------------- */ +GncSqlRow& +GncDbiSqlResult::IteratorImpl::operator++() +{ + int status = dbi_result_next_row (m_inst->m_dbi_result); + if (status) + return m_inst->m_row; + int error = m_inst->dberror(); + if (error == DBI_ERROR_BADIDX || error == 0) //ran off the end of the results + return m_inst->m_sentinel; + PERR("Error %d incrementing results iterator.", error); + qof_backend_set_error (m_inst->m_conn->qbe, ERR_BACKEND_SERVER_ERR); + return m_inst->m_sentinel; +} int64_t -GncDbiSqlRow::get_int_at_col(const char* col) +GncDbiSqlResult::IteratorImpl::get_int_at_col(const char* col) const { - auto type = dbi_result_get_field_type (m_result, col); + auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); if(type != DBI_TYPE_INTEGER) throw (std::invalid_argument{"Requested integer from non-integer column."}); - return dbi_result_get_longlong (m_result, col); + return dbi_result_get_longlong (m_inst->m_dbi_result, col); } float -GncDbiSqlRow::get_float_at_col(const char* col) +GncDbiSqlResult::IteratorImpl::get_float_at_col(const char* col) const { - auto type = dbi_result_get_field_type (m_result, col); - auto attrs = dbi_result_get_field_attribs (m_result, col); + auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); + auto attrs = dbi_result_get_field_attribs (m_inst->m_dbi_result, col); if(type != DBI_TYPE_DECIMAL || (attrs & DBI_DECIMAL_SIZEMASK) != DBI_DECIMAL_SIZE4) throw (std::invalid_argument{"Requested float from non-float column."}); gnc_push_locale (LC_NUMERIC, "C"); - auto retval = dbi_result_get_float(m_result, col); + auto retval = dbi_result_get_float(m_inst->m_dbi_result, col); gnc_pop_locale (LC_NUMERIC); return retval; } double -GncDbiSqlRow::get_double_at_col(const char* col) +GncDbiSqlResult::IteratorImpl::get_double_at_col(const char* col) const { - auto type = dbi_result_get_field_type (m_result, col); - auto attrs = dbi_result_get_field_attribs (m_result, col); + auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); + auto attrs = dbi_result_get_field_attribs (m_inst->m_dbi_result, col); if(type != DBI_TYPE_DECIMAL || (attrs & DBI_DECIMAL_SIZEMASK) != DBI_DECIMAL_SIZE8) throw (std::invalid_argument{"Requested double from non-double column."}); gnc_push_locale (LC_NUMERIC, "C"); - auto retval = dbi_result_get_double(m_result, col); + auto retval = dbi_result_get_double(m_inst->m_dbi_result, col); gnc_pop_locale (LC_NUMERIC); return retval; } std::string -GncDbiSqlRow::get_string_at_col(const char* col) +GncDbiSqlResult::IteratorImpl::get_string_at_col(const char* col) const { - auto type = dbi_result_get_field_type (m_result, col); - auto attrs = dbi_result_get_field_attribs (m_result, col); + auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); + auto attrs = dbi_result_get_field_attribs (m_inst->m_dbi_result, col); if(type != DBI_TYPE_STRING) throw (std::invalid_argument{"Requested string from non-string column."}); gnc_push_locale (LC_NUMERIC, "C"); - auto strval = dbi_result_get_string(m_result, col); + auto strval = dbi_result_get_string(m_inst->m_dbi_result, col); if (strval == nullptr) { gnc_pop_locale (LC_NUMERIC); @@ -2213,10 +2226,10 @@ GncDbiSqlRow::get_string_at_col(const char* col) return retval; } time64 -GncDbiSqlRow::get_time64_at_col (const char* col) +GncDbiSqlResult::IteratorImpl::get_time64_at_col (const char* col) const { - auto type = dbi_result_get_field_type (m_result, col); - auto attrs = dbi_result_get_field_attribs (m_result, col); + auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); + auto attrs = dbi_result_get_field_attribs (m_inst->m_dbi_result, col); if (type != DBI_TYPE_DATETIME) throw (std::invalid_argument{"Requested double from non-double column."}); gnc_push_locale (LC_NUMERIC, "C"); @@ -2233,7 +2246,7 @@ GncDbiSqlRow::get_time64_at_col (const char* col) * dbi_result_get_as_longlong. * Note: 0.9 is available in Debian Jessie and Fedora 21. */ - auto result = (dbi_result_t*) (m_result); + auto result = (dbi_result_t*) (m_inst->m_dbi_result); auto row = dbi_result_get_currow (result); auto idx = dbi_result_get_field_idx (result, col) - 1; time64 retval = result->rows[row]->field_values[idx].d_datetime; @@ -2246,105 +2259,50 @@ GncDbiSqlRow::get_time64_at_col (const char* col) /* --------------------------------------------------------- */ -typedef struct + +GncDbiSqlResult::~GncDbiSqlResult() { - GncSqlResult base; + int status = dbi_result_free (m_dbi_result); + + if (status == 0) + return; - GncDbiSqlConnection* dbi_conn; - dbi_result result; - guint num_rows; - guint cur_row; - GncDbiSqlRow* row; -} GncDbiSqlResult; + PERR ("Error %d in dbi_result_free() result.", dberror() ); + qof_backend_set_error (m_conn->qbe, ERR_BACKEND_SERVER_ERR); +} -static void -result_dispose (GncSqlResult* result) +GncSqlRow& +GncDbiSqlResult::begin() { - GncDbiSqlResult* dbi_result = (GncDbiSqlResult*)result; - delete dbi_result->row; - if (dbi_result->result != NULL) + if (m_dbi_result == nullptr || + dbi_result_get_numrows(m_dbi_result) == 0) + return m_sentinel; + int status = dbi_result_first_row(m_dbi_result); + if (status) + return m_row; + int error = dberror(); // + + if (error != DBI_ERROR_BADIDX) //otherwise just an empty result set { - gint status; - - status = dbi_result_free (dbi_result->result); - if (status < 0) - { - PERR ("Error in dbi_result_free() result\n"); - qof_backend_set_error (dbi_result->dbi_conn->qbe, ERR_BACKEND_SERVER_ERR); - } + PERR ("Error %d in dbi_result_first_row()", dberror()); + qof_backend_set_error (m_conn->qbe, ERR_BACKEND_SERVER_ERR); } - g_free (result); + return m_sentinel; } -static guint -result_get_num_rows (GncSqlResult* result) +int +GncDbiSqlResult::dberror() { - GncDbiSqlResult* dbi_result = (GncDbiSqlResult*)result; - - return dbi_result->num_rows; + return dbi_conn_error(m_conn->conn, nullptr); } -static GncSqlRow* -result_get_first_row (GncSqlResult* result) +uint64_t +GncDbiSqlResult::size() const noexcept { - GncDbiSqlResult* dbi_result = (GncDbiSqlResult*)result; - - if (dbi_result->num_rows > 0) - { - gint status = dbi_result_first_row (dbi_result->result); - if (status == 0) - { - PERR ("Error in dbi_result_first_row()\n"); - qof_backend_set_error (dbi_result->dbi_conn->qbe, ERR_BACKEND_SERVER_ERR); - } - dbi_result->cur_row = 1; - return dbi_result->row; - } - else - return nullptr; + return dbi_result_get_numrows(m_dbi_result); } -static GncSqlRow* -result_get_next_row (GncSqlResult* result) -{ - GncDbiSqlResult* dbi_result = (GncDbiSqlResult*)result; - - if (dbi_result->cur_row < dbi_result->num_rows) - { - gint status = dbi_result_next_row (dbi_result->result); - if (status == 0) - { - PERR ("Error in dbi_result_first_row()\n"); - qof_backend_set_error (dbi_result->dbi_conn->qbe, ERR_BACKEND_SERVER_ERR); - } - dbi_result->cur_row++; - return dbi_result->row; - } - else - return nullptr; -} - -static GncSqlResult* -create_dbi_result (GncDbiSqlConnection* dbi_conn, dbi_result result) -{ - GncDbiSqlResult* dbi_result; - - dbi_result = g_new0 (GncDbiSqlResult, 1); - g_assert (dbi_result != NULL); - - dbi_result->base.dispose = result_dispose; - dbi_result->base.getNumRows = result_get_num_rows; - dbi_result->base.getFirstRow = result_get_first_row; - dbi_result->base.getNextRow = result_get_next_row; - dbi_result->result = result; - dbi_result->num_rows = (guint)dbi_result_get_numrows (result); - dbi_result->cur_row = 0; - dbi_result->row = new GncDbiSqlRow{result}; - dbi_result->dbi_conn = dbi_conn; - - return (GncSqlResult*)dbi_result; -} /* --------------------------------------------------------- */ typedef struct { @@ -2417,7 +2375,7 @@ conn_dispose (GncSqlConnection* conn) g_free (conn); } -static GncSqlResult* +static GncSqlResultPtr conn_execute_select_statement (GncSqlConnection* conn, GncSqlStatement* stmt) { GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn; @@ -2432,13 +2390,10 @@ conn_execute_select_statement (GncSqlConnection* conn, GncSqlStatement* stmt) result = dbi_conn_query (dbi_conn->conn, dbi_stmt->sql->str); } while (dbi_conn->retry); - if (result == NULL) - { + if (result == nullptr) PERR ("Error executing SQL %s\n", dbi_stmt->sql->str); - return NULL; - } gnc_pop_locale (LC_NUMERIC); - return create_dbi_result (dbi_conn, result); + return GncSqlResultPtr(new GncDbiSqlResult (dbi_conn, result)); } static gint @@ -2562,7 +2517,8 @@ conn_rollback_transaction (GncSqlConnection* conn) gboolean success = FALSE; DEBUG ("ROLLBACK\n"); - result = dbi_conn_queryf (dbi_conn->conn, "ROLLBACK"); + const char* command = "ROLLBACK"; + result = dbi_conn_query (dbi_conn->conn, command); success = (result != NULL); status = dbi_result_free (result); diff --git a/src/backend/sql/gnc-account-sql.cpp b/src/backend/sql/gnc-account-sql.cpp index 7c5633ca07..e12cb11ff6 100644 --- a/src/backend/sql/gnc-account-sql.cpp +++ b/src/backend/sql/gnc-account-sql.cpp @@ -152,14 +152,13 @@ set_parent_guid (gpointer pObject, gpointer pValue) } static Account* -load_single_account (GncSqlBackend* be, GncSqlRow* row, +load_single_account (GncSqlBackend* 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 (row != NULL, NULL); g_return_val_if_fail (l_accounts_needing_parents != NULL, NULL); guid = gnc_sql_load_guid (be, row); @@ -196,7 +195,6 @@ static void load_all_accounts (GncSqlBackend* be) { GncSqlStatement* stmt = NULL; - GncSqlResult* result; QofBook* pBook; GList* l_accounts_needing_parents = NULL; GSList* bal_slist; @@ -214,99 +212,89 @@ load_all_accounts (GncSqlBackend* be) LEAVE ("stmt == NULL"); return; } - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + for (auto row : *result) + load_single_account (be, row, &l_accounts_needing_parents); + + auto sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", TABLE_NAME); + gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)xaccAccountLookup); + g_free (sql); + + /* While there are items on the list of accounts 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 (l_accounts_needing_parents != NULL) { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - gchar* sql; + gboolean progress_made = TRUE; + Account* root; + Account* pParent; + GList* elem; - while (row != NULL) + while (progress_made) { - load_single_account (be, row, &l_accounts_needing_parents); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", TABLE_NAME); - gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)xaccAccountLookup); - g_free (sql); - - /* While there are items on the list of accounts 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 (l_accounts_needing_parents != NULL) - { - gboolean progress_made = TRUE; - Account* root; - Account* pParent; - GList* elem; - - while (progress_made) + progress_made = FALSE; + for (elem = l_accounts_needing_parents; elem != NULL;) { - 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, be->book); + if (pParent != NULL) { - account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data; - pParent = xaccAccountLookup (&s->guid, be->book); - if (pParent != NULL) - { - GList* next_elem; + 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); - } + 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); } } + } - /* 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) + /* 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) { - 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); + 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); } + } - /* Load starting balances */ - bal_slist = gnc_sql_get_account_balances_slist (be); - for (bal = bal_slist; bal != NULL; bal = bal->next) - { - acct_balances_t* balances = (acct_balances_t*)bal->data; + /* Load starting balances */ + bal_slist = gnc_sql_get_account_balances_slist (be); + for (bal = bal_slist; bal != NULL; bal = bal->next) + { + acct_balances_t* balances = (acct_balances_t*)bal->data; - qof_instance_increase_editlevel (balances->acct); - g_object_set (balances->acct, - "start-balance", &balances->balance, - "start-cleared-balance", &balances->cleared_balance, - "start-reconciled-balance", &balances->reconciled_balance, - NULL); + qof_instance_increase_editlevel (balances->acct); + g_object_set (balances->acct, + "start-balance", &balances->balance, + "start-cleared-balance", &balances->cleared_balance, + "start-reconciled-balance", &balances->reconciled_balance, + NULL); - qof_instance_decrease_editlevel (balances->acct); - } - if (bal_slist != NULL) - { - g_slist_free (bal_slist); - } + qof_instance_decrease_editlevel (balances->acct); + } + if (bal_slist != NULL) + { + g_slist_free (bal_slist); } LEAVE (""); @@ -399,7 +387,7 @@ gnc_sql_save_account (GncSqlBackend* be, QofInstance* inst) /* ================================================================= */ static void -load_account_guid (const GncSqlBackend* be, GncSqlRow* row, +load_account_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -408,12 +396,11 @@ load_account_guid (const GncSqlBackend* be, GncSqlRow* row, Account* account = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); (void)string_to_guid (val.c_str(), &guid); account = xaccAccountLookup (&guid, be->book); if (account != NULL) diff --git a/src/backend/sql/gnc-address-sql.cpp b/src/backend/sql/gnc-address-sql.cpp index 3ce4a6f329..f83964d362 100644 --- a/src/backend/sql/gnc-address-sql.cpp +++ b/src/backend/sql/gnc-address-sql.cpp @@ -66,7 +66,7 @@ typedef void (*AddressSetterFunc) (gpointer, GncAddress*); typedef GncAddress* (*AddressGetterFunc) (const gpointer); static void -load_address (const GncSqlBackend* be, GncSqlRow* row, +load_address (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -85,7 +85,7 @@ load_address (const GncSqlBackend* be, GncSqlRow* row, subtable_row.col_name); try { - auto val = row->get_string_at_col (buf); + auto val = row.get_string_at_col (buf); g_free (buf); if (subtable_row.gobj_param_name != NULL) { diff --git a/src/backend/sql/gnc-backend-sql.cpp b/src/backend/sql/gnc-backend-sql.cpp index 474f48ff11..605e3723f4 100644 --- a/src/backend/sql/gnc-backend-sql.cpp +++ b/src/backend/sql/gnc-backend-sql.cpp @@ -1202,7 +1202,7 @@ void set_object_parameter(gpointer pObject, T item, QofSetterFunc setter, /* ----------------------------------------------------------------- */ static void -load_string (const GncSqlBackend* be, GncSqlRow* row, +load_string (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1211,7 +1211,7 @@ load_string (const GncSqlBackend* be, GncSqlRow* row, try { - auto s = row->get_string_at_col (table_row.col_name); + auto s = row.get_string_at_col (table_row.col_name); if (table_row.gobj_param_name != NULL) { if (QOF_IS_INSTANCE (pObject)) @@ -1274,7 +1274,7 @@ typedef gint (*IntAccessFunc) (const gpointer); typedef void (*IntSetterFunc) (const gpointer, gint); static void -load_int (const GncSqlBackend* be, GncSqlRow* row, +load_int (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1282,7 +1282,7 @@ load_int (const GncSqlBackend* be, GncSqlRow* row, g_return_if_fail (pObject != NULL); g_return_if_fail (table_row.gobj_param_name != NULL || setter != NULL); - auto val = row->get_int_at_col(table_row.col_name); + auto val = row.get_int_at_col(table_row.col_name); if (table_row.gobj_param_name != NULL) { if (QOF_IS_INSTANCE (pObject)) @@ -1323,14 +1323,14 @@ typedef gboolean (*BooleanAccessFunc) (const gpointer); typedef void (*BooleanSetterFunc) (const gpointer, gboolean); static void -load_boolean (const GncSqlBackend* be, GncSqlRow* row, +load_boolean (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { g_return_if_fail (pObject != NULL); g_return_if_fail (table_row.gobj_param_name != NULL || setter != NULL); - auto val = row->get_int_at_col (table_row.col_name); + auto val = row.get_int_at_col (table_row.col_name); if (table_row.gobj_param_name != nullptr) { if (QOF_IS_INSTANCE (pObject)) @@ -1371,14 +1371,14 @@ typedef gint64 (*Int64AccessFunc) (const gpointer); typedef void (*Int64SetterFunc) (const gpointer, gint64); static void -load_int64 (const GncSqlBackend* be, GncSqlRow* row, +load_int64 (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { g_return_if_fail (table_row.gobj_param_name != nullptr || setter != nullptr); - auto val = row->get_int_at_col (table_row.col_name); + auto val = row.get_int_at_col (table_row.col_name); if (table_row.gobj_param_name != nullptr) { if (QOF_IS_INSTANCE (pObject)) @@ -1415,7 +1415,7 @@ static GncSqlColumnTypeHandler int64_handler /* ----------------------------------------------------------------- */ static void -load_double (const GncSqlBackend* be, GncSqlRow* row, +load_double (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1425,19 +1425,19 @@ load_double (const GncSqlBackend* be, GncSqlRow* row, double val; try { - val = static_cast(row->get_int_at_col(table_row.col_name)); + val = static_cast(row.get_int_at_col(table_row.col_name)); } catch (std::invalid_argument) { try { - val = static_cast(row->get_float_at_col(table_row.col_name)); + val = static_cast(row.get_float_at_col(table_row.col_name)); } catch (std::invalid_argument) { try { - val = row->get_double_at_col(table_row.col_name); + val = row.get_double_at_col(table_row.col_name); } catch (std::invalid_argument) { @@ -1481,7 +1481,7 @@ static GncSqlColumnTypeHandler double_handler /* ----------------------------------------------------------------- */ static void -load_guid (const GncSqlBackend* be, GncSqlRow* row, +load_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1496,7 +1496,7 @@ load_guid (const GncSqlBackend* be, GncSqlRow* row, std::string str; try { - str = row->get_string_at_col(table_row.col_name); + str = row.get_string_at_col(table_row.col_name); } catch (std::invalid_argument) { @@ -1619,7 +1619,7 @@ gnc_sql_convert_timespec_to_string (const GncSqlBackend* be, Timespec ts) #pragma GCC diagnostic warning "-Wformat-nonliteral" static void -load_timespec (const GncSqlBackend* be, GncSqlRow* row, +load_timespec (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1636,14 +1636,14 @@ load_timespec (const GncSqlBackend* be, GncSqlRow* row, ts_setter = (TimespecSetterFunc)setter; try { - auto val = row->get_time64_at_col(table_row.col_name); + auto val = row.get_time64_at_col(table_row.col_name); timespecFromTime64 (&ts, val); } catch (std::invalid_argument) { try { - auto val = row->get_string_at_col(table_row.col_name); + auto val = row.get_string_at_col(table_row.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], @@ -1731,14 +1731,14 @@ static GncSqlColumnTypeHandler timespec_handler #define DATE_COL_SIZE 8 static void -load_date (const GncSqlBackend* be, GncSqlRow* row, +load_date (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { g_return_if_fail (pObject != NULL); g_return_if_fail (table_row.gobj_param_name != nullptr || setter != nullptr); - if (row->is_col_null(table_row.col_name)) + if (row.is_col_null(table_row.col_name)) return; GDate date; g_date_clear (&date, 1); @@ -1747,7 +1747,7 @@ load_date (const GncSqlBackend* be, GncSqlRow* row, /* 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(table_row.col_name); + auto time = row.get_time64_at_col(table_row.col_name); auto tm = gnc_gmtime(&time); g_date_set_dmy(&date, tm->tm_mday, static_cast(tm->tm_mon + 1), @@ -1758,7 +1758,7 @@ load_date (const GncSqlBackend* be, GncSqlRow* row, { try { - std::string str = row->get_string_at_col(table_row.col_name); + std::string str = row.get_string_at_col(table_row.col_name); if (str.empty()) return; auto year = static_cast(stoi (str.substr (0,4))); auto month = static_cast(stoi (str.substr (4,2))); @@ -1836,7 +1836,7 @@ static const EntryVec numeric_col_table = }; static void -load_numeric (const GncSqlBackend* be, GncSqlRow* row, +load_numeric (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1849,10 +1849,10 @@ load_numeric (const GncSqlBackend* be, GncSqlRow* row, try { auto buf = g_strdup_printf ("%s_num", table_row.col_name); - auto num = row->get_int_at_col (buf); + auto num = row.get_int_at_col (buf); g_free (buf); buf = g_strdup_printf ("%s_denom", table_row.col_name); - auto denom = row->get_int_at_col (buf); + auto denom = row.get_int_at_col (buf); n = gnc_numeric_create (num, denom); } catch (std::invalid_argument) @@ -2018,12 +2018,11 @@ static EntryVec guid_table }; const GncGUID* -gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow* row) +gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow& row) { static GncGUID guid; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); gnc_sql_load_object (be, row, NULL, &guid, guid_table); @@ -2038,12 +2037,11 @@ static EntryVec tx_guid_table const GncGUID* -gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow* row) +gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow& row) { static GncGUID guid; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); gnc_sql_load_object (be, row, NULL, &guid, tx_guid_table); @@ -2051,7 +2049,7 @@ gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow* row) } void -gnc_sql_load_object (const GncSqlBackend* be, GncSqlRow* row, +gnc_sql_load_object (const GncSqlBackend* be, GncSqlRow& row, QofIdTypeConst obj_name, gpointer pObject, const EntryVec& table) { @@ -2118,15 +2116,14 @@ create_single_col_select_statement (GncSqlBackend* be, /* ================================================================= */ -GncSqlResult* +GncSqlResultPtr gnc_sql_execute_select_statement (GncSqlBackend* be, GncSqlStatement* stmt) { - GncSqlResult* result; g_return_val_if_fail (be != NULL, NULL); g_return_val_if_fail (stmt != NULL, NULL); - result = gnc_sql_connection_execute_select_statement (be->conn, stmt); + auto result = gnc_sql_connection_execute_select_statement (be->conn, stmt); if (result == NULL) { PERR ("SQL error: %s\n", gnc_sql_statement_to_sql (stmt)); @@ -2156,11 +2153,10 @@ gnc_sql_create_statement_from_sql (GncSqlBackend* be, const gchar* sql) return stmt; } -GncSqlResult* +GncSqlResultPtr gnc_sql_execute_select_sql (GncSqlBackend* be, const gchar* sql) { GncSqlStatement* stmt; - GncSqlResult* result = NULL; g_return_val_if_fail (be != NULL, NULL); g_return_val_if_fail (sql != NULL, NULL); @@ -2170,7 +2166,7 @@ gnc_sql_execute_select_sql (GncSqlBackend* be, const gchar* sql) { return NULL; } - result = gnc_sql_connection_execute_select_statement (be->conn, stmt); + auto result = gnc_sql_connection_execute_select_statement (be->conn, stmt); gnc_sql_statement_dispose (stmt); if (result == NULL) { @@ -2201,25 +2197,6 @@ gnc_sql_execute_nonselect_sql (GncSqlBackend* be, const gchar* sql) return result; } -static guint -execute_statement_get_count (GncSqlBackend* be, GncSqlStatement* stmt) -{ - GncSqlResult* result; - guint count = 0; - - g_return_val_if_fail (be != NULL, 0); - g_return_val_if_fail (stmt != NULL, 0); - - result = gnc_sql_execute_select_statement (be, stmt); - if (result != NULL) - { - count = gnc_sql_result_get_num_rows (result); - gnc_sql_result_dispose (result); - } - - return count; -} - guint gnc_sql_append_guid_list_to_sql (GString* sql, GList* list, guint maxCount) { @@ -2255,7 +2232,6 @@ gnc_sql_object_is_it_in_db (GncSqlBackend* be, const gchar* table_name, QofIdTypeConst obj_name, gpointer pObject, const EntryVec& table) { - GncSqlStatement* sqlStmt; guint count; GncSqlColumnTypeHandler* pHandler; PairVec values; @@ -2266,26 +2242,25 @@ gnc_sql_object_is_it_in_db (GncSqlBackend* be, const gchar* table_name, g_return_val_if_fail (pObject != NULL, FALSE); /* SELECT * FROM */ - sqlStmt = create_single_col_select_statement (be, table_name, table[0]); - g_assert (sqlStmt != NULL); + auto stmt = create_single_col_select_statement (be, table_name, table[0]); + g_assert (stmt != NULL); /* WHERE */ pHandler = get_handler (table[0]); g_assert (pHandler != NULL); pHandler->add_value_to_vec_fn (be, obj_name, pObject, table[0], values); PairVec col_values {values[0]}; - gnc_sql_statement_add_where_cond (sqlStmt, obj_name, pObject, col_values); + gnc_sql_statement_add_where_cond (stmt, obj_name, pObject, col_values); - count = execute_statement_get_count (be, sqlStmt); - gnc_sql_statement_dispose (sqlStmt); - if (count == 0) + auto result = gnc_sql_execute_select_statement (be, stmt); + gnc_sql_statement_dispose (stmt); + if (result != NULL) { - return FALSE; - } - else - { - return TRUE; + auto retval = result->size() > 0; + delete result; + return retval; } + return false; } gboolean @@ -2676,26 +2651,16 @@ gnc_sql_init_version_info (GncSqlBackend* be) if (gnc_sql_connection_does_table_exist (be->conn, VERSION_TABLE_NAME)) { - GncSqlResult* result; - gchar* sql; - - sql = g_strdup_printf ("SELECT * FROM %s", VERSION_TABLE_NAME); - result = gnc_sql_execute_select_sql (be, sql); + auto sql = g_strdup_printf ("SELECT * FROM %s", VERSION_TABLE_NAME); + auto result = gnc_sql_execute_select_sql (be, sql); g_free (sql); - if (result != nullptr) + for (const auto& row : *result) { - for (auto row = gnc_sql_result_get_first_row (result); - row != nullptr ; - row = gnc_sql_result_get_next_row (result)) - { - auto name = row->get_string_at_col (TABLE_COL_NAME); - auto version = row->get_int_at_col (VERSION_COL_NAME); - g_hash_table_insert (be->versions, - g_strdup (name.c_str()), - GINT_TO_POINTER (version)); - } + auto name = row.get_string_at_col (TABLE_COL_NAME); + auto version = row.get_int_at_col (VERSION_COL_NAME); + g_hash_table_insert (be->versions, g_strdup (name.c_str()), + GINT_TO_POINTER (version)); } - gnc_sql_result_dispose (result); } else { @@ -2833,4 +2798,20 @@ get_row_value_from_object(QofIdTypeConst obj_name, const gpointer pObject, } #endif +GncSqlRow& +GncSqlRow::operator++() +{ + auto& new_row = m_iter->operator++(); + if (new_row != *this) + m_iter = nullptr; + return new_row; +} + +/* +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 e18ed0b96b..7f5255b610 100644 --- a/src/backend/sql/gnc-backend-sql.h +++ b/src/backend/sql/gnc-backend-sql.h @@ -139,7 +139,9 @@ void gnc_sql_commit_edit (GncSqlBackend* qbe, QofInstance* inst); /** */ typedef struct GncSqlStatement GncSqlStatement; -typedef struct GncSqlResult GncSqlResult; +class GncSqlResult; +//using GncSqlResultPtr = std::unique_ptr; +using GncSqlResultPtr = GncSqlResult*; /** *@struct GncSqlStatement @@ -170,7 +172,7 @@ struct GncSqlStatement struct GncSqlConnection { void (*dispose) (GncSqlConnection*); - GncSqlResult* (*executeSelectStatement) (GncSqlConnection*, GncSqlStatement*); /**< Returns NULL if error */ + GncSqlResultPtr (*executeSelectStatement) (GncSqlConnection*, GncSqlStatement*); /**< Returns NULL if error */ gint (*executeNonSelectStatement) (GncSqlConnection*, GncSqlStatement*); /**< Returns -1 if error */ GncSqlStatement* (*createStatementFromSql) (GncSqlConnection*, const gchar*); gboolean (*doesTableExist) (GncSqlConnection*, const gchar*); /**< Returns true if successful */ @@ -211,39 +213,82 @@ struct GncSqlConnection * SQL backends must provide a structure which implements all of the functions. */ -class GncSqlRow +class GncSqlRow; +/** + * Pure virtual class to iterate over a query result set. + */ +class GncSqlResult { public: - virtual ~GncSqlRow() = default; - virtual int64_t get_int_at_col (const char* col) = 0; - virtual float get_float_at_col (const char* col) = 0; - virtual double get_double_at_col (const char* col) = 0; - virtual std::string get_string_at_col (const char* col) = 0; - virtual time64 get_time64_at_col (const char* col) = 0; - virtual bool is_col_null (const char* col) const noexcept = 0; + 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; + }; }; /** - * @struct GncSqlResult + * Row of SQL Query results. * - * Struct used to represent the result of an SQL SELECT statement. SQL - * backends must provide a structure which implements all of the functions. + * This is a "pointer" class of a pimpl pattern, the implementation being + * GncSqlResul::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. */ -struct GncSqlResult +class GncSqlRow { - guint (*getNumRows) (GncSqlResult*); - GncSqlRow* (*getFirstRow) (GncSqlResult*); - GncSqlRow* (*getNextRow) (GncSqlResult*); - void (*dispose) (GncSqlResult*); +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; }; -#define gnc_sql_result_get_num_rows(RESULT) \ - (RESULT)->getNumRows(RESULT) -#define gnc_sql_result_get_first_row(RESULT) \ - (RESULT)->getFirstRow(RESULT) -#define gnc_sql_result_get_next_row(RESULT) \ - (RESULT)->getNextRow(RESULT) -#define gnc_sql_result_dispose(RESULT) \ - (RESULT)->dispose(RESULT) + +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); +} /** * @struct GncSqlObjectBackend @@ -434,7 +479,7 @@ typedef enum } E_DB_OPERATION; typedef void (*GNC_SQL_LOAD_FN) (const GncSqlBackend* be, - GncSqlRow* row, QofSetterFunc setter, + GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row); typedef void (*GNC_SQL_ADD_COL_INFO_TO_LIST_FN) (const GncSqlBackend* be, @@ -512,8 +557,8 @@ gboolean gnc_sql_do_db_operation (GncSqlBackend* be, * @param statement Statement * @return Results, or NULL if an error has occured */ -GncSqlResult* gnc_sql_execute_select_statement (GncSqlBackend* be, - GncSqlStatement* statement); +GncSqlResultPtr gnc_sql_execute_select_statement (GncSqlBackend* be, + GncSqlStatement* statement); /** * Executes an SQL SELECT statement from an SQL char string and returns the @@ -524,7 +569,7 @@ GncSqlResult* gnc_sql_execute_select_statement (GncSqlBackend* be, * @param sql SQL SELECT string * @return Results, or NULL if an error has occured */ -GncSqlResult* gnc_sql_execute_select_sql (GncSqlBackend* be, const gchar* sql); +GncSqlResultPtr gnc_sql_execute_select_sql (GncSqlBackend* be, const gchar* sql); /** * Executes an SQL non-SELECT statement from an SQL char string. @@ -554,7 +599,7 @@ GncSqlStatement* gnc_sql_create_statement_from_sql (GncSqlBackend* be, * @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* be, GncSqlRow& row, QofIdTypeConst obj_name, gpointer pObject, const EntryVec& table); @@ -636,7 +681,7 @@ gboolean gnc_sql_create_index (const GncSqlBackend* be, const char* index_name, * @return GncGUID */ -const GncGUID* gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow* row); +const GncGUID* gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow& row); /** * Loads the transaction guid from a database row. The table must have a column @@ -647,7 +692,7 @@ const GncGUID* gnc_sql_load_guid (const GncSqlBackend* be, GncSqlRow* row); * @return GncGUID */ -const GncGUID* gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow* row); +const GncGUID* gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow& row); /** * Creates a basic SELECT statement for a table. diff --git a/src/backend/sql/gnc-bill-term-sql.cpp b/src/backend/sql/gnc-bill-term-sql.cpp index 6d5dbba707..8370f41509 100644 --- a/src/backend/sql/gnc-bill-term-sql.cpp +++ b/src/backend/sql/gnc-bill-term-sql.cpp @@ -172,14 +172,13 @@ bt_set_parent_guid (gpointer pObject, gpointer pValue) } static GncBillTerm* -load_single_billterm (GncSqlBackend* be, GncSqlRow* row, +load_single_billterm (GncSqlBackend* 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 (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pBillTerm = gncBillTermLookup (be->book, guid); @@ -221,60 +220,50 @@ static void load_all_billterms (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + GList* l_billterms_needing_parents = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - GList* l_billterms_needing_parents = NULL; + auto pBillTerm = + load_single_billterm (be, row, &l_billterms_needing_parents); + if (pBillTerm != NULL) + list = g_list_append (list, pBillTerm); + } - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); + } + + /* 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 + 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) + { + gboolean progress_made = TRUE; + GList* elem; + + while (progress_made) { - GncBillTerm* pBillTerm = load_single_billterm (be, row, - &l_billterms_needing_parents); - if (pBillTerm != NULL) + progress_made = FALSE; + for (elem = l_billterms_needing_parents; elem != NULL; + elem = g_list_next (elem)) { - list = g_list_append (list, pBillTerm); - } - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } - - /* 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 - 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) - { - gboolean progress_made = TRUE; - GList* elem; - - 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; - } + 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; } } } @@ -349,7 +338,7 @@ gnc_sql_save_billterm (GncSqlBackend* be, QofInstance* inst) /* ================================================================= */ static void -load_billterm_guid (const GncSqlBackend* be, GncSqlRow* row, +load_billterm_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -357,12 +346,11 @@ load_billterm_guid (const GncSqlBackend* be, GncSqlRow* row, GncBillTerm* term = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); string_to_guid (val.c_str(), &guid); term = gncBillTermLookup (be->book, &guid); if (term != NULL) diff --git a/src/backend/sql/gnc-book-sql.cpp b/src/backend/sql/gnc-book-sql.cpp index 500c2f94e4..627651d5b8 100644 --- a/src/backend/sql/gnc-book-sql.cpp +++ b/src/backend/sql/gnc-book-sql.cpp @@ -136,12 +136,11 @@ set_root_template_guid (gpointer pObject, gpointer pValue) /* ================================================================= */ static void -load_single_book (GncSqlBackend* be, GncSqlRow* row) +load_single_book (GncSqlBackend* be, GncSqlRow& row) { QofBook* pBook; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); gnc_sql_load_guid (be, row); @@ -163,35 +162,29 @@ static void load_all_books (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, BOOK_TABLE); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + auto row = result->begin(); + + /* If there are no rows, try committing the book; unset + * loading so that it will actually get saved. + */ + if (row == result->end()) { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - /* If there are no rows, try committing the book; unset - * loading so that it will actually get saved. - */ - if (row == NULL) - { - be->loading = FALSE; - (void)gnc_sql_save_book (be, QOF_INSTANCE (be->book)); - be->loading = TRUE; - } - else - { - // Otherwise, load the 1st book. - load_single_book (be, row); - } - - gnc_sql_result_dispose (result); + be->loading = FALSE; + (void)gnc_sql_save_book (be, QOF_INSTANCE (be->book)); + be->loading = TRUE; + } + else + { + // Otherwise, load the 1st book. + load_single_book (be, *row); } } } diff --git a/src/backend/sql/gnc-budget-sql.cpp b/src/backend/sql/gnc-budget-sql.cpp index aedc2f70dd..18c7c869bd 100644 --- a/src/backend/sql/gnc-budget-sql.cpp +++ b/src/backend/sql/gnc-budget-sql.cpp @@ -193,7 +193,6 @@ load_budget_amounts (GncSqlBackend* be, GncBudget* budget) gchar guid_buf[GUID_ENCODING_LENGTH + 1]; gchar* sql; GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); g_return_if_fail (budget != NULL); @@ -206,20 +205,12 @@ load_budget_amounts (GncSqlBackend* be, GncBudget* budget) g_free (sql); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - budget_amount_info_t info = { budget, NULL, 0 }; + budget_amount_info_t info = { budget, NULL, 0 }; - while (row != NULL) - { - gnc_sql_load_object (be, row, NULL, &info, budget_amounts_col_table); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - } + for (auto row : *result) + gnc_sql_load_object (be, row, NULL, &info, budget_amounts_col_table); } } @@ -294,14 +285,13 @@ save_budget_amounts (GncSqlBackend* be, GncBudget* budget) } /*----------------------------------------------------------------*/ static GncBudget* -load_single_budget (GncSqlBackend* be, GncSqlRow* row) +load_single_budget (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncBudget* pBudget = NULL; Recurrence* r; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); if (guid != NULL) @@ -331,7 +321,6 @@ static void load_all_budgets (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; GList* list = NULL; g_return_if_fail (be != NULL); @@ -339,29 +328,21 @@ load_all_budgets (GncSqlBackend* be) stmt = gnc_sql_create_select_statement (be, BUDGET_TABLE); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + for (auto row : *result) { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - GncBudget* b; - - while (row != NULL) + auto b = load_single_budget (be, row); + if (b != NULL) { - b = load_single_budget (be, row); - if (b != NULL) - { - list = g_list_prepend (list, b); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_prepend (list, b); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } } @@ -480,7 +461,7 @@ write_budgets (GncSqlBackend* be) /* ================================================================= */ static void -load_budget_guid (const GncSqlBackend* be, GncSqlRow* row, +load_budget_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -489,12 +470,11 @@ load_budget_guid (const GncSqlBackend* be, GncSqlRow* row, GncBudget* budget = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); (void)string_to_guid (val.c_str(), &guid); budget = gnc_budget_lookup (&guid, be->book); if (budget != NULL) diff --git a/src/backend/sql/gnc-commodity-sql.cpp b/src/backend/sql/gnc-commodity-sql.cpp index b31be69d12..8c3ccb6c99 100644 --- a/src/backend/sql/gnc-commodity-sql.cpp +++ b/src/backend/sql/gnc-commodity-sql.cpp @@ -112,7 +112,7 @@ set_quote_source_name (gpointer pObject, gpointer pValue) } static gnc_commodity* -load_single_commodity (GncSqlBackend* be, GncSqlRow* row) +load_single_commodity (GncSqlBackend* be, GncSqlRow& row) { QofBook* pBook = be->book; gnc_commodity* pCommodity; @@ -129,39 +129,30 @@ static void load_all_commodities (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; gnc_commodity_table* pTable; pTable = gnc_commodity_table_get_table (be->book); stmt = gnc_sql_create_select_statement (be, COMMODITIES_TABLE); if (stmt == NULL) return; - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + + for (auto row : *result) { - gnc_commodity* pCommodity; - GncSqlRow* row = gnc_sql_result_get_first_row (result); - gchar* sql; + auto pCommodity = load_single_commodity (be, row); - while (row != NULL) + if (pCommodity != NULL) { - pCommodity = load_single_commodity (be, row); + GncGUID guid; - if (pCommodity != NULL) - { - GncGUID guid; - - 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); - qof_instance_set_guid (QOF_INSTANCE (pCommodity), &guid); - } - row = gnc_sql_result_get_next_row (result); + 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); + qof_instance_set_guid (QOF_INSTANCE (pCommodity), &guid); } - gnc_sql_result_dispose (result); - sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", COMMODITIES_TABLE); + auto sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", COMMODITIES_TABLE); gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)gnc_commodity_find_commodity_by_guid); g_free (sql); @@ -273,7 +264,7 @@ gnc_sql_commit_commodity (gnc_commodity* pCommodity) /* ----------------------------------------------------------------- */ static void -load_commodity_guid (const GncSqlBackend* be, GncSqlRow* row, +load_commodity_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -281,12 +272,11 @@ load_commodity_guid (const GncSqlBackend* be, GncSqlRow* row, gnc_commodity* commodity = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); (void)string_to_guid (val.c_str(), &guid); commodity = gnc_commodity_find_commodity_by_guid (&guid, be->book); if (commodity != NULL) diff --git a/src/backend/sql/gnc-customer-sql.cpp b/src/backend/sql/gnc-customer-sql.cpp index a647cce88c..86db2ac715 100644 --- a/src/backend/sql/gnc-customer-sql.cpp +++ b/src/backend/sql/gnc-customer-sql.cpp @@ -86,13 +86,12 @@ static EntryVec col_table }); static GncCustomer* -load_single_customer (GncSqlBackend* be, GncSqlRow* row) +load_single_customer (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncCustomer* pCustomer; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pCustomer = gncCustomerLookup (be->book, guid); @@ -110,36 +109,28 @@ static void load_all_customers (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GList* list = NULL; - GncSqlRow* row; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncCustomer* pCustomer = load_single_customer (be, row); + if (pCustomer != NULL) { - GncCustomer* pCustomer = load_single_customer (be, row); - if (pCustomer != NULL) - { - list = g_list_append (list, pCustomer); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_append (list, pCustomer); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } diff --git a/src/backend/sql/gnc-employee-sql.cpp b/src/backend/sql/gnc-employee-sql.cpp index f80accd66e..d71030c85c 100644 --- a/src/backend/sql/gnc-employee-sql.cpp +++ b/src/backend/sql/gnc-employee-sql.cpp @@ -74,13 +74,12 @@ static EntryVec col_table }); static GncEmployee* -load_single_employee (GncSqlBackend* be, GncSqlRow* row) +load_single_employee (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncEmployee* pEmployee; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pEmployee = gncEmployeeLookup (be->book, guid); @@ -98,36 +97,30 @@ static void load_all_employees (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncEmployee* pEmployee = load_single_employee (be, row); + if (pEmployee != NULL) { - GncEmployee* pEmployee = load_single_employee (be, row); - if (pEmployee != NULL) - { - list = g_list_append (list, pEmployee); - } - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); + list = g_list_append (list, pEmployee); } } + + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); + } + } /* ================================================================= */ diff --git a/src/backend/sql/gnc-entry-sql.cpp b/src/backend/sql/gnc-entry-sql.cpp index ac2d8dcb6f..a44057cf66 100644 --- a/src/backend/sql/gnc-entry-sql.cpp +++ b/src/backend/sql/gnc-entry-sql.cpp @@ -150,13 +150,12 @@ entry_set_bill (gpointer pObject, gpointer val) } static GncEntry* -load_single_entry (GncSqlBackend* be, GncSqlRow* row) +load_single_entry (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncEntry* pEntry; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pEntry = gncEntryLookup (be->book, guid); @@ -174,35 +173,27 @@ static void load_all_entries (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncEntry* pEntry = load_single_entry (be, row); + if (pEntry != NULL) { - GncEntry* pEntry = load_single_entry (be, row); - if (pEntry != NULL) - { - list = g_list_append (list, pEntry); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_append (list, pEntry); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } diff --git a/src/backend/sql/gnc-invoice-sql.cpp b/src/backend/sql/gnc-invoice-sql.cpp index 74db65b11e..2f80683053 100644 --- a/src/backend/sql/gnc-invoice-sql.cpp +++ b/src/backend/sql/gnc-invoice-sql.cpp @@ -94,13 +94,12 @@ static EntryVec col_table }); static GncInvoice* -load_single_invoice (GncSqlBackend* be, GncSqlRow* row) +load_single_invoice (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncInvoice* pInvoice; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pInvoice = gncInvoiceLookup (be->book, guid); @@ -118,35 +117,27 @@ static void load_all_invoices (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncInvoice* pInvoice = load_single_invoice (be, row); + if (pInvoice != NULL) { - GncInvoice* pInvoice = load_single_invoice (be, row); - if (pInvoice != NULL) - { - list = g_list_append (list, pInvoice); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_append (list, pInvoice); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } @@ -284,7 +275,7 @@ write_invoices (GncSqlBackend* be) /* ================================================================= */ static void -load_invoice_guid (const GncSqlBackend* be, GncSqlRow* row, +load_invoice_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -292,12 +283,11 @@ load_invoice_guid (const GncSqlBackend* be, GncSqlRow* row, GncInvoice* invoice = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); string_to_guid (val.c_str(), &guid); invoice = gncInvoiceLookup (be->book, &guid); if (invoice != NULL) diff --git a/src/backend/sql/gnc-job-sql.cpp b/src/backend/sql/gnc-job-sql.cpp index f7f9ba7190..0f4b9c7c7c 100644 --- a/src/backend/sql/gnc-job-sql.cpp +++ b/src/backend/sql/gnc-job-sql.cpp @@ -71,13 +71,12 @@ static EntryVec col_table }); static GncJob* -load_single_job (GncSqlBackend* be, GncSqlRow* row) +load_single_job (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncJob* pJob; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pJob = gncJobLookup (be->book, guid); @@ -95,35 +94,26 @@ static void load_all_jobs (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; - g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncJob* pJob = load_single_job (be, row); + if (pJob != NULL) { - GncJob* pJob = load_single_job (be, row); - if (pJob != NULL) - { - list = g_list_append (list, pJob); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_append (list, pJob); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } diff --git a/src/backend/sql/gnc-lots-sql.cpp b/src/backend/sql/gnc-lots-sql.cpp index a8ba9f7892..644c28e6d5 100644 --- a/src/backend/sql/gnc-lots-sql.cpp +++ b/src/backend/sql/gnc-lots-sql.cpp @@ -97,12 +97,11 @@ set_lot_account (gpointer pObject, gpointer pValue) } static GNCLot* -load_single_lot (GncSqlBackend* be, GncSqlRow* row) +load_single_lot (GncSqlBackend* be, GncSqlRow& row) { GNCLot* lot; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); lot = gnc_lot_new (be->book); @@ -117,31 +116,22 @@ static void load_all_lots (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; - g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - gchar* sql; + if (result->begin () == nullptr) + return; + for (auto row : *result) + load_single_lot (be, row); - while (row != NULL) - { - load_single_lot (be, row); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - sql = g_strdup_printf ("SELECT DISTINCT guid FROM %s", TABLE_NAME); - gnc_sql_slots_load_for_sql_subquery (be, sql, (BookLookupFn)gnc_lot_lookup); - g_free (sql); - } + 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); + g_free (sql); } } @@ -214,7 +204,7 @@ write_lots (GncSqlBackend* be) /* ================================================================= */ static void -load_lot_guid (const GncSqlBackend* be, GncSqlRow* row, +load_lot_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -222,12 +212,11 @@ load_lot_guid (const GncSqlBackend* be, GncSqlRow* row, GNCLot* lot; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); (void)string_to_guid (val.c_str(), &guid); lot = gnc_lot_lookup (&guid, be->book); if (lot != NULL) diff --git a/src/backend/sql/gnc-order-sql.cpp b/src/backend/sql/gnc-order-sql.cpp index 2ac48a22ef..ad4685e85c 100644 --- a/src/backend/sql/gnc-order-sql.cpp +++ b/src/backend/sql/gnc-order-sql.cpp @@ -67,13 +67,12 @@ static EntryVec col_table }); static GncOrder* -load_single_order (GncSqlBackend* be, GncSqlRow* row) +load_single_order (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncOrder* pOrder; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pOrder = gncOrderLookup (be->book, guid); @@ -91,35 +90,26 @@ static void load_all_orders (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; - g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + GncOrder* pOrder = load_single_order (be, row); + if (pOrder != NULL) { - GncOrder* pOrder = load_single_order (be, row); - if (pOrder != NULL) - { - list = g_list_append (list, pOrder); - } - row = gnc_sql_result_get_next_row (result); + list = g_list_append (list, pOrder); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } @@ -199,7 +189,7 @@ write_orders (GncSqlBackend* be) /* ================================================================= */ static void -load_order_guid (const GncSqlBackend* be, GncSqlRow* row, +load_order_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -207,12 +197,11 @@ load_order_guid (const GncSqlBackend* be, GncSqlRow* row, GncOrder* order = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); string_to_guid (val.c_str(), &guid); order = gncOrderLookup (be->book, &guid); if (order != NULL) diff --git a/src/backend/sql/gnc-owner-sql.cpp b/src/backend/sql/gnc-owner-sql.cpp index 21efa59f05..b1764fd5c7 100644 --- a/src/backend/sql/gnc-owner-sql.cpp +++ b/src/backend/sql/gnc-owner-sql.cpp @@ -49,7 +49,7 @@ typedef void (*OwnerSetterFunc) (gpointer, GncOwner*); typedef GncOwner* (*OwnerGetterFunc) (const gpointer); static void -load_owner (const GncSqlBackend* be, GncSqlRow* row, +load_owner (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -59,17 +59,16 @@ load_owner (const GncSqlBackend* be, GncSqlRow* row, GncGUID* pGuid = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); auto book = be->book; auto buf = g_strdup_printf ("%s_type", table_row.col_name); try { - type = static_cast(row->get_int_at_col (buf)); + type = static_cast(row.get_int_at_col (buf)); g_free (buf); buf = g_strdup_printf ("%s_guid", table_row.col_name); - auto val = row->get_string_at_col (buf); + auto val = row.get_string_at_col (buf); g_free (buf); string_to_guid (val.c_str(), &guid); pGuid = &guid; diff --git a/src/backend/sql/gnc-price-sql.cpp b/src/backend/sql/gnc-price-sql.cpp index 2360b9af45..41c6c68258 100644 --- a/src/backend/sql/gnc-price-sql.cpp +++ b/src/backend/sql/gnc-price-sql.cpp @@ -67,12 +67,11 @@ static const EntryVec col_table /* ================================================================= */ static GNCPrice* -load_single_price (GncSqlBackend* be, GncSqlRow* row) +load_single_price (GncSqlBackend* be, GncSqlRow& row) { GNCPrice* pPrice; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); pPrice = gnc_price_create (be->book); @@ -87,7 +86,6 @@ static void load_all_prices (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; QofBook* pBook; GNCPriceDB* pPriceDB; @@ -98,33 +96,30 @@ load_all_prices (GncSqlBackend* be) stmt = gnc_sql_create_select_statement (be, TABLE_NAME); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + if (result->begin() == result->end()) + return; + + GNCPrice* pPrice; + gchar* sql; + + gnc_pricedb_set_bulk_update (pPriceDB, TRUE); + for (auto row : *result) { - GNCPrice* pPrice; - GncSqlRow* row = gnc_sql_result_get_first_row (result); - gchar* sql; + pPrice = load_single_price (be, row); - gnc_pricedb_set_bulk_update (pPriceDB, TRUE); - while (row != NULL) + if (pPrice != NULL) { - pPrice = load_single_price (be, row); - - if (pPrice != NULL) - { - (void)gnc_pricedb_add_price (pPriceDB, pPrice); - gnc_price_unref (pPrice); - } - row = gnc_sql_result_get_next_row (result); + (void)gnc_pricedb_add_price (pPriceDB, pPrice); + gnc_price_unref (pPrice); } - gnc_sql_result_dispose (result); - 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); - g_free (sql); } + 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); + g_free (sql); } } diff --git a/src/backend/sql/gnc-recurrence-sql.cpp b/src/backend/sql/gnc-recurrence-sql.cpp index 2d3925f5f5..8cd1a4711d 100644 --- a/src/backend/sql/gnc-recurrence-sql.cpp +++ b/src/backend/sql/gnc-recurrence-sql.cpp @@ -284,12 +284,11 @@ gnc_sql_recurrence_delete (GncSqlBackend* be, const GncGUID* guid) } static void -load_recurrence (GncSqlBackend* be, GncSqlRow* row, Recurrence* r) +load_recurrence (GncSqlBackend* be, GncSqlRow& row, Recurrence* r) { recurrence_info_t recurrence_info; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (r != NULL); recurrence_info.be = be; @@ -298,13 +297,12 @@ load_recurrence (GncSqlBackend* be, GncSqlRow* row, Recurrence* r) gnc_sql_load_object (be, row, TABLE_NAME, &recurrence_info, col_table); } -static GncSqlResult* +static GncSqlResultPtr gnc_sql_set_recurrences_from_db (GncSqlBackend* be, const GncGUID* guid) { gchar* buf; gchar guid_buf[GUID_ENCODING_LENGTH + 1]; GncSqlStatement* stmt; - GncSqlResult* result; g_return_val_if_fail (be != NULL, NULL); g_return_val_if_fail (guid != NULL, NULL); @@ -314,7 +312,7 @@ gnc_sql_set_recurrences_from_db (GncSqlBackend* be, const GncGUID* guid) guid_buf); stmt = gnc_sql_connection_create_statement_from_sql (be->conn, buf); g_free (buf); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); return result; } @@ -322,33 +320,24 @@ gnc_sql_set_recurrences_from_db (GncSqlBackend* be, const GncGUID* guid) Recurrence* gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid) { - GncSqlResult* result; Recurrence* r = NULL; g_return_val_if_fail (be != NULL, NULL); g_return_val_if_fail (guid != NULL, NULL); - result = gnc_sql_set_recurrences_from_db (be, guid); - if (result != NULL) + auto result = gnc_sql_set_recurrences_from_db (be, guid); + auto row = result->begin(); + if (row == nullptr) { - guint numRows = gnc_sql_result_get_num_rows (result); - - if (numRows > 0) - { - if (numRows > 1) - { - g_warning ("More than 1 recurrence found: first one used"); - } - r = g_new0 (Recurrence, 1); - g_assert (r != NULL); - load_recurrence (be, gnc_sql_result_get_first_row (result), r); - } - else - { - g_warning ("No recurrences found"); - } - gnc_sql_result_dispose (result); + g_warning ("No recurrences found"); + return r; } + r = g_new0 (Recurrence, 1); + g_assert (r != NULL); + load_recurrence (be, *(result->begin()), r); + + if (++row != nullptr) + g_warning ("More than 1 recurrence found: first one used"); return r; } @@ -356,26 +345,18 @@ gnc_sql_recurrence_load (GncSqlBackend* be, const GncGUID* guid) GList* gnc_sql_recurrence_load_list (GncSqlBackend* be, const GncGUID* guid) { - GncSqlResult* result; GList* list = NULL; g_return_val_if_fail (be != NULL, NULL); g_return_val_if_fail (guid != NULL, NULL); - result = gnc_sql_set_recurrences_from_db (be, guid); - if (result != NULL) + auto result = gnc_sql_set_recurrences_from_db (be, guid); + for (auto row : *result) { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - while (row != NULL) - { - Recurrence* pRecurrence = g_new0 (Recurrence, 1); - g_assert (pRecurrence != NULL); - load_recurrence (be, row, pRecurrence); - list = g_list_append (list, pRecurrence); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); + Recurrence* pRecurrence = g_new0 (Recurrence, 1); + g_assert (pRecurrence != NULL); + load_recurrence (be, row, pRecurrence); + list = g_list_append (list, pRecurrence); } return list; diff --git a/src/backend/sql/gnc-schedxaction-sql.cpp b/src/backend/sql/gnc-schedxaction-sql.cpp index 91d7f0c05a..722744b25a 100644 --- a/src/backend/sql/gnc-schedxaction-sql.cpp +++ b/src/backend/sql/gnc-schedxaction-sql.cpp @@ -75,7 +75,7 @@ static const EntryVec col_table /* ================================================================= */ static SchedXaction* -load_single_sx (GncSqlBackend* be, GncSqlRow* row) +load_single_sx (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; SchedXaction* pSx; @@ -83,7 +83,6 @@ load_single_sx (GncSqlBackend* be, GncSqlRow* row) GDate start_date; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); g_assert (guid != NULL); @@ -105,41 +104,33 @@ static void load_all_sxes (GncSqlBackend* be) { GncSqlStatement* stmt = NULL; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, SCHEDXACTION_TABLE); if (stmt == NULL) return; - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + SchedXactions* sxes; + GList* list = NULL; + sxes = gnc_book_get_schedxactions (be->book); + + for (auto row : *result) { - GncSqlRow* row; - SchedXactions* sxes; - GList* list = NULL; - sxes = gnc_book_get_schedxactions (be->book); + SchedXaction* sx; - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + sx = load_single_sx (be, row); + if (sx != NULL) { - SchedXaction* sx; - - sx = load_single_sx (be, row); - if (sx != NULL) - { - gnc_sxes_add_sx (sxes, sx); - list = g_list_prepend (list, sx); - } - row = gnc_sql_result_get_next_row (result); + gnc_sxes_add_sx (sxes, sx); + list = g_list_prepend (list, sx); } - gnc_sql_result_dispose (result); + } - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } diff --git a/src/backend/sql/gnc-slots-sql.cpp b/src/backend/sql/gnc-slots-sql.cpp index 68419d89ed..2f3581b06a 100644 --- a/src/backend/sql/gnc-slots-sql.cpp +++ b/src/backend/sql/gnc-slots-sql.cpp @@ -724,7 +724,6 @@ gboolean gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid) { gchar* buf; - GncSqlResult* result; gchar guid_buf[GUID_ENCODING_LENGTH + 1]; GncSqlStatement* stmt; slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, g_string_new (NULL) }; @@ -740,30 +739,23 @@ gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid) g_free (buf); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + for (auto row : *result) { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - while (row != NULL) + try { - try - { - const GncSqlColumnTableEntry& table_row = - col_table[guid_val_col]; - GncGUID child_guid; - auto val = row->get_string_at_col (table_row.col_name); - (void)string_to_guid (val.c_str(), &child_guid); - gnc_sql_slots_delete (be, &child_guid); - row = gnc_sql_result_get_next_row (result); - } - catch (std::invalid_argument) - { - continue; - } + const GncSqlColumnTableEntry& table_row = + col_table[guid_val_col]; + GncGUID child_guid; + auto val = row.get_string_at_col (table_row.col_name); + (void)string_to_guid (val.c_str(), &child_guid); + gnc_sql_slots_delete (be, &child_guid); + } + catch (std::invalid_argument) + { + continue; } - gnc_sql_result_dispose (result); } } @@ -777,13 +769,12 @@ gnc_sql_slots_delete (GncSqlBackend* be, const GncGUID* guid) } static void -load_slot (slot_info_t* pInfo, GncSqlRow* row) +load_slot (slot_info_t* pInfo, GncSqlRow& row) { slot_info_t* slot_info; g_return_if_fail (pInfo != NULL); g_return_if_fail (pInfo->be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pInfo->pKvpFrame != NULL); slot_info = slot_info_copy (pInfo, NULL); @@ -829,7 +820,6 @@ static void slots_load_info (slot_info_t* pInfo) { gchar* buf; - GncSqlResult* result; gchar guid_buf[GUID_ENCODING_LENGTH + 1]; GncSqlStatement* stmt; @@ -846,29 +836,19 @@ slots_load_info (slot_info_t* pInfo) g_free (buf); if (stmt != NULL) { - result = gnc_sql_execute_select_statement (pInfo->be, stmt); + auto result = gnc_sql_execute_select_statement (pInfo->be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - while (row != NULL) - { - load_slot (pInfo, row); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - } + for (auto row : *result) + load_slot (pInfo, row); } } static const GncGUID* -load_obj_guid (const GncSqlBackend* be, GncSqlRow* row) +load_obj_guid (const GncSqlBackend* be, GncSqlRow& row) { static GncGUID guid; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); gnc_sql_load_object (be, row, NULL, &guid, obj_guid_col_table); @@ -876,7 +856,7 @@ load_obj_guid (const GncSqlBackend* be, GncSqlRow* row) } static void -load_slot_for_list_item (GncSqlBackend* be, GncSqlRow* row, +load_slot_for_list_item (GncSqlBackend* be, GncSqlRow& row, QofCollection* coll) { slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL }; @@ -884,7 +864,6 @@ load_slot_for_list_item (GncSqlBackend* be, GncSqlRow* row, QofInstance* inst; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (coll != NULL); guid = load_obj_guid (be, row); @@ -909,7 +888,6 @@ gnc_sql_slots_load_for_list (GncSqlBackend* be, GList* list) QofCollection* coll; GncSqlStatement* stmt; GString* sql; - GncSqlResult* result; gboolean single_item; g_return_if_fail (be != NULL); @@ -949,23 +927,14 @@ gnc_sql_slots_load_for_list (GncSqlBackend* be, GList* list) return; } (void)g_string_free (sql, TRUE); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - while (row != NULL) - { - load_slot_for_list_item (be, row, coll); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - } + for (auto row : *result) + load_slot_for_list_item (be, row, coll); } static void -load_slot_for_book_object (GncSqlBackend* be, GncSqlRow* row, +load_slot_for_book_object (GncSqlBackend* be, GncSqlRow& row, BookLookupFn lookup_fn) { slot_info_t slot_info = { NULL, NULL, TRUE, NULL, KvpValue::Type::INVALID, NULL, FRAME, NULL, NULL }; @@ -973,7 +942,6 @@ load_slot_for_book_object (GncSqlBackend* be, GncSqlRow* row, QofInstance* inst; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (lookup_fn != NULL); guid = load_obj_guid (be, row); @@ -1008,7 +976,6 @@ void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be, { gchar* sql; GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); @@ -1028,19 +995,10 @@ void gnc_sql_slots_load_for_sql_subquery (GncSqlBackend* be, return; } g_free (sql); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row = gnc_sql_result_get_first_row (result); - - while (row != NULL) - { - load_slot_for_book_object (be, row, lookup_fn); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - } + for (auto row : *result) + load_slot_for_book_object (be, row, lookup_fn); } /* ================================================================= */ diff --git a/src/backend/sql/gnc-tax-table-sql.cpp b/src/backend/sql/gnc-tax-table-sql.cpp index 90c439dc3d..3b3dd38b4f 100644 --- a/src/backend/sql/gnc-tax-table-sql.cpp +++ b/src/backend/sql/gnc-tax-table-sql.cpp @@ -200,12 +200,11 @@ tt_set_parent_guid (gpointer pObject, gpointer pValue) } static void -load_single_ttentry (GncSqlBackend* be, GncSqlRow* row, GncTaxTable* tt) +load_single_ttentry (GncSqlBackend* be, GncSqlRow& row, GncTaxTable* tt) { GncTaxTableEntry* e = gncTaxTableEntryCreate (); g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (tt != NULL); gnc_sql_load_object (be, row, GNC_ID_TAXTABLE, e, ttentries_col_table); @@ -215,7 +214,6 @@ load_single_ttentry (GncSqlBackend* be, GncSqlRow* row, GncTaxTable* tt) static void load_taxtable_entries (GncSqlBackend* be, GncTaxTable* tt) { - GncSqlResult* result; gchar guid_buf[GUID_ENCODING_LENGTH + 1]; GValue value; gchar* buf; @@ -232,31 +230,20 @@ load_taxtable_entries (GncSqlBackend* be, GncTaxTable* tt) TTENTRIES_TABLE_NAME, guid_buf); stmt = gnc_sql_connection_create_statement_from_sql (be->conn, buf); g_free (buf); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) - { - GncSqlRow* row; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) - { - load_single_ttentry (be, row, tt); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - } + for (auto row : *result) + load_single_ttentry (be, row, tt); } static void -load_single_taxtable (GncSqlBackend* be, GncSqlRow* row, +load_single_taxtable (GncSqlBackend* be, GncSqlRow& row, GList** l_tt_needing_parents) { const GncGUID* guid; GncTaxTable* tt; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); guid = gnc_sql_load_guid (be, row); tt = gncTaxTableLookup (be->book, guid); @@ -297,47 +284,37 @@ static void load_all_taxtables (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); /* First time, create the query */ stmt = gnc_sql_create_select_statement (be, TT_TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* tt_needing_parents = NULL; + + for (auto row : *result) + load_single_taxtable (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) { - GncSqlRow* row; - GList* tt_needing_parents = NULL; + gboolean progress_made = TRUE; + GList* elem; - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + while (progress_made) { - load_single_taxtable (be, row, &tt_needing_parents); - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - /* 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) - { - gboolean progress_made = TRUE; - GList* elem; - - while (progress_made) + progress_made = FALSE; + for (elem = tt_needing_parents; elem != NULL; elem = g_list_next (elem)) { - 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; - } + 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; } } } @@ -505,7 +482,7 @@ write_taxtables (GncSqlBackend* be) /* ================================================================= */ static void -load_taxtable_guid (const GncSqlBackend* be, GncSqlRow* row, +load_taxtable_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -513,12 +490,11 @@ load_taxtable_guid (const GncSqlBackend* be, GncSqlRow* row, GncTaxTable* taxtable = NULL; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); string_to_guid (val.c_str(), &guid); taxtable = gncTaxTableLookup (be->book, &guid); if (taxtable != NULL) diff --git a/src/backend/sql/gnc-transaction-sql.cpp b/src/backend/sql/gnc-transaction-sql.cpp index 3f5c360c63..e0fb09cad5 100644 --- a/src/backend/sql/gnc-transaction-sql.cpp +++ b/src/backend/sql/gnc-transaction-sql.cpp @@ -174,7 +174,7 @@ set_split_lot (gpointer pObject, gpointer pLot) } static Split* -load_single_split (GncSqlBackend* be, GncSqlRow* row) +load_single_split (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncGUID split_guid; @@ -182,7 +182,6 @@ load_single_split (GncSqlBackend* be, GncSqlRow* row) gboolean bad_guid = FALSE; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); if (guid == NULL) return NULL; @@ -225,7 +224,6 @@ static void load_splits_for_tx_list (GncSqlBackend* be, GList* list) { GString* sql; - GncSqlResult* result; g_return_if_fail (be != NULL); @@ -239,44 +237,34 @@ load_splits_for_tx_list (GncSqlBackend* be, GList* list) (void)g_string_append (sql, ")"); // Execute the query and load the splits - result = gnc_sql_execute_select_sql (be, sql->str); - if (result != NULL) + auto result = gnc_sql_execute_select_sql (be, sql->str); + GList* split_list = NULL; + for (auto row : *result) { - GList* split_list = NULL; - GncSqlRow* row; - - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + Split* s; + s = load_single_split (be, row); + if (s != NULL) { - Split* s; - s = load_single_split (be, row); - if (s != NULL) - { - split_list = g_list_prepend (split_list, s); - } - row = gnc_sql_result_get_next_row (result); + split_list = g_list_prepend (split_list, s); } + } - if (split_list != NULL) - { - gnc_sql_slots_load_for_list (be, split_list); - g_list_free (split_list); - } - - gnc_sql_result_dispose (result); + if (split_list != NULL) + { + gnc_sql_slots_load_for_list (be, split_list); + g_list_free (split_list); } (void)g_string_free (sql, TRUE); } static Transaction* -load_single_tx (GncSqlBackend* be, GncSqlRow* row) +load_single_tx (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncGUID tx_guid; Transaction* pTx; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); if (guid == NULL) return NULL; @@ -332,126 +320,120 @@ typedef struct static void query_transactions (GncSqlBackend* be, GncSqlStatement* stmt) { - GncSqlResult* result; - g_return_if_fail (be != NULL); g_return_if_fail (stmt != NULL); - result = gnc_sql_execute_select_statement (be, stmt); - if (result != NULL) + auto result = gnc_sql_execute_select_statement (be, stmt); + if (result->begin() == result->end()) + return; + + GList* tx_list = NULL; + GList* node; + Transaction* tx; +#if LOAD_TRANSACTIONS_AS_NEEDED + GSList* bal_list = NULL; + GSList* nextbal; + Account* root = gnc_book_get_root_account (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), + save_account_balances, + &bal_list); +#endif + + // Load the transactions + for (auto row : *result) { - GList* tx_list = NULL; - GList* node; - GncSqlRow* row; - Transaction* tx; -#if LOAD_TRANSACTIONS_AS_NEEDED - GSList* bal_list = NULL; - GSList* nextbal; - Account* root = gnc_book_get_root_account (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), - save_account_balances, - &bal_list); -#endif - - // Load the transactions - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + tx = load_single_tx (be, row); + if (tx != NULL) { - tx = load_single_tx (be, row); - if (tx != NULL) - { - tx_list = g_list_prepend (tx_list, tx); - xaccTransScrubPostedDate (tx); - } - row = gnc_sql_result_get_next_row (result); + xaccTransScrubPostedDate (tx); + tx_list = g_list_prepend (tx_list, tx); } - gnc_sql_result_dispose (result); - - // Load all splits and slots for the transactions - if (tx_list != NULL) - { - gnc_sql_slots_load_for_list (be, tx_list); - load_splits_for_tx_list (be, tx_list); - } - - // Commit all of the transactions - for (node = tx_list; node != NULL; node = node->next) - { - Transaction* pTx = GNC_TRANSACTION (node->data); - xaccTransCommitEdit (pTx); - } - g_list_free (tx_list); - -#if LOAD_TRANSACTIONS_AS_NEEDED - // Update the account balances based on the loaded splits. If the end - // 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) - { - full_acct_balances_t* balns = (full_acct_balances_t*)nextbal->data; - gnc_numeric* pnew_end_bal; - gnc_numeric* pnew_end_c_bal; - gnc_numeric* pnew_end_r_bal; - gnc_numeric adj; - - g_object_get (balns->acc, - "end-balance", &pnew_end_bal, - "end-cleared-balance", &pnew_end_c_bal, - "end-reconciled-balance", &pnew_end_r_bal, - NULL); - - qof_instance_increase_editlevel (balns - acc); - if (!gnc_numeric_eq (*pnew_end_bal, balns->end_bal)) - { - adj = gnc_numeric_sub (balns->end_bal, *pnew_end_bal, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - balns->start_bal = gnc_numeric_add (balns->start_bal, adj, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - g_object_set (balns->acc, "start-balance", &balns->start_bal, NULL); - qof_instance_decrease_editlevel (balns - acc); - } - if (!gnc_numeric_eq (*pnew_end_c_bal, balns->end_cleared_bal)) - { - adj = gnc_numeric_sub (balns->end_cleared_bal, *pnew_end_c_bal, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - balns->start_cleared_bal = gnc_numeric_add (balns->start_cleared_bal, adj, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - g_object_set (balns->acc, "start-cleared-balance", &balns->start_cleared_bal, - NULL); - } - if (!gnc_numeric_eq (*pnew_end_r_bal, balns->end_reconciled_bal)) - { - adj = gnc_numeric_sub (balns->end_reconciled_bal, *pnew_end_r_bal, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - balns->start_reconciled_bal = gnc_numeric_add (balns->start_reconciled_bal, - adj, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - g_object_set (balns->acc, "start-reconciled-balance", - &balns->start_reconciled_bal, NULL); - } - qof_instance_decrease_editlevel (balns - acc); - xaccAccountRecomputeBalance (balns->acc); - g_free (pnew_end_bal); - g_free (pnew_end_c_bal); - g_free (pnew_end_r_bal); - g_free (balns); - } - if (bal_list != NULL) - { - g_slist_free (bal_list); - } - - xaccAccountCommitEdit (root); - qof_event_resume (); -#endif } + + // Load all splits and slots for the transactions + if (tx_list != NULL) + { + gnc_sql_slots_load_for_list (be, tx_list); + load_splits_for_tx_list (be, tx_list); + } + + // Commit all of the transactions + for (node = tx_list; node != NULL; node = node->next) + { + Transaction* pTx = GNC_TRANSACTION (node->data); + xaccTransCommitEdit (pTx); + } + g_list_free (tx_list); + +#if LOAD_TRANSACTIONS_AS_NEEDED + // Update the account balances based on the loaded splits. If the end + // 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) + { + full_acct_balances_t* balns = (full_acct_balances_t*)nextbal->data; + gnc_numeric* pnew_end_bal; + gnc_numeric* pnew_end_c_bal; + gnc_numeric* pnew_end_r_bal; + gnc_numeric adj; + + g_object_get (balns->acc, + "end-balance", &pnew_end_bal, + "end-cleared-balance", &pnew_end_c_bal, + "end-reconciled-balance", &pnew_end_r_bal, + NULL); + + qof_instance_increase_editlevel (balns - acc); + if (!gnc_numeric_eq (*pnew_end_bal, balns->end_bal)) + { + adj = gnc_numeric_sub (balns->end_bal, *pnew_end_bal, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + balns->start_bal = gnc_numeric_add (balns->start_bal, adj, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + g_object_set (balns->acc, "start-balance", &balns->start_bal, NULL); + qof_instance_decrease_editlevel (balns - acc); + } + if (!gnc_numeric_eq (*pnew_end_c_bal, balns->end_cleared_bal)) + { + adj = gnc_numeric_sub (balns->end_cleared_bal, *pnew_end_c_bal, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + balns->start_cleared_bal = gnc_numeric_add (balns->start_cleared_bal, adj, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + g_object_set (balns->acc, "start-cleared-balance", &balns->start_cleared_bal, + NULL); + } + if (!gnc_numeric_eq (*pnew_end_r_bal, balns->end_reconciled_bal)) + { + adj = gnc_numeric_sub (balns->end_reconciled_bal, *pnew_end_r_bal, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + balns->start_reconciled_bal = gnc_numeric_add (balns->start_reconciled_bal, + adj, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + g_object_set (balns->acc, "start-reconciled-balance", + &balns->start_reconciled_bal, NULL); + } + qof_instance_decrease_editlevel (balns - acc); + xaccAccountRecomputeBalance (balns->acc); + g_free (pnew_end_bal); + g_free (pnew_end_c_bal); + g_free (pnew_end_r_bal); + g_free (balns); + } + if (bal_list != NULL) + { + g_slist_free (bal_list); + } + + xaccAccountCommitEdit (root); + qof_event_resume (); +#endif } /* ================================================================= */ @@ -1325,12 +1307,11 @@ 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* be, GncSqlRow& row) { single_acct_balance_t* bal = NULL; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); bal = static_cast (g_malloc (sizeof (single_acct_balance_t))); g_assert (bal != NULL); @@ -1345,7 +1326,6 @@ GSList* gnc_sql_get_account_balances_slist (GncSqlBackend* be) { #if LOAD_TRANSACTIONS_AS_NEEDED - GncSqlResult* result; GncSqlStatement* stmt; gchar* buf; GSList* bal_slist = NULL; @@ -1357,75 +1337,68 @@ gnc_sql_get_account_balances_slist (GncSqlBackend* be) stmt = gnc_sql_create_statement_from_sql (be, buf); g_assert (stmt != NULL); g_free (buf); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + acct_balances_t* bal = NULL; + + for (auto row : *result) { - GncSqlRow* row; - acct_balances_t* bal = NULL; + single_acct_balance_t* single_bal; - row = gnc_sql_result_get_first_row (result); - while (row != NULL) + // Get the next reconcile state balance and merge with other balances + single_bal = load_single_acct_balances (be, row); + if (single_bal != NULL) { - 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); - if (single_bal != NULL) + if (bal != NULL && bal->acct != single_bal->acct) { - if (bal != NULL && bal->acct != single_bal->acct) - { - bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, - bal->reconciled_balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - bal->balance = gnc_numeric_add (bal->balance, bal->cleared_balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - bal_slist = g_slist_append (bal_slist, bal); - bal = NULL; - } - if (bal == NULL) - { - bal = g_malloc ((gsize)sizeof (acct_balances_t)); - g_assert (bal != NULL); - - bal->acct = single_bal->acct; - bal->balance = gnc_numeric_zero (); - bal->cleared_balance = gnc_numeric_zero (); - bal->reconciled_balance = gnc_numeric_zero (); - } - if (single_bal->reconcile_state == 'n') - { - bal->balance = gnc_numeric_add (bal->balance, single_bal->balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - } - else if (single_bal->reconcile_state == 'c') - { - bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, - single_bal->balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - } - else if (single_bal->reconcile_state == 'y') - { - bal->reconciled_balance = gnc_numeric_add (bal->reconciled_balance, - single_bal->balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - } - g_free (single_bal); + bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, + bal->reconciled_balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + bal->balance = gnc_numeric_add (bal->balance, bal->cleared_balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + bal_slist = g_slist_append (bal_slist, bal); + bal = NULL; } - row = gnc_sql_result_get_next_row (result); - } + if (bal == NULL) + { + bal = g_malloc ((gsize)sizeof (acct_balances_t)); + g_assert (bal != NULL); - // Add the final balance - if (bal != NULL) - { - bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, - bal->reconciled_balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - bal->balance = gnc_numeric_add (bal->balance, bal->cleared_balance, - GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); - bal_slist = g_slist_append (bal_slist, bal); + bal->acct = single_bal->acct; + bal->balance = gnc_numeric_zero (); + bal->cleared_balance = gnc_numeric_zero (); + bal->reconciled_balance = gnc_numeric_zero (); + } + if (single_bal->reconcile_state == 'n') + { + bal->balance = gnc_numeric_add (bal->balance, single_bal->balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + } + else if (single_bal->reconcile_state == 'c') + { + bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, + single_bal->balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + } + else if (single_bal->reconcile_state == 'y') + { + bal->reconciled_balance = gnc_numeric_add (bal->reconciled_balance, + single_bal->balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + } + g_free (single_bal); } - gnc_sql_result_dispose (result); + } + + // Add the final balance + if (bal != NULL) + { + bal->cleared_balance = gnc_numeric_add (bal->cleared_balance, + bal->reconciled_balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + bal->balance = gnc_numeric_add (bal->balance, bal->cleared_balance, + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); + bal_slist = g_slist_append (bal_slist, bal); } return bal_slist; @@ -1436,7 +1409,7 @@ gnc_sql_get_account_balances_slist (GncSqlBackend* be) /* ----------------------------------------------------------------- */ static void -load_tx_guid (const GncSqlBackend* be, GncSqlRow* row, +load_tx_guid (const GncSqlBackend* be, GncSqlRow& row, QofSetterFunc setter, gpointer pObject, const GncSqlColumnTableEntry& table_row) { @@ -1445,12 +1418,11 @@ load_tx_guid (const GncSqlBackend* be, GncSqlRow* row, const gchar* guid_str; g_return_if_fail (be != NULL); - g_return_if_fail (row != NULL); g_return_if_fail (pObject != NULL); try { - auto val = row->get_string_at_col (table_row.col_name); + auto val = row.get_string_at_col (table_row.col_name); (void)string_to_guid (val.c_str(), &guid); tx = xaccTransLookup (&guid, be->book); diff --git a/src/backend/sql/gnc-vendor-sql.cpp b/src/backend/sql/gnc-vendor-sql.cpp index 87daeab884..4e3563870a 100644 --- a/src/backend/sql/gnc-vendor-sql.cpp +++ b/src/backend/sql/gnc-vendor-sql.cpp @@ -77,13 +77,12 @@ static EntryVec col_table }); static GncVendor* -load_single_vendor (GncSqlBackend* be, GncSqlRow* row) +load_single_vendor (GncSqlBackend* be, GncSqlRow& row) { const GncGUID* guid; GncVendor* pVendor; g_return_val_if_fail (be != NULL, NULL); - g_return_val_if_fail (row != NULL, NULL); guid = gnc_sql_load_guid (be, row); pVendor = gncVendorLookup (be->book, guid); @@ -101,35 +100,25 @@ static void load_all_vendors (GncSqlBackend* be) { GncSqlStatement* stmt; - GncSqlResult* result; g_return_if_fail (be != NULL); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); - result = gnc_sql_execute_select_statement (be, stmt); + auto result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); - if (result != NULL) + GList* list = NULL; + + for (auto row : *result) { - GncSqlRow* row; - GList* list = NULL; + GncVendor* pVendor = load_single_vendor (be, row); + if (pVendor != NULL) + list = g_list_append (list, pVendor); + } - row = gnc_sql_result_get_first_row (result); - while (row != NULL) - { - GncVendor* pVendor = load_single_vendor (be, row); - if (pVendor != NULL) - { - list = g_list_append (list, pVendor); - } - row = gnc_sql_result_get_next_row (result); - } - gnc_sql_result_dispose (result); - - if (list != NULL) - { - gnc_sql_slots_load_for_list (be, list); - g_list_free (list); - } + if (list != NULL) + { + gnc_sql_slots_load_for_list (be, list); + g_list_free (list); } } diff --git a/src/backend/sql/test/utest-gnc-backend-sql.cpp b/src/backend/sql/test/utest-gnc-backend-sql.cpp index b2feed203f..699119f271 100644 --- a/src/backend/sql/test/utest-gnc-backend-sql.cpp +++ b/src/backend/sql/test/utest-gnc-backend-sql.cpp @@ -410,7 +410,7 @@ test_gnc_sql_add_subtable_colnames_to_list (Fixture *fixture, gconstpointer pDat }*/ /* load_string static void -load_string (const GncSqlBackend* be, GncSqlRow* row, +load_string (const GncSqlBackend* be, GncSqlRow& row, const GncSqlColumnTableEntry& table_row)// 2 */ /* static void @@ -437,7 +437,7 @@ test_add_gvalue_string_to_slist (Fixture *fixture, gconstpointer pData) }*/ /* load_int static void -load_int (const GncSqlBackend* be, GncSqlRow* row,// 4 +load_int (const GncSqlBackend* be, GncSqlRow& row,// 4 */ /* static void test_load_int (Fixture *fixture, gconstpointer pData) @@ -461,7 +461,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* be, GncSqlRow& row,// 2 */ /* static void test_load_boolean (Fixture *fixture, gconstpointer pData) @@ -485,7 +485,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* be, GncSqlRow& row,// 2 */ /* static void test_load_int64 (Fixture *fixture, gconstpointer pData) @@ -509,7 +509,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* be, GncSqlRow& row,// 2 */ /* static void test_load_double (Fixture *fixture, gconstpointer pData) @@ -533,7 +533,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* be, GncSqlRow& row,// 3 */ /* static void test_load_guid (Fixture *fixture, gconstpointer pData) @@ -610,7 +610,7 @@ test_gnc_sql_convert_timespec_to_string () } /* load_timespec static void -load_timespec (const GncSqlBackend* be, GncSqlRow* row,// 2 +load_timespec (const GncSqlBackend* be, GncSqlRow& row,// 2 */ /* static void test_load_timespec (Fixture *fixture, gconstpointer pData) @@ -634,7 +634,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* be, GncSqlRow& row,// 2 */ /* static void test_load_date (Fixture *fixture, gconstpointer pData) @@ -658,7 +658,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* be, GncSqlRow& row,// 2 */ /* static void test_load_numeric (Fixture *fixture, gconstpointer pData) @@ -713,7 +713,7 @@ 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* be, GncSqlRow& row)// C: 15 in 14 */ /* static void test_gnc_sql_load_guid (Fixture *fixture, gconstpointer pData) { @@ -721,7 +721,7 @@ test_gnc_sql_load_guid (Fixture *fixture, gconstpointer pData) // Not Used /* gnc_sql_load_tx_guid const GncGUID* -gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow* row)// 1 +gnc_sql_load_tx_guid (const GncSqlBackend* be, GncSqlRow& row)// 1 */ /* static void test_gnc_sql_load_tx_guid (Fixture *fixture, gconstpointer pData) @@ -729,7 +729,7 @@ test_gnc_sql_load_tx_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* be, GncSqlRow& row,// C: 29 in 19 */ /* static void test_gnc_sql_load_object (Fixture *fixture, gconstpointer pData) {