gint64 qof_book_get_counter (QofBook *book, const char *counter_name) { QofBackend *be; KvpFrame *kvp; KvpValue *value; gint64 counter; if (!book) { PWARN ("No book!!!"); return -1; } if (!counter_name || *counter_name == '\0') { PWARN ("Invalid counter name."); return -1; } /* If we've got a backend with a counter method, call it */ be = book->backend; if (be && be->counter) return ((be->counter)(be, counter_name)); /* If not, then use the KVP in the book */ kvp = qof_book_get_slots (book); if (!kvp) { PWARN ("Book has no KVP_Frame"); return -1; } value = kvp_frame_get_slot_path (kvp, "counters", counter_name, NULL); if (value) { /* found it */ counter = kvp_value_get_gint64 (value); } else { /* New counter */ counter = 0; } /* Counter is now valid; increment it */ counter++; /* Save off the new counter */ qof_book_begin_edit(book); value = kvp_value_new_gint64 (counter); kvp_frame_set_slot_path (kvp, value, "counters", counter_name, NULL); kvp_value_delete (value); qof_book_mark_dirty(book); qof_book_commit_edit(book); /* and return the value */ return counter; }
/* Return the string entry for transfer column when template */ const char * gnc_tree_util_split_reg_template_get_transfer_entry (Split *split) { static char *name = NULL; kvp_frame *kvpf; if (!split) return NULL; kvpf = xaccSplitGetSlots (split); g_free (name); if (kvpf) { Account *account; GncGUID *guid; guid = kvp_value_get_guid( kvp_frame_get_slot_path (kvpf, "sched-xaction", "account", NULL)); account = xaccAccountLookup (guid, gnc_get_current_book ()); name = account ? gnc_get_account_name_for_register (account) : NULL; } else name = NULL; return name; }
const char * gnc_tree_util_split_reg_template_get_fcred_entry (Split *split) { kvp_frame *kvpf = xaccSplitGetSlots (split); return kvp_value_get_string( kvp_frame_get_slot_path (kvpf, "sched-xaction", "credit-formula", NULL)); }
static gboolean _get_template_split_account(GncSxInstance *instance, Split *template_split, Account **split_acct, GList **creation_errors) { GncGUID *acct_guid; kvp_frame *split_kvpf; kvp_value *kvp_val; split_kvpf = xaccSplitGetSlots(template_split); /* contains the guid of the split's actual account. */ kvp_val = kvp_frame_get_slot_path(split_kvpf, GNC_SX_ID, GNC_SX_ACCOUNT, NULL); if (kvp_val == NULL) { GString *err = g_string_new(""); g_string_printf(err, "Null account kvp value for SX [%s], cancelling creation.", xaccSchedXactionGetName(instance->parent->sx)); g_critical("%s", err->str); if (creation_errors != NULL) *creation_errors = g_list_append(*creation_errors, err); else g_string_free(err, TRUE); return FALSE; } acct_guid = kvp_value_get_guid( kvp_val ); *split_acct = xaccAccountLookup(acct_guid, gnc_get_current_book()); if (*split_acct == NULL) { char guid_str[GUID_ENCODING_LENGTH+1]; GString *err; guid_to_string_buff((const GncGUID*)acct_guid, guid_str); err = g_string_new(""); g_string_printf(err, "Unknown account for guid [%s], cancelling SX [%s] creation.", guid_str, xaccSchedXactionGetName(instance->parent->sx)); g_critical("%s", err->str); if (creation_errors != NULL) *creation_errors = g_list_append(*creation_errors, err); else g_string_free(err, TRUE); return FALSE; } return TRUE; }
/* Determine whether this book uses trading accounts */ gboolean qof_book_use_trading_accounts (const QofBook *book) { const char *opt; kvp_value *kvp_val; kvp_val = kvp_frame_get_slot_path (qof_book_get_slots (book), KVP_OPTION_PATH, OPTION_SECTION_ACCOUNTS, OPTION_NAME_TRADING_ACCOUNTS, NULL); if (kvp_val == NULL) return FALSE; opt = kvp_value_get_string (kvp_val); if (opt && opt[0] == 't' && opt[1] == 0) return TRUE; return FALSE; }
static void _get_sx_formula_value(GncSxInstance *instance, Split *template_split, gnc_numeric *numeric, GList **creation_errors, const char *formula_key) { kvp_frame *split_kvpf; kvp_value *kvp_val; char *formula_str, *parseErrorLoc; split_kvpf = xaccSplitGetSlots(template_split); kvp_val = kvp_frame_get_slot_path(split_kvpf, GNC_SX_ID, formula_key, NULL); formula_str = kvp_value_get_string(kvp_val); if (formula_str != NULL && strlen(formula_str) != 0) { GHashTable *parser_vars = gnc_sx_instance_get_variables_for_parser(instance->variable_bindings); if (!gnc_exp_parser_parse_separate_vars(formula_str, numeric, &parseErrorLoc, parser_vars)) { GString *err = g_string_new(""); g_string_printf(err, "Error parsing SX [%s] key [%s]=formula [%s] at [%s]: %s", xaccSchedXactionGetName(instance->parent->sx), formula_key, formula_str, parseErrorLoc, gnc_exp_parser_error_string()); g_critical("%s", err->str); if (creation_errors != NULL) *creation_errors = g_list_append(*creation_errors, err); else g_string_free(err, TRUE); } if (parser_vars != NULL) { g_hash_table_destroy(parser_vars); } } }
static gint _get_vars_helper(Transaction *txn, void *var_hash_data) { GHashTable *var_hash = (GHashTable*)var_hash_data; GList *split_list; kvp_frame *kvpf; kvp_value *kvp_val; Split *s; char *str; gnc_commodity *first_cmdty = NULL; split_list = xaccTransGetSplitList(txn); if (split_list == NULL) { return 1; } for ( ; split_list; split_list = split_list->next) { gnc_commodity *split_cmdty = NULL; GncGUID *acct_guid; Account *acct; s = (Split*)split_list->data; kvpf = xaccSplitGetSlots(s); kvp_val = kvp_frame_get_slot_path(kvpf, GNC_SX_ID, GNC_SX_ACCOUNT, NULL); acct_guid = kvp_value_get_guid(kvp_val); acct = xaccAccountLookup(acct_guid, gnc_get_current_book()); split_cmdty = xaccAccountGetCommodity(acct); if (first_cmdty == NULL) { first_cmdty = split_cmdty; } if (! gnc_commodity_equal(split_cmdty, first_cmdty)) { GncSxVariable *var; GString *var_name; const gchar *split_mnemonic, *first_mnemonic; var_name = g_string_sized_new(16); split_mnemonic = gnc_commodity_get_mnemonic(split_cmdty); first_mnemonic = gnc_commodity_get_mnemonic(first_cmdty); g_string_printf(var_name, "%s -> %s", split_mnemonic ? split_mnemonic : "(null)", first_mnemonic ? first_mnemonic : "(null)"); var = gnc_sx_variable_new(g_strdup(var_name->str)); g_hash_table_insert(var_hash, g_strdup(var->name), var); g_string_free(var_name, TRUE); } // existing... ------------------------------------------ kvp_val = kvp_frame_get_slot_path(kvpf, GNC_SX_ID, GNC_SX_CREDIT_FORMULA, NULL); if (kvp_val != NULL) { str = kvp_value_get_string(kvp_val); if (str && strlen(str) != 0) { gnc_sx_parse_vars_from_formula(str, var_hash, NULL); } } kvp_val = kvp_frame_get_slot_path(kvpf, GNC_SX_ID, GNC_SX_DEBIT_FORMULA, NULL); if (kvp_val != NULL) { str = kvp_value_get_string(kvp_val); if (str && strlen(str) != 0) { gnc_sx_parse_vars_from_formula(str, var_hash, NULL); } } } return 0; }