GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions
gnc-transaction-sql.c File Reference

load and save data to SQL More...

#include "config.h"
#include <glib/gi18n.h>
#include "qof.h"
#include "qofquery-p.h"
#include "qofquerycore-p.h"
#include "Account.h"
#include "Transaction.h"
#include "gnc-lot.h"
#include "engine-helpers.h"
#include "gnc-backend-sql.h"
#include "gnc-transaction-sql.h"
#include "gnc-commodity.h"
#include "gnc-commodity-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-engine.h"
#include "escape.h"

Go to the source code of this file.

Data Structures

struct  split_info_t
 
struct  full_acct_balances_t
 
struct  split_query_info_t
 
struct  single_acct_balance_t
 

Macros

#define SIMPLE_QUERY_COMPILATION   1
 
#define LOAD_TRANSACTIONS_AS_NEEDED   0
 
#define TRANSACTION_TABLE   "transactions"
 
#define TX_TABLE_VERSION   3
 
#define SPLIT_TABLE   "splits"
 
#define SPLIT_TABLE_VERSION   4
 
#define TX_MAX_NUM_LEN   2048
 
#define TX_MAX_DESCRIPTION_LEN   2048
 
#define SPLIT_MAX_MEMO_LEN   2048
 
#define SPLIT_MAX_ACTION_LEN   2048
 
#define TX_GUID_CHECK   0
 

Functions

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)
 
void gnc_sql_init_transaction_handler (void)
 

Detailed Description

load and save data to SQL

Author
Copyright (c) 2006-2008 Phil Longstaff plong.nosp@m.staf.nosp@m.f@rog.nosp@m.ers..nosp@m.com

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

Definition in file gnc-transaction-sql.c.

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 1339 of file gnc-transaction-sql.c.

