37 #include "Recurrence.h"
45 #if defined( S_SPLINT_S )
46 #include "splint-defs.h"
49 #define BUDGET_TABLE "budgets"
50 #define TABLE_VERSION 1
51 #define AMOUNTS_TABLE "budget_amounts"
52 #define AMOUNTS_TABLE_VERSION 1
56 #define BUDGET_MAX_NAME_LEN 2048
57 #define BUDGET_MAX_DESCRIPTION_LEN 2048
63 {
"name", CT_STRING, BUDGET_MAX_NAME_LEN,
COL_NNUL,
"name" },
64 {
"description", CT_STRING, BUDGET_MAX_DESCRIPTION_LEN, 0,
"description" },
65 {
"num_periods", CT_INT, 0,
COL_NNUL,
"num_periods" },
71 static void set_budget( gpointer pObj, gpointer val );
73 static void set_account( gpointer pObj, gpointer val );
74 static gint get_period_num( gpointer pObj );
75 static void set_period_num( gpointer pObj, gpointer val );
77 static void set_amount( gpointer pObj,
gnc_numeric value );
91 "budget_guid", CT_BUDGETREF, 0,
COL_NNUL, NULL, NULL,
95 "account_guid", CT_ACCOUNTREF, 0,
COL_NNUL, NULL, NULL,
99 "period_num", CT_INT, 0,
COL_NNUL, NULL, NULL,
103 "amount", CT_NUMERIC, 0,
COL_NNUL, NULL, NULL,
112 get_budget( gpointer pObj )
116 g_return_val_if_fail( pObj != NULL, NULL );
118 return QOF_INSTANCE(info->budget);
122 set_budget( gpointer pObj, gpointer val )
127 get_account( gpointer pObj )
131 g_return_val_if_fail( pObj != NULL, NULL );
133 return QOF_INSTANCE(info->account);
137 set_account( gpointer pObj, gpointer val )
141 g_return_if_fail( pObj != NULL );
142 g_return_if_fail( val != NULL );
143 g_return_if_fail( GNC_IS_ACCOUNT(val) );
145 info->account = GNC_ACCOUNT(val);
149 get_period_num( gpointer pObj )
153 g_return_val_if_fail( pObj != NULL, 0 );
155 return info->period_num;
159 set_period_num( gpointer pObj, gpointer val )
163 g_return_if_fail( pObj != NULL );
165 info->period_num = GPOINTER_TO_UINT(val);
169 get_amount( gpointer pObj )
173 g_return_val_if_fail( pObj != NULL, gnc_numeric_zero() );
175 return gnc_budget_get_account_period_value( info->budget, info->account, info->period_num );
183 g_return_if_fail( pObj != NULL );
185 gnc_budget_set_account_period_value( info->budget, info->account, info->period_num, value );
203 g_return_if_fail( be != NULL );
204 g_return_if_fail( budget != NULL );
207 sql = g_strdup_printf(
"SELECT * FROM %s WHERE budget_guid='%s'", AMOUNTS_TABLE, guid_buf );
213 gnc_sql_statement_dispose( stmt );
214 if ( result != NULL )
216 GncSqlRow* row = gnc_sql_result_get_first_row( result );
219 while ( row != NULL )
222 row = gnc_sql_result_get_next_row( result );
224 gnc_sql_result_dispose( result );
241 g_return_val_if_fail( be != NULL, FALSE );
242 g_return_val_if_fail( budget != NULL, FALSE );
245 sql = g_strdup_printf(
"DELETE FROM %s WHERE budget_guid='%s'", AMOUNTS_TABLE, guid_buf );
266 gboolean is_ok = TRUE;;
268 g_return_val_if_fail( be != NULL, FALSE );
269 g_return_val_if_fail( budget != NULL, FALSE );
272 delete_budget_amounts( be, budget );
274 info.budget = budget;
275 num_periods = gnc_budget_get_num_periods( budget );
277 for ( node = descendants; node != NULL && is_ok; node = g_list_next(node) )
281 info.account = GNC_ACCOUNT(node->data);
282 for ( i = 0; i < num_periods && is_ok; i++ )
284 if ( gnc_budget_is_account_period_value_set( budget, info.account, i ) )
288 budget_amounts_col_table );
292 g_list_free( descendants );
304 g_return_val_if_fail( be != NULL, NULL );
305 g_return_val_if_fail( row != NULL, NULL );
310 pBudget = gnc_budget_lookup( guid, be->
book );
312 if ( pBudget == NULL )
317 gnc_budget_begin_edit( pBudget );
319 load_budget_amounts( be, pBudget );
320 r = gnc_sql_recurrence_load( be, gnc_budget_get_guid( pBudget ) );
323 gnc_budget_set_recurrence( pBudget, r );
326 gnc_budget_commit_edit( pBudget );
338 g_return_if_fail( be != NULL );
344 gnc_sql_statement_dispose( stmt );
345 if ( result != NULL )
347 GncSqlRow* row = gnc_sql_result_get_first_row( result );
350 while ( row != NULL )
352 b = load_single_budget( be, row );
355 list = g_list_prepend( list, b );
357 row = gnc_sql_result_get_next_row( result );
359 gnc_sql_result_dispose( result );
376 g_return_if_fail( be != NULL );
387 (void)
gnc_sql_create_table( be, AMOUNTS_TABLE, AMOUNTS_TABLE_VERSION, budget_amounts_col_table );
401 g_return_val_if_fail( be != NULL, FALSE );
402 g_return_val_if_fail( inst != NULL, FALSE );
403 g_return_val_if_fail( GNC_IS_BUDGET(inst), FALSE );
405 is_infant = qof_instance_get_infant( inst );
426 is_ok = save_budget_amounts( be, pBudget );
429 is_ok = gnc_sql_recurrence_save( be, guid, gnc_budget_get_recurrence( pBudget ) );
438 is_ok = delete_budget_amounts( be, pBudget );
441 is_ok = gnc_sql_recurrence_delete( be, guid );
460 s->is_ok = save_budget( s->be, inst );
469 g_return_val_if_fail( be != NULL, FALSE );
489 g_return_if_fail( be != NULL );
490 g_return_if_fail( row != NULL );
491 g_return_if_fail( pObject != NULL );
492 g_return_if_fail( table_row != NULL );
494 val = gnc_sql_row_get_value_at_col_name( row, table_row->
col_name );
495 if ( val != NULL && G_VALUE_HOLDS_STRING( val ) && g_value_get_string( val ) != NULL )
498 budget = gnc_budget_lookup( &guid, be->
book );
499 if ( budget != NULL )
503 qof_instance_increase_editlevel (pObject);
505 qof_instance_decrease_editlevel (pObject);
509 g_return_if_fail( setter != NULL );
510 (*setter)( pObject, (
const gpointer)budget );
515 PWARN(
"Budget ref '%s' not found", g_value_get_string( val ) );
521 = { load_budget_guid,
528 gnc_sql_init_budget_handler(
void )
532 GNC_SQL_BACKEND_VERSION,
536 create_budget_tables,
gboolean qof_object_register_backend(QofIdTypeConst type_name, const char *backend_name, gpointer be_data)
const GncGUID * qof_instance_get_guid(gconstpointer)
gint gnc_sql_get_table_version(const GncSqlBackend *be, const gchar *table_name)
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
void gnc_sql_add_colname_to_list(const GncSqlColumnTableEntry *table_row, GList **pList)
load and save accounts data to SQL
GncSqlStatement * gnc_sql_create_select_statement(GncSqlBackend *be, const gchar *table_name)
GncBudget * gnc_budget_new(QofBook *book)
gboolean qof_instance_get_destroying(gconstpointer ptr)
gboolean string_to_guid(const gchar *string, GncGUID *guid)
gint gnc_sql_execute_nonselect_sql(GncSqlBackend *be, const gchar *sql)
gboolean gnc_sql_create_table(GncSqlBackend *be, const gchar *table_name, gint table_version, const GncSqlColumnTableEntry *col_table)
load and save data to SQL
void gnc_sql_register_col_type_handler(const gchar *colType, const GncSqlColumnTypeHandler *handler)
void gnc_sql_add_objectref_guid_col_info_to_list(const GncSqlBackend *be, const GncSqlColumnTableEntry *table_row, GList **pList)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
void qof_collection_foreach(const QofCollection *, QofInstanceForeachCB, gpointer user_data)
#define PWARN(format, args...)
const GncGUID * gnc_sql_load_guid(const GncSqlBackend *be, GncSqlRow *row)
load and save accounts data to SQL
void gnc_sql_add_gvalue_objectref_guid_to_slist(const GncSqlBackend *be, QofIdTypeConst obj_name, const gpointer pObject, const GncSqlColumnTableEntry *table_row, GSList **pList)
#define GUID_ENCODING_LENGTH
void gnc_sql_slots_load_for_list(GncSqlBackend *be, GList *list)
GncSqlResult * gnc_sql_execute_select_statement(GncSqlBackend *be, GncSqlStatement *stmt)
void gnc_sql_load_object(const GncSqlBackend *be, GncSqlRow *row, QofIdTypeConst obj_name, gpointer pObject, const GncSqlColumnTableEntry *table)
const gchar * gobj_param_name
void(* QofInstanceForeachCB)(QofInstance *, gpointer user_data)
GList * gnc_account_get_descendants(const Account *account)
gboolean gnc_sql_slots_delete(GncSqlBackend *be, const GncGUID *guid)
void(* QofSetterFunc)(gpointer, gpointer)
gboolean gnc_sql_do_db_operation(GncSqlBackend *be, E_DB_OPERATION op, const gchar *table_name, QofIdTypeConst obj_name, gpointer pObject, const GncSqlColumnTableEntry *table)
QofCollection * qof_book_get_collection(const QofBook *, QofIdType)
GncSqlStatement * gnc_sql_create_statement_from_sql(GncSqlBackend *be, const gchar *sql)
load and save data to SQL
gboolean gnc_sql_slots_save(GncSqlBackend *be, const GncGUID *guid, gboolean is_infant, KvpFrame *pFrame)
const gchar * QofLogModule