r17713 - gnucash/trunk/src/backend - Load account balances at startup. Load splits for an account as
Phil Longstaff
plongstaff at cvs.gnucash.org
Sun Nov 23 13:04:17 EST 2008
Author: plongstaff
Date: 2008-11-23 13:04:16 -0500 (Sun, 23 Nov 2008)
New Revision: 17713
Trac: http://svn.gnucash.org/trac/changeset/17713
Modified:
gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
gnucash/trunk/src/backend/sql/gnc-account-sql.c
gnucash/trunk/src/backend/sql/gnc-backend-sql.c
gnucash/trunk/src/backend/sql/gnc-backend-sql.h
gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
gnucash/trunk/src/backend/sql/gnc-transaction-sql.h
Log:
Load account balances at startup. Load splits for an account as
required.
Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2008-11-23 18:04:16 UTC (rev 17713)
@@ -441,6 +441,10 @@
be->load_config = NULL;
be->get_config = NULL;
+ be->compile_query = gnc_sql_compile_query;
+ be->run_query = gnc_sql_run_query;
+ be->free_query = gnc_sql_free_query;
+
be->export = NULL;
if( !initialized ) {
Modified: gnucash/trunk/src/backend/sql/gnc-account-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-account-sql.c 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/sql/gnc-account-sql.c 2008-11-23 18:04:16 UTC (rev 17713)
@@ -183,6 +183,8 @@
Account* parent;
GList* l_accounts_needing_parents = NULL;
GList* list = NULL;
+ GSList* bal_slist;
+ GSList* bal;
g_return_if_fail( be != NULL );
@@ -245,6 +247,20 @@
gnc_account_append_child( root, s->pAccount );
}
}
+
+ /* 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;
+
+ g_object_set( balances->acct,
+ "start-balance", &balances->balance,
+ "start-cleared-balance", &balances->cleared_balance,
+ "start-reconciled-balance", &balances->reconciled_balance,
+ NULL);
+
+ }
+ g_slist_free( bal_slist );
}
}
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2008-11-23 18:04:16 UTC (rev 17713)
@@ -669,7 +669,7 @@
}
}
-static gpointer
+gpointer
gnc_sql_compile_query( QofBackend* pBEnd, QofQuery* pQuery )
{
GncSqlBackend *be = (GncSqlBackend*)pBEnd;
@@ -752,7 +752,7 @@
}
}
-static void
+void
gnc_sql_free_query( QofBackend* pBEnd, gpointer pQuery )
{
GncSqlBackend *be = (GncSqlBackend*)pBEnd;
@@ -802,7 +802,7 @@
}
}
-static void
+void
gnc_sql_run_query( QofBackend* pBEnd, gpointer pQuery )
{
GncSqlBackend *be = (GncSqlBackend*)pBEnd;
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.h
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2008-11-23 18:04:16 UTC (rev 17713)
@@ -672,4 +672,8 @@
void _retrieve_guid_( gpointer pObject, gpointer pValue );
+gpointer gnc_sql_compile_query( QofBackend* pBEnd, QofQuery* pQuery );
+void gnc_sql_free_query( QofBackend* pBEnd, gpointer pQuery );
+void gnc_sql_run_query( QofBackend* pBEnd, gpointer pQuery );
+
#endif /* GNC_BACKEND_SQL_H_ */
Modified: gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-transaction-sql.c 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/sql/gnc-transaction-sql.c 2008-11-23 18:04:16 UTC (rev 17713)
@@ -235,7 +235,6 @@
GncSqlStatement* stmt;
GValue value;
gchar* buf;
- GError* error = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( tx_guid != NULL );
@@ -247,7 +246,6 @@
buf = g_strdup_printf( "SELECT * FROM %s WHERE tx_guid='%s'", SPLIT_TABLE, guid_buf );
stmt = gnc_sql_create_statement_from_sql( be, buf );
- g_free( buf );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
@@ -341,7 +339,79 @@
return pTx;
}
+/**
+ * Structure to hold start/end balances for each account. The values are
+ * saved before splits are loaded, and then used to adjust the start balances
+ * so that the end balances (which are calculated and correct on initial load)
+ * are unchanged.
+ */
+typedef struct {
+ Account* acc;
+ gnc_numeric start_bal;
+ gnc_numeric end_bal;
+ gnc_numeric start_cleared_bal;
+ gnc_numeric end_cleared_bal;
+ gnc_numeric start_reconciled_bal;
+ gnc_numeric end_reconciled_bal;
+} full_acct_balances_t;
+
+static Account* g_acct;
+
+/**
+ * Save the start/end balances for an account.
+ */
static void
+save_account_balances( Account* acc, gpointer pData )
+{
+ GSList** pBal_list = (GSList**)pData;
+ full_acct_balances_t* newbal;
+ gnc_numeric* pstart;
+ gnc_numeric* pend;
+ gnc_numeric* pstart_c;
+ gnc_numeric* pend_c;
+ gnc_numeric* pstart_r;
+ gnc_numeric* pend_r;
+
+ newbal = g_malloc( sizeof( full_acct_balances_t ) );
+ newbal->acc = acc;
+ g_object_get( acc,
+ "start-balance", &pstart,
+ "end-balance", &pend,
+ "start-cleared-balance", &pstart_c,
+ "end-cleared-balance", &pend_c,
+ "start-reconciled-balance", &pstart_r,
+ "end-reconciled-balance", &pend_r,
+ NULL );
+ newbal->start_bal = *pstart;
+ newbal->end_bal = *pend;
+ newbal->start_cleared_bal = *pstart_c;
+ newbal->end_cleared_bal = *pend_c;
+ newbal->start_reconciled_bal = *pstart_r;
+ newbal->end_reconciled_bal = *pend_r;
+ *pBal_list = g_slist_append( *pBal_list, newbal );
+
+#if 0
+{
+ if( g_acct == NULL ) {
+ const gchar* name = xaccAccountGetName( acc );
+ if( strcmp( name, "Dividend Income" ) == 0 ) {
+ g_acct = acc;
+ }
+ }
+ if( g_acct != NULL && g_acct == acc ) {
+ printf( "save_account_balance: baln = %s: %s\n",
+ gnc_numeric_to_string( newbal->start_bal ),
+ gnc_numeric_to_string( newbal->end_bal ) );
+ }
+}
+#endif
+}
+
+/**
+ * Executes a transaction query statement and loads the transactions and all
+ * of the splits.
+ */
+static void
query_transactions( GncSqlBackend* be, GncSqlStatement* stmt )
{
GncSqlResult* result;
@@ -355,7 +425,20 @@
GList* node;
GncSqlRow* row;
Transaction* tx;
+ GSList* bal_list = NULL;
+ GSList* nextbal;
+ Account* root = gnc_book_get_root_account( be->primary_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 );
+
+ // Load the transactions
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
tx = load_single_tx( be, row );
@@ -366,6 +449,7 @@
}
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 );
@@ -376,39 +460,77 @@
Transaction* pTx = GNC_TRANSACTION(node->data);
xaccTransCommitEdit( pTx );
}
- }
-}
-static void
-load_tx_by_guid( GncSqlBackend* be, GUID* tx_guid )
-{
- GncSqlStatement* stmt;
- gchar* sql;
- gchar guid_buf[GUID_ENCODING_LENGTH+1];
+ // 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_return_if_fail( be != NULL );
- g_return_if_fail( tx_guid != NULL );
+ 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 );
- guid_to_string_buff( tx_guid, guid_buf );
- sql = g_strdup_printf( "SELECT * FROM %s WHERE guid = %s", TRANSACTION_TABLE, guid_buf );
- stmt = gnc_sql_create_statement_from_sql( be, sql );
- query_transactions( be, stmt );
- gnc_sql_statement_dispose( stmt );
+#if 0
+{
+ if( g_acct != NULL && balns->acc == g_acct ) {
+ printf( "Before: %s after %s\n",
+ gnc_numeric_to_string( balns->end_bal ),
+ gnc_numeric_to_string( *pnew_end_bal ) );
+ }
}
+#endif
-/* ================================================================= */
-static void
-load_all_tx( GncSqlBackend* be )
+ 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 );
+#if 0
{
- gchar* sql;
- GncSqlStatement* stmt;
+ if( g_acct != NULL && balns->acc == g_acct ) {
+ printf( "adj: %s start (before) = %s", gnc_numeric_to_string( adj ), gnc_numeric_to_string( balns->start_bal ) );
+ }
+}
+#endif
- g_return_if_fail( be != NULL );
+ balns->start_bal = gnc_numeric_add( balns->start_bal, adj,
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD );
+#if 0
+{
+ if( g_acct != NULL && balns->acc == g_acct ) {
+ printf( " start (after) = %s\n", gnc_numeric_to_string( balns->start_bal ) );
+ }
+}
+#endif
+ g_object_set( balns->acc, "start-balance", &balns->start_bal, NULL );
+ }
+ 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 );
+ }
+ xaccAccountRecomputeBalance( balns->acc );
+ }
+ g_slist_free( bal_list );
- sql = g_strdup_printf( "SELECT * FROM %s", TRANSACTION_TABLE );
- stmt = gnc_sql_create_statement_from_sql( be, sql );
- query_transactions( be, stmt );
- gnc_sql_statement_dispose( stmt );
+ xaccAccountCommitEdit( root );
+ qof_event_resume();
+ }
}
/* ================================================================= */
@@ -626,77 +748,57 @@
}
}
+typedef struct {
+ GncSqlStatement* stmt;
+ Account* acct;
+ gboolean has_been_run;
+} split_query_info_t;
+
static gpointer
compile_split_query( GncSqlBackend* be, QofQuery* pQuery )
{
- GString* sql;
const GUID* acct_guid;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
GncSqlResult* result;
- gchar* buf;
+ split_query_info_t* query_info;
+ gchar* subquery_sql;
+ gchar* query_sql;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( pQuery != NULL, NULL );
acct_guid = get_guid_from_query( pQuery );
guid_to_string_buff( acct_guid, guid_buf );
- sql = g_string_new( "" );
- g_string_printf( sql, "SELECT DISTINCT tx_guid FROM %s WHERE account_guid='%s'", SPLIT_TABLE, guid_buf );
- result = gnc_sql_execute_select_sql( be, sql->str );
- if( result != NULL ) {
- int numRows;
- int r;
- GncSqlRow* row;
+ subquery_sql = g_strdup_printf( "SELECT DISTINCT tx_guid FROM %s WHERE account_guid='%s'", SPLIT_TABLE, guid_buf );
+ query_sql = g_strdup_printf( "SELECT * FROM %s WHERE guid IN (%s)", TRANSACTION_TABLE, subquery_sql );
- numRows = gnc_sql_result_get_num_rows( result );
- sql = g_string_sized_new( 40+(GUID_ENCODING_LENGTH+3)*numRows );
+ query_info = g_malloc( sizeof(split_query_info_t) );
+ query_info->stmt = gnc_sql_create_statement_from_sql( be, query_sql );
+ query_info->has_been_run = FALSE;
+ query_info->acct = xaccAccountLookup( acct_guid, be->primary_book );
- if( numRows != 1 ) {
- g_string_printf( sql, "SELECT * FROM %s WHERE guid IN (", TRANSACTION_TABLE );
- } else {
- g_string_printf( sql, "SELECT * FROM %s WHERE guid =", TRANSACTION_TABLE );
- }
+ g_free( subquery_sql );
- row = gnc_sql_result_get_first_row( result );
- for( r = 0; row != NULL; r++ ) {
- const GUID* guid;
-
- guid = gnc_sql_load_tx_guid( be, row );
- guid_to_string_buff( guid, guid_buf );
- if( r != 0 ) {
- g_string_append( sql, "," );
- }
- g_string_append( sql, "'" );
- g_string_append( sql, guid_buf );
- g_string_append( sql, "'" );
- row = gnc_sql_result_get_next_row( result );
- }
- gnc_sql_result_dispose( result );
-
- if( numRows != 1 ) {
- g_string_append( sql, ")" );
- }
- }
-
- buf = sql->str;
- g_string_free( sql, FALSE );
- return buf;
+ return query_info;
}
static void
run_split_query( GncSqlBackend* be, gpointer pQuery )
{
- GncSqlStatement* stmt;
- gchar* sql;
+ split_query_info_t* query_info = (split_query_info_t*)pQuery;
g_return_if_fail( be != NULL );
g_return_if_fail( pQuery != NULL );
- sql = (gchar*)pQuery;
-
- stmt = gnc_sql_create_statement_from_sql( be, sql );
- query_transactions( be, stmt );
- gnc_sql_statement_dispose( stmt );
+ // When the query to load all splits for the account has been run, set the
+ // mark so that this account's query is not reexecuted.
+ if( !query_info->has_been_run && xaccAccountGetMark( query_info->acct ) == 0 ) {
+ query_transactions( be, query_info->stmt );
+ query_info->has_been_run = TRUE;
+ gnc_sql_statement_dispose( query_info->stmt );
+ query_info->stmt = NULL;
+ xaccAccountSetMark( query_info->acct, 1 );
+ }
}
static void
@@ -705,11 +807,150 @@
g_return_if_fail( be != NULL );
g_return_if_fail( pQuery != NULL );
- g_free( pQuery );
+ g_free( pQuery );
}
/* ----------------------------------------------------------------- */
+typedef struct {
+ const GncSqlBackend* be;
+ Account* acct;
+ char reconcile_state;
+ gnc_numeric balance;
+} single_acct_balance_t;
+
static void
+set_acct_bal_account_from_guid( gpointer pObject, gpointer pValue )
+{
+ single_acct_balance_t* bal = (single_acct_balance_t*)pObject;
+ const GUID* guid = (const GUID*)pValue;
+
+ g_return_if_fail( pObject != NULL );
+ g_return_if_fail( pValue != NULL );
+
+ bal->acct = xaccAccountLookup( guid, bal->be->primary_book );
+}
+
+static void
+set_acct_bal_reconcile_state( gpointer pObject, gpointer pValue )
+{
+ single_acct_balance_t* bal = (single_acct_balance_t*)pObject;
+ const gchar* s = (const gchar*)pValue;
+
+ g_return_if_fail( pObject != NULL );
+ g_return_if_fail( pValue != NULL );
+
+ bal->reconcile_state = s[0];
+}
+
+static void
+set_acct_bal_balance( gpointer pObject, gnc_numeric value )
+{
+ single_acct_balance_t* bal = (single_acct_balance_t*)pObject;
+
+ g_return_if_fail( pObject != NULL );
+
+ bal->balance = value;
+}
+
+static const GncSqlColumnTableEntry acct_balances_col_table[] =
+{
+ { "account_guid", CT_GUID, 0, 0, NULL, NULL, NULL, set_acct_bal_account_from_guid },
+ { "reconcile_state", CT_STRING, 1, 0, NULL, NULL, NULL, set_acct_bal_reconcile_state },
+ { "quantity", CT_NUMERIC, 0, 0, NULL, NULL, NULL, (QofSetterFunc)set_acct_bal_balance },
+ { NULL }
+};
+
+static single_acct_balance_t*
+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 = g_malloc( sizeof(single_acct_balance_t) );
+ bal->be = be;
+ gnc_sql_load_object( be, row, NULL, bal, acct_balances_col_table );
+
+ return bal;
+}
+
+GSList*
+gnc_sql_get_account_balances_slist( GncSqlBackend* be )
+{
+ GncSqlResult* result;
+ gchar guid_buf[GUID_ENCODING_LENGTH+1];
+ GncSqlStatement* stmt;
+ GValue value;
+ gchar* buf;
+ GSList* bal_slist = NULL;
+
+ g_return_val_if_fail( be != NULL, NULL );
+
+ buf = g_strdup_printf( "SELECT account_guid, reconcile_state, sum(quantity_num) as quantity_num, quantity_denom FROM %s GROUP BY account_guid, reconcile_state, quantity_denom",
+ SPLIT_TABLE );
+ stmt = gnc_sql_create_statement_from_sql( be, buf );
+
+ result = gnc_sql_execute_select_statement( be, stmt );
+ gnc_sql_statement_dispose( stmt );
+ if( result != NULL ) {
+ int r;
+ GList* list = NULL;
+ GncSqlRow* row;
+ acct_balances_t* bal = NULL;
+
+ row = gnc_sql_result_get_first_row( result );
+ while( row != 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 ) {
+ 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( sizeof(acct_balances_t) );
+ 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 );
+ }
+ }
+ row = gnc_sql_result_get_next_row( 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 );
+ }
+ gnc_sql_result_dispose( result );
+ }
+
+ return bal_slist;
+}
+
+/* ----------------------------------------------------------------- */
+static void
load_tx_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
@@ -755,7 +996,7 @@
GNC_SQL_BACKEND_VERSION,
GNC_ID_TRANS,
commit_transaction, /* commit */
- load_all_tx, /* initial_load */
+ NULL,
create_transaction_tables /* create tables */
};
static GncSqlObjectBackend be_data_split =
Modified: gnucash/trunk/src/backend/sql/gnc-transaction-sql.h
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-transaction-sql.h 2008-11-22 01:16:05 UTC (rev 17712)
+++ gnucash/trunk/src/backend/sql/gnc-transaction-sql.h 2008-11-23 18:04:16 UTC (rev 17713)
@@ -35,17 +35,18 @@
void gnc_sql_init_transaction_handler( void );
void gnc_sql_transaction_commit_splits( GncSqlBackend* be, Transaction* pTx );
gboolean gnc_sql_save_transaction( GncSqlBackend* be, QofInstance* inst );
-void gnc_sql_get_account_balances( GncSqlBackend* be, Account* pAccount,
- gnc_numeric* start_balance,
- gnc_numeric* cleared_balance,
- gnc_numeric* reconciled_balance );
typedef struct {
Account* acct;
- gnc_numeric start_balance;
+ gnc_numeric balance;
gnc_numeric cleared_balance;
gnc_numeric reconciled_balance;
} acct_balances_t;
-GList* gnc_sql_get_account_balances_for_list( GncSqlBackend* be, GList* list );
+/**
+ * Returns a list of acct_balances_t structures, one for each account which
+ * has splits.
+ */
+GSList* gnc_sql_get_account_balances_slist( GncSqlBackend* be );
+
#endif /* GNC_TRANSACTION_SQL_H_ */
More information about the gnucash-changes
mailing list