1340 {
1341 #if LOAD_TRANSACTIONS_AS_NEEDED
1342  GncSqlResult* result;
1343  GncSqlStatement* stmt;
1344  gchar* buf;
1345  GSList* bal_slist = NULL;
1346 
1347  g_return_val_if_fail( be != NULL, NULL );
1348 
1349  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",
1350  SPLIT_TABLE );
1351  stmt = gnc_sql_create_statement_from_sql( be, buf );
1352  g_assert( stmt != NULL );
1353  g_free( buf );
1354  result = gnc_sql_execute_select_statement( be, stmt );
1355  gnc_sql_statement_dispose( stmt );
1356  if ( result != NULL )
1357  {
1358  GncSqlRow* row;
1359  acct_balances_t* bal = NULL;
1360 
1361  row = gnc_sql_result_get_first_row( result );
1362  while ( row != NULL )
1363  {
1364  single_acct_balance_t* single_bal;
1365 
1366  // Get the next reconcile state balance and merge with other balances
1367  single_bal = load_single_acct_balances( be, row );
1368  if ( single_bal != NULL )
1369  {
1370  if ( bal != NULL && bal->acct != single_bal->acct )
1371  {
1372  bal->cleared_balance = gnc_numeric_add( bal->cleared_balance, bal->reconciled_balance,
1374  bal->balance = gnc_numeric_add( bal->balance, bal->cleared_balance,
1376  bal_slist = g_slist_append( bal_slist, bal );
1377  bal = NULL;
1378  }
1379  if ( bal == NULL )
1380  {
1381  bal = g_malloc( (gsize)sizeof(acct_balances_t) );
1382  g_assert( bal != NULL );
1383 
1384  bal->acct = single_bal->acct;
1385  bal->balance = gnc_numeric_zero();
1386  bal->cleared_balance = gnc_numeric_zero();
1387  bal->reconciled_balance = gnc_numeric_zero();
1388  }
1389  if ( single_bal->reconcile_state == 'n' )
1390  {
1391  bal->balance = gnc_numeric_add( bal->balance, single_bal->balance,
1393  }
1394  else if ( single_bal->reconcile_state == 'c' )
1395  {
1396  bal->cleared_balance = gnc_numeric_add( bal->cleared_balance, single_bal->balance,
1398  }
1399  else if ( single_bal->reconcile_state == 'y' )
1400  {
1401  bal->reconciled_balance = gnc_numeric_add( bal->reconciled_balance, single_bal->balance,
1403  }
1404  g_free( single_bal );
1405  }
1406  row = gnc_sql_result_get_next_row( result );
1407  }
1408 
1409  // Add the final balance
1410  if ( bal != NULL )
1411  {
1412  bal->cleared_balance = gnc_numeric_add( bal->cleared_balance, bal->reconciled_balance,
1414  bal->balance = gnc_numeric_add( bal->balance, bal->cleared_balance,
1416  bal_slist = g_slist_append( bal_slist, bal );
1417  }
1418  gnc_sql_result_dispose( result );
1419  }
1420 
1421  return bal_slist;
1422 #else
1423  return NULL;
1424 #endif
1425 }
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
GncSqlResult * gnc_sql_execute_select_statement(GncSqlBackend *be, GncSqlStatement *stmt)
GncSqlStatement * gnc_sql_create_statement_from_sql(GncSqlBackend *be, const gchar *sql)
#define GNC_DENOM_AUTO
Definition: gnc-numeric.h:246
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 783 of file gnc-transaction-sql.c.

784 {
785  g_return_val_if_fail( be != NULL, FALSE );
786  g_return_val_if_fail( inst != NULL, FALSE );
787  g_return_val_if_fail( GNC_IS_TRANS(inst), FALSE );
788 
789  return save_transaction( be, GNC_TRANS(inst), /* do_save_splits */TRUE );
790 }
void gnc_sql_transaction_load_all_tx ( GncSqlBackend be)

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 839 of file gnc-transaction-sql.c.

840 {
841  gchar* query_sql;
842  GncSqlStatement* stmt;
843 
844  g_return_if_fail( be != NULL );
845 
846  query_sql = g_strdup_printf( "SELECT * FROM %s", TRANSACTION_TABLE );
847  stmt = gnc_sql_create_statement_from_sql( be, query_sql );
848  g_free( query_sql );
849  if ( stmt != NULL )
850  {
851  query_transactions( be, stmt );
852  gnc_sql_statement_dispose( stmt );
853  }
854 }
GncSqlStatement * gnc_sql_create_statement_from_sql(GncSqlBackend *be, const gchar *sql)
void gnc_sql_transaction_load_tx_for_account ( GncSqlBackend be,
Account account 
)

Loads all transactions for an account.

Parameters
beSQL backend
accountAccount

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

810 {
811  const GncGUID* guid;
812  gchar guid_buf[GUID_ENCODING_LENGTH+1];
813  gchar* query_sql;
814  GncSqlStatement* stmt;
815 
816  g_return_if_fail( be != NULL );
817  g_return_if_fail( account != NULL );
818 
819  guid = qof_instance_get_guid( QOF_INSTANCE(account) );
820  (void)guid_to_string_buff( guid, guid_buf );
821  query_sql = g_strdup_printf(
822  "SELECT DISTINCT t.* FROM %s AS t, %s AS s WHERE s.tx_guid=t.guid AND s.account_guid ='%s'",
823  TRANSACTION_TABLE, SPLIT_TABLE, guid_buf );
824  stmt = gnc_sql_create_statement_from_sql( be, query_sql );
825  g_free( query_sql );
826  if ( stmt != NULL )
827  {
828  query_transactions( be, stmt );
829  gnc_sql_statement_dispose( stmt );
830  }
831 }
const GncGUID * qof_instance_get_guid(gconstpointer)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
Definition: guid.h:65
#define GUID_ENCODING_LENGTH
Definition: guid.h:74
GncSqlStatement * gnc_sql_create_statement_from_sql(GncSqlBackend *be, const gchar *sql)