Skip to content

Commit

Permalink
Use subquery instead of instancevec GncSqlTransBackend::load_all.
Browse files Browse the repository at this point in the history
  • Loading branch information
jralls committed Apr 14, 2018
1 parent b739661 commit e90a662
Showing 1 changed file with 52 additions and 3 deletions.
55 changes: 52 additions & 3 deletions libgnucash/backend/sql/gnc-transaction-sql.cpp
Expand Up @@ -248,6 +248,25 @@ load_single_split (GncSqlBackend* sql_be, GncSqlRow& row)
return pSplit;
}

static void
load_splits_for_sql_subquery (GncSqlBackend* sql_be, std::string subquery)
{
g_return_if_fail (sql_be != NULL);
const std::string sskey(tx_guid_col_table[0]->name());
std::string sql("SELECT * FROM " SPLIT_TABLE " WHERE ");
sql += sskey + " IN (" + subquery + ")";
auto stmt = sql_be->create_statement_from_sql(sql);
auto result = sql_be->execute_select_statement(stmt);
for (auto row : *result)
load_single_split (sql_be, row);
const std::string spkey(split_col_table[0]->name());
std::string sub_subquery("SELECT DISTINCT ");
sub_subquery += spkey + " FROM " SPLIT_TABLE " WHERE " + sskey +
" IN (" + subquery + ")";
gnc_sql_slots_load_for_sql_subquery(sql_be, sub_subquery,
(BookLookupFn)xaccSplitLookup);
}

static void
load_splits_for_tx_list (GncSqlBackend* sql_be, InstanceVec& transactions)
{
Expand Down Expand Up @@ -695,12 +714,42 @@ GncSqlTransBackend::load_all (GncSqlBackend* sql_be)
{
g_return_if_fail (sql_be != NULL);

auto query_sql = g_strdup_printf ("SELECT * FROM %s", TRANSACTION_TABLE);
std::string query_sql("SELECT * FROM " TRANSACTION_TABLE);
auto stmt = sql_be->create_statement_from_sql(query_sql);
g_free (query_sql);

if (stmt != nullptr)
{
query_transactions (sql_be, stmt);
auto result = sql_be->execute_select_statement(stmt);
if (result->begin() == result->end())
return;

Transaction* tx;

// Load the transactions
InstanceVec instances;
instances.reserve(result->size());
for (auto row : *result)
{
tx = load_single_tx (sql_be, row);
if (tx != nullptr)
{
xaccTransScrubPostedDate (tx);
instances.push_back(QOF_INSTANCE(tx));
}
}
if (instances.empty())
return;
const std::string tpkey(tx_col_table[0]->name());
std::string subquery("SELECT DISTINCT ");
subquery += tpkey + " FROM " TRANSACTION_TABLE;
gnc_sql_slots_load_for_sql_subquery (sql_be, subquery,
(BookLookupFn)xaccTransLookup);
load_splits_for_sql_subquery (sql_be, subquery);

// Commit all of the transactions
for (auto instance : instances)
xaccTransCommitEdit(GNC_TRANSACTION(instance));

}
}

Expand Down

0 comments on commit e90a662

Please sign in to comment.