GnuCash 2.4.99
Data Structures | Functions
gnc-transaction-sql.h File Reference

load and save data to SQL More...

#include "gnc-backend-sql.h"
#include "Transaction.h"
#include "qof.h"
#include "Account.h"

Go to the source code of this file.

Data Structures

struct  acct_balances_t

Functions

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_transaction_load_tx_for_account (GncSqlBackend *be, Account *account)
void gnc_sql_transaction_load_all_tx (GncSqlBackend *be)
GSList * gnc_sql_get_account_balances_slist (GncSqlBackend *be)

Detailed Description

load and save data to SQL

Author:
Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>

This file implements the top-level QofBackend API for saving/ restoring data to/from an SQL database

Definition in file gnc-transaction-sql.h.


Function Documentation

GSList* gnc_sql_get_account_balances_slist ( GncSqlBackend be)

Returns a list of acct_balances_t structures, one for each account which has splits.

Parameters:
beSQL backend
Returns:
GSList of acct_balances_t structures

Definition at line 1391 of file gnc-transaction-sql.c.

{
#if LOAD_TRANSACTIONS_AS_NEEDED
    GncSqlResult* result;
    GncSqlStatement* stmt;
    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 ORDER BY account_guid, reconcile_state",
                           SPLIT_TABLE );
    stmt = gnc_sql_create_statement_from_sql( be, buf );
    g_assert( stmt != NULL );
    g_free( buf );
    result = gnc_sql_execute_select_statement( be, stmt );
    gnc_sql_statement_dispose( stmt );
    if ( result != 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( (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 );
            }
            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;
#else
    return NULL;
#endif
}
gboolean gnc_sql_save_transaction ( GncSqlBackend be,
QofInstance inst 
)

Saves a transaction to the db.

Parameters:
beSQL backend
instTransaction instance
Returns:
TRUE if successful, FALSE if unsuccessful

Definition at line 802 of file gnc-transaction-sql.c.

{
    g_return_val_if_fail( be != NULL, FALSE );
    g_return_val_if_fail( inst != NULL, FALSE );
    g_return_val_if_fail( GNC_IS_TRANS(inst), FALSE );

    return save_transaction( be, GNC_TRANS(inst), /* do_save_splits */TRUE );
}
void gnc_sql_transaction_commit_splits ( GncSqlBackend be,
Transaction pTx 
)

Commits all of the splits for a transaction.

Parameters:
beSQL backend
pTxTransaction
void gnc_sql_transaction_load_all_tx ( GncSqlBackend be)

Loads all transactions.

Parameters:
beSQL backend

Loads all transactions. This might be used during a save-as operation to ensure that all data is in memory and ready to be saved.

Parameters:
beSQL backend

Definition at line 889 of file gnc-transaction-sql.c.

{
    gchar* query_sql;
    GncSqlStatement* stmt;

    g_return_if_fail( be != NULL );

    query_sql = g_strdup_printf( "SELECT * FROM %s", TRANSACTION_TABLE );
    stmt = gnc_sql_create_statement_from_sql( be, query_sql );
    g_free( query_sql );
    if ( stmt != NULL )
    {
        query_transactions( be, stmt );
        gnc_sql_statement_dispose( stmt );
    }
}
void gnc_sql_transaction_load_tx_for_account ( GncSqlBackend be,
Account account 
)

Loads all transactions which have splits for a specific account.

Parameters:
beSQL backend
accountAccount

Loads all transactions for an account.

Parameters:
beSQL backend
accountAccount

Definition at line 859 of file gnc-transaction-sql.c.

{
    const GncGUID* guid;
    gchar guid_buf[GUID_ENCODING_LENGTH+1];
    gchar* query_sql;
    GncSqlStatement* stmt;

    g_return_if_fail( be != NULL );
    g_return_if_fail( account != NULL );

    guid = qof_instance_get_guid( QOF_INSTANCE(account) );
    (void)guid_to_string_buff( guid, guid_buf );
    query_sql = g_strdup_printf(
                    "SELECT DISTINCT t.* FROM %s AS t, %s AS s WHERE s.tx_guid=t.guid AND s.account_guid ='%s'",
                    TRANSACTION_TABLE, SPLIT_TABLE, guid_buf );
    stmt = gnc_sql_create_statement_from_sql( be, query_sql );
    g_free( query_sql );
    if ( stmt != NULL )
    {
        query_transactions( be, stmt );
        gnc_sql_statement_dispose( stmt );
    }
}
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines