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 ); gnc_sql_statement_dispose( stmt ); if ( result != NULL ) { GncSqlRow* row = gnc_sql_result_get_first_row( result ); // If there are no rows, try committing the book if ( row == NULL ) { (void)gnc_sql_save_book( be, QOF_INSTANCE(be->book) ); } else { // Otherwise, load the 1st book. load_single_book( be, row ); } gnc_sql_result_dispose( result ); } } }
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); gnc_sql_statement_dispose (stmt); if (result != NULL) { 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) { 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); } } }
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 ); gnc_sql_statement_dispose( stmt ); if ( result != NULL ) { GncSqlRow* row = gnc_sql_result_get_first_row( result ); gchar* sql; 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 ); } } }
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 ); gnc_sql_statement_dispose( stmt ); if ( result != NULL ) { GncSqlRow* row; GList* tt_needing_parents = NULL; row = gnc_sql_result_get_first_row( result ); while ( row != NULL ) { 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; GncTaxTable* root; Account* pParent; GList* elem; while ( progress_made ) { progress_made = FALSE; for ( elem = tt_needing_parents; elem != NULL; elem = g_list_next( elem ) ) { taxtable_parent_guid_struct* s = (taxtable_parent_guid_struct*)elem->data; tt_set_parent( s->tt, &s->guid ); tt_needing_parents = g_list_delete_link( tt_needing_parents, elem ); progress_made = TRUE; } } } } }
static void load_all_prices (GncSqlBackend* be) { GncSqlStatement* stmt; GncSqlResult* result; QofBook* pBook; GNCPriceDB* pPriceDB; g_return_if_fail (be != NULL); pBook = be->book; pPriceDB = gnc_pricedb_get_db (pBook); stmt = gnc_sql_create_select_statement (be, TABLE_NAME); if (stmt != NULL) { result = gnc_sql_execute_select_statement (be, stmt); gnc_sql_statement_dispose (stmt); if (result != NULL) { GNCPrice* pPrice; GncSqlRow* row = gnc_sql_result_get_first_row (result); gchar* sql; gnc_pricedb_set_bulk_update (pPriceDB, TRUE); while (row != 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); } 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); } } }
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 ); gnc_sql_statement_dispose( stmt ); if ( result != NULL ) { gnc_commodity* pCommodity; GncSqlRow* row = gnc_sql_result_get_first_row( result ); gchar* sql; while ( row != NULL ) { pCommodity = load_single_commodity( be, row ); if ( pCommodity != NULL ) { GncGUID guid; guid = *qof_instance_get_guid( QOF_INSTANCE(pCommodity) ); pCommodity = gnc_commodity_table_insert( pTable, pCommodity ); qof_instance_set_guid( QOF_INSTANCE(pCommodity), &guid ); } row = gnc_sql_result_get_next_row( result ); } gnc_sql_result_dispose( result ); 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 ); } }
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); gnc_sql_statement_dispose (stmt); if (result != NULL) { GncSqlRow* row; GList* list = NULL; GList* l_billterms_needing_parents = NULL; row = gnc_sql_result_get_first_row (result); while (row != NULL) { GncBillTerm* pBillTerm = load_single_billterm (be, row, &l_billterms_needing_parents); if (pBillTerm != NULL) { 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; } } } } }
static void load_all_accounts (GncSqlBackend* be) { GncSqlStatement* stmt = NULL; GncSqlResult* result; QofBook* pBook; GList* l_accounts_needing_parents = NULL; GSList* bal_slist; GSList* bal; g_return_if_fail (be != NULL); ENTER (""); pBook = be->book; stmt = gnc_sql_create_select_statement (be, TABLE_NAME); if (stmt == NULL) { LEAVE ("stmt == NULL"); return; } 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; while (row != NULL) { 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;) { account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data; pParent = xaccAccountLookup (&s->guid, be->book); if (pParent != NULL) { GList* next_elem; gnc_account_append_child (pParent, s->pAccount); next_elem = g_list_next (elem); l_accounts_needing_parents = g_list_delete_link (l_accounts_needing_parents, elem); g_free (s); elem = next_elem; progress_made = TRUE; } else { /* Can't be up in the for loop because the 'then' clause reads inside a node freed by g_list_delete_link(). */ elem = g_list_next (elem); } } } /* Any non-ROOT accounts left over must be parented by the root account */ root = gnc_book_get_root_account (pBook); while (l_accounts_needing_parents != NULL) { account_parent_guid_struct* s = (account_parent_guid_struct*) l_accounts_needing_parents->data; if (xaccAccountGetType (s->pAccount) != ACCT_TYPE_ROOT) { gnc_account_append_child (root, s->pAccount); } g_free (s); l_accounts_needing_parents = g_list_delete_link (l_accounts_needing_parents, l_accounts_needing_parents); } } /* 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_decrease_editlevel (balances->acct); } if (bal_slist != NULL) { g_slist_free (bal_slist); } } LEAVE (""); }