From 45203aec4b1ddd8e84f3ea91df99f2e54543fbf5 Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Sun, 28 Feb 2010 23:19:34 +0000 Subject: [PATCH] More conversion to read/write objects from sql backend using gobject parameters git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@18766 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/backend/sql/gnc-account-sql.c | 2 +- src/backend/sql/gnc-backend-sql.c | 19 +-- src/backend/sql/gnc-price-sql.c | 2 +- src/backend/sql/gnc-schedxaction-sql.c | 82 +------------ src/backend/sql/gnc-transaction-sql.c | 4 +- src/engine/Account.c | 2 - src/engine/SchedXaction.c | 108 +++++++++++++++++- src/engine/Split.c | 41 ++++++- src/engine/gnc-pricedb.c | 20 +++- src/report/report-system/report-utilities.scm | 8 +- 10 files changed, 192 insertions(+), 96 deletions(-) diff --git a/src/backend/sql/gnc-account-sql.c b/src/backend/sql/gnc-account-sql.c index 8eed6c201c..3b9d24c6c5 100644 --- a/src/backend/sql/gnc-account-sql.c +++ b/src/backend/sql/gnc-account-sql.c @@ -66,7 +66,7 @@ static const GncSqlColumnTableEntry col_table[] = { "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" }, { "name", CT_STRING, ACCOUNT_MAX_NAME_LEN, COL_NNUL, "name" }, { "account_type", CT_STRING, ACCOUNT_MAX_TYPE_LEN, COL_NNUL, NULL, ACCOUNT_TYPE_ }, - { "commodity_guid", CT_COMMODITYREF, 0, 0, "commodity" }, + { "commodity_guid", CT_COMMODITYREF, 0, 0, "commodity" }, { "commodity_scu", CT_INT, 0, COL_NNUL, "commodity-scu" }, { "non_std_scu", CT_BOOLEAN, 0, COL_NNUL, "non-std-scu" }, { "parent_guid", CT_GUID, 0, 0, NULL, NULL, diff --git a/src/backend/sql/gnc-backend-sql.c b/src/backend/sql/gnc-backend-sql.c index edce1c7869..eb18e2c8df 100644 --- a/src/backend/sql/gnc-backend-sql.c +++ b/src/backend/sql/gnc-backend-sql.c @@ -1805,11 +1805,9 @@ load_numeric( const GncSqlBackend* be, GncSqlRow* row, gint64 num, denom; gnc_numeric n; gboolean isNull = FALSE; - NumericSetterFunc n_setter = (NumericSetterFunc)setter; g_return_if_fail( be != NULL ); g_return_if_fail( row != NULL ); - g_return_if_fail( setter != NULL ); g_return_if_fail( pObject != NULL ); g_return_if_fail( table_row != NULL ); @@ -1833,7 +1831,12 @@ load_numeric( const GncSqlBackend* be, GncSqlRow* row, } n = gnc_numeric_create( num, denom ); if( !isNull ) { - (*n_setter)( pObject, n ); + if( table_row->gobj_param_name != NULL ) { + g_object_set( pObject, table_row->gobj_param_name, &n, NULL ); + } else { + NumericSetterFunc n_setter = (NumericSetterFunc)setter; + (*n_setter)( pObject, n ); + } } } @@ -1882,16 +1885,18 @@ add_gvalue_numeric_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name, g_return_if_fail( pObject != NULL ); g_return_if_fail( table_row != NULL ); -// if( table_row->gobj_param_name != NULL ) { -// g_object_get( pObject, table_row->gobj_param_name, &s, NULL ); -// } else { + if( table_row->gobj_param_name != NULL ) { + gnc_numeric *s; + g_object_get( pObject, table_row->gobj_param_name, &s, NULL ); + n = *s; + } else { getter = (NumericGetterFunc)gnc_sql_get_getter( obj_name, table_row ); if( getter != NULL ) { n = (*getter)( pObject ); } else { n = gnc_numeric_zero(); } -// } + } num_value = g_new0( GValue, 1 ); g_assert( num_value != NULL ); diff --git a/src/backend/sql/gnc-price-sql.c b/src/backend/sql/gnc-price-sql.c index 814c0bf955..6196c17480 100644 --- a/src/backend/sql/gnc-price-sql.c +++ b/src/backend/sql/gnc-price-sql.c @@ -60,7 +60,7 @@ static const GncSqlColumnTableEntry col_table[] = { "date", CT_TIMESPEC, 0, COL_NNUL, NULL, PRICE_DATE }, { "source", CT_STRING, PRICE_MAX_SOURCE_LEN, 0, "source" }, { "type", CT_STRING, PRICE_MAX_TYPE_LEN, 0, "type" }, - { "value", CT_NUMERIC, 0, COL_NNUL, NULL, PRICE_VALUE }, + { "value", CT_NUMERIC, 0, COL_NNUL, "value" }, { NULL } /*@ +full_init_block @*/ }; diff --git a/src/backend/sql/gnc-schedxaction-sql.c b/src/backend/sql/gnc-schedxaction-sql.c index 78f0bf4465..927b954871 100644 --- a/src/backend/sql/gnc-schedxaction-sql.c +++ b/src/backend/sql/gnc-schedxaction-sql.c @@ -55,10 +55,6 @@ #define SX_MAX_NAME_LEN 2048 -static gboolean get_autocreate( gpointer pObject ); -static void set_autocreate( gpointer pObject, gboolean value ); -static gboolean get_autonotify( gpointer pObject ); -static void set_autonotify( gpointer pObject, gboolean value ); static gint get_instance_count( gpointer pObject ); static /*@ null @*/ gpointer get_template_act_guid( gpointer pObject ); static void set_template_act_guid( gpointer pObject, /*@ null @*/ gpointer pValue ); @@ -74,18 +70,12 @@ static const GncSqlColumnTableEntry col_table[] = { "end_date", CT_GDATE, 0, 0, NULL, NULL, (QofAccessFunc)xaccSchedXactionGetEndDate, (QofSetterFunc)xaccSchedXactionSetEndDate }, { "last_occur", CT_GDATE, 0, 0, NULL, GNC_SX_LAST_DATE }, - { "num_occur", CT_INT, 0, COL_NNUL, NULL, GNC_SX_NUM_OCCUR }, - { "rem_occur", CT_INT, 0, COL_NNUL, NULL, GNC_SX_REM_OCCUR }, - { "auto_create", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL, - (QofAccessFunc)get_autocreate, (QofSetterFunc)set_autocreate }, - { "auto_notify", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL, - (QofAccessFunc)get_autonotify, (QofSetterFunc)set_autonotify }, - { "adv_creation", CT_INT, 0, COL_NNUL, NULL, NULL, - (QofAccessFunc)xaccSchedXactionGetAdvanceCreation, - (QofSetterFunc)xaccSchedXactionSetAdvanceCreation }, - { "adv_notify", CT_INT, 0, COL_NNUL, NULL, NULL, - (QofAccessFunc)xaccSchedXactionGetAdvanceReminder, - (QofSetterFunc)xaccSchedXactionSetAdvanceReminder }, + { "num_occur", CT_INT, 0, COL_NNUL, "num-occurance" }, + { "rem_occur", CT_INT, 0, COL_NNUL, "rem-occurance" }, + { "auto_create", CT_BOOLEAN, 0, COL_NNUL, "auto-create" }, + { "auto_notify", CT_BOOLEAN, 0, COL_NNUL, "auto-create-notify" }, + { "adv_creation", CT_INT, 0, COL_NNUL, "advance-creation-days" }, + { "adv_notify", CT_INT, 0, COL_NNUL, "advance-reminder-days" }, { "instance_count", CT_INT, 0, COL_NNUL, NULL, NULL, (QofAccessFunc)get_instance_count, (QofSetterFunc)gnc_sx_set_instance_count }, { "template_act_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, @@ -96,66 +86,6 @@ static const GncSqlColumnTableEntry col_table[] = /* ================================================================= */ -static gboolean -get_autocreate( gpointer pObject ) -{ - const SchedXaction* pSx; - gboolean autoCreate; - gboolean autoNotify; - - g_return_val_if_fail( pObject != NULL, FALSE ); - g_return_val_if_fail( GNC_IS_SX(pObject), FALSE ); - - pSx = GNC_SX(pObject); - xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &autoNotify ); - return autoCreate; -} - -static void -set_autocreate( gpointer pObject, gboolean value ) -{ - SchedXaction* pSx; - gboolean autoNotify; - gboolean dummy; - - g_return_if_fail( pObject != NULL ); - g_return_if_fail( GNC_IS_SX(pObject) ); - - pSx = GNC_SX(pObject); - xaccSchedXactionGetAutoCreate( pSx, &dummy, &autoNotify ); - xaccSchedXactionSetAutoCreate( pSx, value, autoNotify ); -} - -static gboolean -get_autonotify( gpointer pObject ) -{ - const SchedXaction* pSx; - gboolean autoCreate; - gboolean autoNotify; - - g_return_val_if_fail( pObject != NULL, FALSE ); - g_return_val_if_fail( GNC_IS_SX(pObject), FALSE ); - - pSx = GNC_SX(pObject); - xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &autoNotify ); - return autoNotify; -} - -static void -set_autonotify( gpointer pObject, gboolean value ) -{ - SchedXaction* pSx; - gboolean autoCreate; - gboolean dummy; - - g_return_if_fail( pObject != NULL ); - g_return_if_fail( GNC_IS_SX(pObject) ); - - pSx = GNC_SX(pObject); - xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &dummy ); - xaccSchedXactionSetAutoCreate( pSx, autoCreate, value ); -} - static gint get_instance_count( gpointer pObject ) { diff --git a/src/backend/sql/gnc-transaction-sql.c b/src/backend/sql/gnc-transaction-sql.c index 8673c95dfc..81aaacf452 100644 --- a/src/backend/sql/gnc-transaction-sql.c +++ b/src/backend/sql/gnc-transaction-sql.c @@ -108,8 +108,8 @@ static const GncSqlColumnTableEntry split_col_table[] = (QofAccessFunc)get_split_reconcile_state, set_split_reconcile_state }, { "reconcile_date", CT_TIMESPEC, 0, 0, NULL, NULL, (QofAccessFunc)xaccSplitRetDateReconciledTS, (QofSetterFunc)set_split_reconcile_date }, - { "value", CT_NUMERIC, 0, COL_NNUL, NULL, SPLIT_VALUE }, - { "quantity", CT_NUMERIC, 0, COL_NNUL, NULL, SPLIT_AMOUNT }, + { "value", CT_NUMERIC, 0, COL_NNUL, "value" }, + { "quantity", CT_NUMERIC, 0, COL_NNUL, "amount" }, { "lot_guid", CT_LOTREF, 0, 0, NULL, NULL, (QofAccessFunc)xaccSplitGetLot, set_split_lot }, { NULL } diff --git a/src/engine/Account.c b/src/engine/Account.c index 3348c136fb..b6282b1b39 100644 --- a/src/engine/Account.c +++ b/src/engine/Account.c @@ -461,8 +461,6 @@ gnc_account_set_property (GObject *object, } } - - static void gnc_account_class_init (AccountClass *klass) { diff --git a/src/engine/SchedXaction.c b/src/engine/SchedXaction.c index 77c8e42620..6b4e413777 100644 --- a/src/engine/SchedXaction.c +++ b/src/engine/SchedXaction.c @@ -46,7 +46,13 @@ void sxprivtransactionListMapDelete( gpointer data, gpointer user_data ); enum { PROP_0, - PROP_NAME + PROP_NAME, + PROP_NUM_OCCURANCE, + PROP_REM_OCCURANCE, + PROP_AUTO_CREATE, + PROP_AUTO_CREATE_NOTIFY, + PROP_ADVANCE_CREATION_DAYS, + PROP_ADVANCE_REMINDER_DAYS }; /* GObject initialization */ @@ -98,6 +104,24 @@ gnc_schedxaction_get_property (GObject *object, case PROP_NAME: g_value_set_string(value, sx->name); break; + case PROP_NUM_OCCURANCE: + g_value_set_int(value, sx->num_occurances_total); + break; + case PROP_REM_OCCURANCE: + g_value_set_int(value, sx->num_occurances_remain); + break; + case PROP_AUTO_CREATE: + g_value_set_boolean(value, sx->autoCreateOption); + break; + case PROP_AUTO_CREATE_NOTIFY: + g_value_set_boolean(value, sx->autoCreateNotify); + break; + case PROP_ADVANCE_CREATION_DAYS: + g_value_set_int(value, sx->advanceCreateDays); + break; + case PROP_ADVANCE_REMINDER_DAYS: + g_value_set_int(value, sx->advanceRemindDays); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -119,6 +143,24 @@ gnc_schedxaction_set_property (GObject *object, case PROP_NAME: xaccSchedXactionSetName(sx, g_value_get_string(value)); break; + case PROP_NUM_OCCURANCE: + xaccSchedXactionSetNumOccur(sx, g_value_get_int(value)); + break; + case PROP_REM_OCCURANCE: + xaccSchedXactionSetRemOccur(sx, g_value_get_int(value)); + break; + case PROP_AUTO_CREATE: + xaccSchedXactionSetAutoCreate(sx, g_value_get_boolean(value), sx->autoCreateNotify); + break; + case PROP_AUTO_CREATE_NOTIFY: + xaccSchedXactionSetAutoCreate(sx, sx->autoCreateOption, g_value_get_boolean(value)); + break; + case PROP_ADVANCE_CREATION_DAYS: + xaccSchedXactionSetAdvanceCreation(sx, g_value_get_int(value)); + break; + case PROP_ADVANCE_REMINDER_DAYS: + xaccSchedXactionSetAdvanceReminder(sx, g_value_get_int(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -146,6 +188,70 @@ gnc_schedxaction_class_init (SchedXactionClass *klass) "that is displayed by the GUI.", NULL, G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_NUM_OCCURANCE, + g_param_spec_int ("num-occurance", + "Number of occurances", + "Total number of occurances for this scheduled transaction.", + 0, + G_MAXINT16, + 1, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_REM_OCCURANCE, + g_param_spec_int ("rem-occurance", + "Number of occurances remaining", + "Remaining number of occurances for this scheduled transaction.", + 0, + G_MAXINT16, + 1, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_AUTO_CREATE, + g_param_spec_boolean ("auto-create", + "Auto-create", + "TRUE if the transaction will be automatically " + "created when its time comes.", + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_AUTO_CREATE_NOTIFY, + g_param_spec_boolean ("auto-create-notify", + "Auto-create-notify", + "TRUE if the the user will be notified when the transaction " + "is automatically created.", + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_ADVANCE_CREATION_DAYS, + g_param_spec_int ("advance-creation-days", + "Days in advance to create", + "Number of days in advance to create this scheduled transaction.", + 0, + G_MAXINT16, + 0, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_ADVANCE_REMINDER_DAYS, + g_param_spec_int ("advance-reminder-days", + "Days in advance to remind", + "Number of days in advance to remind about this scheduled transaction.", + 0, + G_MAXINT16, + 0, + G_PARAM_READWRITE)); } static void diff --git a/src/engine/Split.c b/src/engine/Split.c index c87b79bae5..9741b55c59 100644 --- a/src/engine/Split.c +++ b/src/engine/Split.c @@ -62,7 +62,9 @@ static QofLogModule log_module = GNC_MOD_ENGINE; enum { PROP_0, PROP_ACTION, - PROP_MEMO + PROP_MEMO, + PROP_VALUE, + PROP_AMOUNT }; /* GObject Initialization */ @@ -124,6 +126,12 @@ gnc_split_get_property(GObject *object, case PROP_MEMO: g_value_set_string(value, split->memo); break; + case PROP_VALUE: + g_value_set_boxed(value, &split->value); + break; + case PROP_AMOUNT: + g_value_set_boxed(value, &split->amount); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -137,6 +145,7 @@ gnc_split_set_property(GObject *object, GParamSpec *pspec) { Split *split; + gnc_numeric* number; g_return_if_fail(GNC_IS_SPLIT(object)); @@ -148,6 +157,14 @@ gnc_split_set_property(GObject *object, case PROP_MEMO: xaccSplitSetMemo(split, g_value_get_string(value)); break; + case PROP_VALUE: + number = g_value_get_boxed(value); + xaccSplitSetValue(split, *number); + break; + case PROP_AMOUNT: + number = g_value_get_boxed(value); + xaccSplitSetAmount(split, *number); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -187,6 +204,28 @@ gnc_split_class_init(SplitClass* klass) "this split.", NULL, G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_VALUE, + g_param_spec_boxed("value", + "Split Value", + "The value for this split in the common currency. " + "The value and the amount provide enough information to " + "calculate a conversion rate.", + GNC_TYPE_NUMERIC, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_AMOUNT, + g_param_spec_boxed("amount", + "Split Amount", + "The value for this split in the currency of its account. " + "The value and the amount provide enough information to " + "calculate a conversion rate.", + GNC_TYPE_NUMERIC, + G_PARAM_READWRITE)); } /********************************************************************\ diff --git a/src/engine/gnc-pricedb.c b/src/engine/gnc-pricedb.c index 7816ff01d8..72dc328d03 100644 --- a/src/engine/gnc-pricedb.c +++ b/src/engine/gnc-pricedb.c @@ -38,7 +38,8 @@ static gboolean remove_price(GNCPriceDB *db, GNCPrice *p, gboolean cleanup); enum { PROP_0, PROP_SOURCE, - PROP_TYPE + PROP_TYPE, + PROP_VALUE }; /* GObject Initialization */ @@ -80,6 +81,9 @@ gnc_price_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec case PROP_TYPE: g_value_set_string(value, price->type); break; + case PROP_VALUE: + g_value_set_boxed(value, &price->value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -90,6 +94,7 @@ static void gnc_price_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { GNCPrice* price; + gnc_numeric* number; g_return_if_fail(GNC_IS_PRICE(object)); @@ -101,6 +106,10 @@ gnc_price_set_property(GObject* object, guint prop_id, const GValue* value, GPar case PROP_TYPE: gnc_price_set_typestr(price, g_value_get_string(value)); break; + case PROP_VALUE: + number = g_value_get_boxed(value); + gnc_price_set_value(price, *number); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -139,6 +148,15 @@ gnc_price_class_init(GNCPriceClass *klass) "are 'bid', 'ask', 'last', 'nav' and 'unknown'.", NULL, G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_VALUE, + g_param_spec_boxed("value", + "Value", + "The value of the price quote.", + GNC_TYPE_NUMERIC, + G_PARAM_READWRITE)); } /* ==================================================================== */ diff --git a/src/report/report-system/report-utilities.scm b/src/report/report-system/report-utilities.scm index 9a60c7d50f..26c8a23a9d 100644 --- a/src/report/report-system/report-utilities.scm +++ b/src/report/report-system/report-utilities.scm @@ -1048,11 +1048,11 @@ account-balances) total)) -;; Adds "file://" to the beginning of a URL if it doesn't already exist +;; Adds "file:///" to the beginning of a URL if it doesn't already exist ;; ;; @param url URL -;; @return URL with "file://" as the URL type if it isn't already there +;; @return URL with "file:///" as the URL type if it isn't already there (define (make-file-url url) - (if (string-prefix? "file://" url) + (if (string-prefix? "file:///" url) url - (string-append "file://" url))) + (string-append "file:///" url)))