27 #include "swig-runtime.h"
32 #include "engine-helpers.h"
33 #include "engine-helpers-guile.h"
34 #include "glib-helpers.h"
37 #include "gnc-session.h"
38 #include "guile-mappings.h"
39 #include "gnc-guile-utils.h"
41 #include "qofbookslots.h"
46 #include "qofquery-p.h"
47 #include "qofquerycore-p.h"
49 #define FUNC_NAME G_STRFUNC
54 gnc_transaction_get_date_posted(
const Transaction *t)
62 gnc_transaction_get_date_entered(
const Transaction *t)
70 gnc_split_get_date_reconciled(
const Split *s)
149 const char *num,
const char *action)
154 if (trans && num && !split && !action)
160 if (!trans && !num && split && action)
168 if (!num_action && num)
170 if (num_action && action)
176 if (!num_action && action)
178 if (num_action && num)
187 static GOnce bo_init_once = G_ONCE_INIT;
188 static GHashTable *bo_callback_hash = NULL;
189 static GHookList *bo_final_hook_list = NULL;
192 bo_init (gpointer unused)
194 bo_callback_hash = g_hash_table_new(g_str_hash, g_str_equal);
196 bo_final_hook_list = g_malloc(
sizeof(GHookList));
197 g_hook_list_init(bo_final_hook_list,
sizeof(GHook));
202 bo_call_hook (GHook *hook, gpointer data)
204 ((GFunc)hook->func)(data, hook->data);
210 gnc_book_option_num_field_source_change (gboolean num_action)
212 GHookList *hook_list;
213 const gchar *key = OPTION_NAME_NUM_FIELD_SOURCE;
215 g_once(&bo_init_once, bo_init, NULL);
217 hook_list = g_hash_table_lookup(bo_callback_hash, key);
218 if (hook_list != NULL)
219 g_hook_list_marshal(hook_list, TRUE, bo_call_hook, &num_action);
220 g_hook_list_invoke(bo_final_hook_list, TRUE);
224 gnc_book_option_register_cb (gchar *key, GncBOCb func, gpointer user_data)
226 GHookList *hook_list;
229 g_once(&bo_init_once, bo_init, NULL);
230 hook_list = g_hash_table_lookup(bo_callback_hash, key);
231 if (hook_list == NULL)
233 hook_list = g_malloc(
sizeof(GHookList));
234 g_hook_list_init(hook_list,
sizeof(GHook));
235 g_hash_table_insert(bo_callback_hash, (gpointer)key, hook_list);
238 hook = g_hook_find_func_data(hook_list, TRUE, func, user_data);
244 hook = g_hook_alloc(hook_list);
246 hook->data = user_data;
247 g_hook_append(hook_list, hook);
251 gnc_book_option_remove_cb (gchar *key, GncBOCb func, gpointer user_data)
253 GHookList *hook_list;
256 g_once(&bo_init_once, bo_init, NULL);
257 hook_list = g_hash_table_lookup(bo_callback_hash, key);
258 if (hook_list == NULL)
260 hook = g_hook_find_func_data(hook_list, TRUE, func, user_data);
264 g_hook_destroy_link(hook_list, hook);
265 if (hook_list->hooks == NULL)
267 g_hash_table_remove(bo_callback_hash, key);
278 secs = scm_from_int64(t.tv_sec);
279 nsecs = scm_from_long (t.tv_nsec);
280 return(scm_cons(secs, nsecs));
284 gnc_timepair2timespec(SCM x)
287 if (gnc_timepair_p (x))
289 result.tv_sec = scm_to_int64(SCM_CAR(x));
290 result.tv_nsec = scm_to_long(SCM_CDR(x));
295 GDate gnc_timepair_to_GDate(SCM x)
297 Timespec tspec = gnc_timepair2timespec(x);
302 gnc_timepair_p(SCM x)
304 return(scm_is_pair(x) &&
305 gnc_gh_gint64_p(SCM_CAR(x)) &&
306 gnc_gh_gint64_p(SCM_CDR(x)));
317 return scm_from_utf8_string(
string);
321 gnc_scm2guid(SCM guid_scm)
326 if (!scm_is_string(guid_scm)
331 str = gnc_scm_to_utf8_string (guid_scm);
338 gnc_guid_p(SCM guid_scm)
344 if (!scm_is_string(guid_scm))
351 str = gnc_scm_to_utf8_string (guid_scm);
396 gnc_query_scm2compare (SCM how_scm)
398 return scm_to_int(how_scm);
403 gnc_query_scm2string (SCM how_scm)
405 return scm_to_int(how_scm);
410 gnc_query_scm2date (SCM how_scm)
412 return scm_to_int(how_scm);
417 gnc_query_scm2numericop (SCM how_scm)
419 return scm_to_int(how_scm);
424 gnc_query_scm2guid (SCM how_scm)
426 return scm_to_int(how_scm);
431 gnc_query_scm2char (SCM how_scm)
433 return scm_to_int(how_scm);
437 gnc_scm2acct_match_how (SCM how_scm)
440 gchar *how = gnc_scm_symbol_to_locale_string (how_scm);
442 if (!g_strcmp0 (how,
"acct-match-all"))
444 else if (!g_strcmp0 (how,
"acct-match-any"))
446 else if (!g_strcmp0 (how,
"acct-match-none"))
447 res = QOF_GUID_MATCH_NONE;
450 PINFO (
"invalid account match: %s", how);
451 res = QOF_GUID_MATCH_NULL;
459 gnc_scm2amt_match_how (SCM how_scm)
462 gchar *how = gnc_scm_symbol_to_locale_string (how_scm);
464 if (!g_strcmp0 (how,
"amt-match-atleast"))
465 res = QOF_COMPARE_GTE;
466 else if (!g_strcmp0 (how,
"amt-match-atmost"))
467 res = QOF_COMPARE_LTE;
468 else if (!g_strcmp0 (how,
"amt-match-exactly"))
469 res = QOF_COMPARE_EQUAL;
472 PINFO (
"invalid amount match: %s", how);
473 res = QOF_COMPARE_EQUAL;
481 gnc_scm2kvp_match_how (SCM how_scm)
484 gchar *how = gnc_scm_symbol_to_locale_string (how_scm);
486 if (!g_strcmp0 (how,
"kvp-match-lt"))
487 res = QOF_COMPARE_LT;
488 else if (!g_strcmp0 (how,
"kvp-match-lte"))
489 res = QOF_COMPARE_LTE;
490 else if (!g_strcmp0 (how,
"kvp-match-eq"))
491 res = QOF_COMPARE_EQUAL;
492 else if (!g_strcmp0 (how,
"kvp-match-gte"))
493 res = QOF_COMPARE_GTE;
494 else if (!g_strcmp0 (how,
"kvp-match-gt"))
495 res = QOF_COMPARE_GT;
498 PINFO (
"invalid kvp match: %s", how);
499 res = QOF_COMPARE_EQUAL;
507 gnc_scm2bitfield (SCM field_scm)
511 if (!scm_is_list (field_scm))
514 while (!scm_is_null (field_scm))
519 scm = SCM_CAR (field_scm);
520 field_scm = SCM_CDR (field_scm);
522 bit = scm_to_int(scm);
529 static cleared_match_t
530 gnc_scm2cleared_match_how (SCM how_scm)
532 return gnc_scm2bitfield (how_scm);
536 gnc_scm2balance_match_how (SCM how_scm, gboolean *resp)
540 if (!scm_is_list (how_scm))
543 if (scm_is_null (how_scm))
547 if (!scm_is_null (SCM_CDR (how_scm)))
550 how = gnc_scm_symbol_to_locale_string (SCM_CAR(how_scm));
552 if (!g_strcmp0 (how,
"balance-match-balanced"))
562 gnc_scm2kvp_match_where (SCM where_scm)
567 if (!scm_is_list (where_scm))
570 where = gnc_scm_symbol_to_locale_string (SCM_CAR(where_scm));
572 if (!g_strcmp0 (where,
"kvp-match-split"))
574 else if (!g_strcmp0 (where,
"kvp-match-trans"))
576 else if (!g_strcmp0 (where,
"kvp-match-account"))
577 res = GNC_ID_ACCOUNT;
580 PINFO (
"Unknown kvp-match-where: %s", where);
589 gnc_guid_glist2scm (
const GList *account_guids)
594 for (node = account_guids; node; node = node->next)
599 guids = scm_cons (gnc_guid2scm (*guid), guids);
602 return scm_reverse (guids);
606 gnc_scm2guid_glist (SCM guids_scm)
610 if (!scm_is_list (guids_scm))
613 while (!scm_is_null (guids_scm))
615 SCM guid_scm = SCM_CAR (guids_scm);
618 if (guid_scm != SCM_BOOL_F)
621 *guid = gnc_scm2guid (guid_scm);
624 guids = g_list_prepend (guids, guid);
626 guids_scm = SCM_CDR (guids_scm);
629 return g_list_reverse (guids);
633 gnc_guid_glist_free (GList *guids)
637 for (node = guids; node; node = node->next)
638 guid_free (node->data);
646 return scm_cons (scm_from_int64 (val.num),
647 scm_from_int64 (val.denom));
651 gnc_query_numeric_p (SCM pair)
653 return (scm_is_pair (pair));
657 gnc_query_scm2numeric (SCM pair)
662 num = SCM_CAR (pair);
663 denom = SCM_CDR (pair);
665 return gnc_numeric_create (scm_to_int64 (num),
666 scm_to_int64 (denom));
670 gnc_query_path2scm (
const GSList *path)
672 SCM path_scm = SCM_EOL;
675 for (node = path; node; node = node->next)
677 const char *key = node->data;
680 path_scm = scm_cons (scm_from_utf8_string (key), path_scm);
683 return scm_reverse (path_scm);
687 gnc_query_scm2path (SCM path_scm)
691 if (!scm_is_list (path_scm))
694 while (!scm_is_null (path_scm))
696 SCM key_scm = SCM_CAR (path_scm);
700 if (!scm_is_string (key_scm))
703 key = gnc_scm_to_utf8_string(key_scm);
704 path = g_slist_prepend (path, key);
705 path_scm = SCM_CDR (path_scm);
708 return g_slist_reverse (path);
712 gnc_query_path_free (GSList *path)
716 for (node = path; node; node = node->next)
723 gnc_scm2KvpValueType (SCM value_type_scm)
725 return scm_to_int(value_type_scm);
728 static SCM gnc_kvp_frame2scm (
KvpFrame *frame);
731 gnc_kvp_value2scm (
const KvpValue *value)
733 SCM value_scm = SCM_EOL;
738 if (!value)
return SCM_BOOL_F;
740 value_t = kvp_value_get_type (value);
742 value_scm = scm_cons (scm_from_long (value_t), value_scm);
751 scm = scm_from_double (kvp_value_get_double (value));
756 scm =
string ? scm_from_utf8_string (
string) : SCM_BOOL_F;
764 scm = gnc_timespec2timepair (kvp_value_get_timespec (value));
770 scm = gnc_query_numeric2scm (n);
780 scm = scm_cons (gnc_kvp_value2scm (node->data), scm);
781 scm = scm_reverse (scm);
794 value_scm = scm_cons (scm, value_scm);
796 return scm_reverse (value_scm);
805 kvp_frame_slot2scm (
const char *key,
KvpValue *value, gpointer data)
812 key_scm = key ? scm_from_utf8_string (key) : SCM_BOOL_F;
813 value_scm = gnc_kvp_value2scm (value);
814 pair = scm_cons (key_scm, value_scm);
816 ksd->scm = scm_cons (pair, ksd->scm);
824 if (!frame)
return SCM_BOOL_F;
833 static KvpFrame * gnc_scm2KvpFrame (SCM frame_scm);
836 gnc_scm2KvpValue (SCM value_scm)
843 if (!scm_is_list (value_scm) || scm_is_null (value_scm))
846 type_scm = SCM_CAR (value_scm);
847 value_t = gnc_scm2KvpValueType (type_scm);
849 value_scm = SCM_CDR (value_scm);
850 if (!scm_is_list (value_scm) || scm_is_null (value_scm))
853 val_scm = SCM_CAR (value_scm);
858 value = kvp_value_new_gint64 (scm_to_int64 (val_scm));
862 value = kvp_value_new_double (scm_to_double (val_scm));
868 str = gnc_scm_to_utf8_string (val_scm);
869 value = kvp_value_new_string (str);
876 if (val_scm != SCM_BOOL_F)
878 GncGUID guid = gnc_scm2guid (val_scm);
879 value = kvp_value_new_guid (&guid);
888 Timespec ts = gnc_timepair2timespec (val_scm);
889 value = kvp_value_new_timespec(ts);
895 Timespec ts = gnc_timepair2timespec (val_scm);
904 if (!gnc_query_numeric_p (val_scm))
907 n = gnc_query_scm2numeric (val_scm);
918 for (; scm_is_list (val_scm) && !scm_is_null (val_scm);
919 val_scm = SCM_CDR (val_scm))
921 SCM scm = SCM_CAR (val_scm);
923 list = g_list_prepend (list, gnc_scm2KvpValue (scm));
926 list = g_list_reverse (list);
930 for (node = list; node; node = node->next)
940 frame = gnc_scm2KvpFrame (val_scm);
941 value = kvp_value_new_frame (frame);
953 gnc_scm2KvpFrame (SCM frame_scm)
957 if (!scm_is_list (frame_scm))
return NULL;
961 for (; scm_is_list (frame_scm) && !scm_is_null (frame_scm);
962 frame_scm = SCM_CDR (frame_scm))
964 SCM pair = SCM_CAR (frame_scm);
970 if (!scm_is_pair (pair))
973 key_scm = SCM_CAR (pair);
974 val_scm = SCM_CDR (pair);
976 if (!scm_is_string (key_scm))
979 key = scm_to_utf8_string (key_scm);
982 scm_dynwind_begin (0);
983 scm_dynwind_free (key);
989 value = gnc_scm2KvpValue (val_scm);
1005 gnc_queryterm2scm (
const QofQueryTerm *qt)
1007 SCM qt_scm = SCM_EOL;
1010 qt_scm = scm_cons (gnc_query_path2scm (qof_query_term_get_param_path (qt)),
1012 qt_scm = scm_cons (SCM_BOOL (qof_query_term_is_inverted (qt)), qt_scm);
1014 pd = qof_query_term_get_pred_data (qt);
1015 qt_scm = scm_cons (scm_from_locale_symbol (pd->type_name), qt_scm);
1016 qt_scm = scm_cons (scm_from_long (pd->how), qt_scm);
1018 if (!g_strcmp0 (pd->type_name, QOF_TYPE_STRING))
1022 qt_scm = scm_cons (scm_from_long (pdata->options), qt_scm);
1023 qt_scm = scm_cons (SCM_BOOL (pdata->is_regex), qt_scm);
1024 qt_scm = scm_cons (pdata->matchstring ? scm_from_utf8_string (pdata->matchstring) : SCM_BOOL_F, qt_scm);
1027 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_DATE))
1031 qt_scm = scm_cons (scm_from_long (pdata->options), qt_scm);
1032 qt_scm = scm_cons (gnc_timespec2timepair (pdata->date), qt_scm);
1035 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_NUMERIC))
1039 qt_scm = scm_cons (scm_from_long (pdata->options), qt_scm);
1040 qt_scm = scm_cons (gnc_query_numeric2scm (pdata->amount), qt_scm);
1043 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_GUID))
1047 qt_scm = scm_cons (scm_from_long (pdata->options), qt_scm);
1048 qt_scm = scm_cons (gnc_guid_glist2scm (pdata->guids), qt_scm);
1051 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_INT64))
1055 qt_scm = scm_cons (scm_from_int64 (pdata->val), qt_scm);
1058 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_DOUBLE))
1062 qt_scm = scm_cons (scm_from_double (pdata->val), qt_scm);
1065 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_BOOLEAN))
1069 qt_scm = scm_cons (SCM_BOOL (pdata->val), qt_scm);
1072 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_CHAR))
1076 qt_scm = scm_cons (scm_from_long (pdata->options), qt_scm);
1077 qt_scm = scm_cons (pdata->char_list ? scm_from_utf8_string (pdata->char_list) : SCM_BOOL_F, qt_scm);
1080 else if (!g_strcmp0 (pd->type_name, QOF_TYPE_KVP))
1084 qt_scm = scm_cons (gnc_query_path2scm (pdata->path), qt_scm);
1085 qt_scm = scm_cons (gnc_kvp_value2scm (pdata->value), qt_scm);
1090 PWARN (
"query core type %s not supported", pd->type_name);
1094 return scm_reverse (qt_scm);
1098 gnc_scm2query_term_query_v2 (SCM qt_scm)
1104 GSList *path = NULL;
1105 gboolean inverted = FALSE;
1108 if (!scm_is_list (qt_scm) || scm_is_null (qt_scm))
1114 scm = SCM_CAR (qt_scm);
1115 qt_scm = SCM_CDR (qt_scm);
1116 if (!scm_is_list (scm))
1118 path = gnc_query_scm2path (scm);
1121 scm = SCM_CAR (qt_scm);
1122 qt_scm = SCM_CDR (qt_scm);
1123 if (!scm_is_bool (scm))
1125 inverted = scm_is_true (scm);
1128 scm = SCM_CAR (qt_scm);
1129 qt_scm = SCM_CDR (qt_scm);
1130 if (!scm_is_symbol (scm))
1132 type = gnc_scm_symbol_to_locale_string (scm);
1135 scm = SCM_CAR (qt_scm);
1136 qt_scm = SCM_CDR (qt_scm);
1137 if (scm_is_null (scm))
1139 compare_how = gnc_query_scm2compare (scm);
1143 if (!g_strcmp0 (type, QOF_TYPE_STRING))
1149 scm = SCM_CAR (qt_scm);
1150 qt_scm = SCM_CDR (qt_scm);
1151 if (scm_is_null (scm))
break;
1152 options = gnc_query_scm2string (scm);
1154 scm = SCM_CAR (qt_scm);
1155 qt_scm = SCM_CDR (qt_scm);
1156 if (!scm_is_bool (scm))
break;
1157 is_regex = scm_is_true (scm);
1159 scm = SCM_CAR (qt_scm);
1160 qt_scm = SCM_CDR (qt_scm);
1161 if (!scm_is_string (scm))
break;
1163 matchstring = gnc_scm_to_utf8_string (scm);
1165 pd = qof_query_string_predicate (compare_how, matchstring,
1167 g_free (matchstring);
1169 else if (!g_strcmp0 (type, QOF_TYPE_DATE))
1174 scm = SCM_CAR (qt_scm);
1175 qt_scm = SCM_CDR (qt_scm);
1176 if (scm_is_null (scm))
1178 options = gnc_query_scm2date (scm);
1180 scm = SCM_CAR (qt_scm);
1181 qt_scm = SCM_CDR (qt_scm);
1182 if (scm_is_null (scm))
1184 date = gnc_timepair2timespec (scm);
1186 pd = qof_query_date_predicate (compare_how, options, date);
1189 else if (!g_strcmp0 (type, QOF_TYPE_NUMERIC))
1194 scm = SCM_CAR (qt_scm);
1195 qt_scm = SCM_CDR (qt_scm);
1196 if (scm_is_null (scm))
1198 options = gnc_query_scm2numericop (scm);
1200 scm = SCM_CAR (qt_scm);
1201 qt_scm = SCM_CDR (qt_scm);
1202 if (!gnc_query_numeric_p (scm))
1204 val = gnc_query_scm2numeric (scm);
1206 pd = qof_query_numeric_predicate (compare_how, options, val);
1209 else if (!g_strcmp0 (type, QOF_TYPE_GUID))
1214 scm = SCM_CAR (qt_scm);
1215 qt_scm = SCM_CDR (qt_scm);
1216 if (scm_is_null (scm))
1218 options = gnc_query_scm2guid (scm);
1220 scm = SCM_CAR (qt_scm);
1221 qt_scm = SCM_CDR (qt_scm);
1222 if (!scm_is_list (scm))
1224 guids = gnc_scm2guid_glist (scm);
1226 pd = qof_query_guid_predicate (options, guids);
1228 gnc_guid_glist_free (guids);
1231 else if (!g_strcmp0 (type, QOF_TYPE_INT64))
1235 scm = SCM_CAR (qt_scm);
1236 qt_scm = SCM_CDR (qt_scm);
1237 if (scm_is_null (scm))
1239 val = scm_to_int64 (scm);
1241 pd = qof_query_int64_predicate (compare_how, val);
1244 else if (!g_strcmp0 (type, QOF_TYPE_DOUBLE))
1248 scm = SCM_CAR (qt_scm);
1249 qt_scm = SCM_CDR (qt_scm);
1250 if (!scm_is_number (scm))
1252 val = scm_to_double (scm);
1254 pd = qof_query_double_predicate (compare_how, val);
1257 else if (!g_strcmp0 (type, QOF_TYPE_BOOLEAN))
1261 scm = SCM_CAR (qt_scm);
1262 qt_scm = SCM_CDR (qt_scm);
1263 if (!scm_is_bool (scm))
1265 val = scm_is_true (scm);
1267 pd = qof_query_boolean_predicate (compare_how, val);
1270 else if (!g_strcmp0 (type, QOF_TYPE_CHAR))
1275 scm = SCM_CAR (qt_scm);
1276 qt_scm = SCM_CDR (qt_scm);
1277 if (scm_is_null (scm))
1279 options = gnc_query_scm2char (scm);
1281 scm = SCM_CAR (qt_scm);
1282 qt_scm = SCM_CDR (qt_scm);
1283 if (!scm_is_string (scm))
1285 char_list = gnc_scm_to_utf8_string (scm);
1287 pd = qof_query_char_predicate (options, char_list);
1290 else if (!g_strcmp0 (type, QOF_TYPE_KVP))
1295 scm = SCM_CAR (qt_scm);
1296 qt_scm = SCM_CDR (qt_scm);
1297 if (!scm_is_list (scm))
1299 kvp_path = gnc_query_scm2path (scm);
1301 scm = SCM_CAR (qt_scm);
1302 qt_scm = SCM_CDR (qt_scm);
1303 if (scm_is_null (scm))
1305 gnc_query_path_free (kvp_path);
1308 value = gnc_scm2KvpValue (scm);
1311 gnc_query_path_free (kvp_path);
1317 PWARN (
"query core type %s not supported", type);
1339 gnc_query_path_free (path);
1346 gnc_scm2query_term_query_v1 (SCM query_term_scm)
1348 gboolean ok = FALSE;
1349 gchar * pd_type = NULL;
1350 gchar * pr_type = NULL;
1351 gboolean sense = FALSE;
1355 if (!scm_is_list (query_term_scm) ||
1356 scm_is_null (query_term_scm))
1358 PINFO (
"null term");
1365 scm = SCM_CAR (query_term_scm);
1366 query_term_scm = SCM_CDR (query_term_scm);
1367 pd_type = gnc_scm_symbol_to_locale_string (scm);
1370 if (scm_is_null (query_term_scm))
1372 PINFO (
"null pr_type");
1375 scm = SCM_CAR (query_term_scm);
1376 query_term_scm = SCM_CDR (query_term_scm);
1377 pr_type = gnc_scm_symbol_to_locale_string (scm);
1380 if (scm_is_null (query_term_scm))
1382 PINFO (
"null sense");
1385 scm = SCM_CAR (query_term_scm);
1386 query_term_scm = SCM_CDR (query_term_scm);
1387 sense = scm_is_true (scm);
1389 q = qof_query_create_for(GNC_ID_SPLIT);
1391 if (!g_strcmp0 (pd_type,
"pd-date"))
1399 if (scm_is_null (query_term_scm))
1401 PINFO (
"null use_start");
1405 scm = SCM_CAR (query_term_scm);
1406 query_term_scm = SCM_CDR (query_term_scm);
1407 use_start = scm_is_true (scm);
1410 if (scm_is_null (query_term_scm))
1413 scm = SCM_CAR (query_term_scm);
1414 query_term_scm = SCM_CDR (query_term_scm);
1415 start = gnc_timepair2timespec (scm);
1418 if (scm_is_null (query_term_scm))
1421 scm = SCM_CAR (query_term_scm);
1422 query_term_scm = SCM_CDR (query_term_scm);
1423 use_end = scm_is_true (scm);
1426 if (scm_is_null (query_term_scm))
1429 scm = SCM_CAR (query_term_scm);
1430 query_term_scm = SCM_CDR (query_term_scm);
1431 end = gnc_timepair2timespec (scm);
1433 xaccQueryAddDateMatchTS (q, use_start, start, use_end, end, QOF_QUERY_OR);
1438 else if (!g_strcmp0 (pd_type,
"pd-amount"))
1446 if (scm_is_null (query_term_scm))
1448 scm = SCM_CAR (query_term_scm);
1449 query_term_scm = SCM_CDR (query_term_scm);
1450 how = gnc_scm2amt_match_how (scm);
1453 if (scm_is_null (query_term_scm))
1455 scm = SCM_CAR (query_term_scm);
1456 query_term_scm = SCM_CDR (query_term_scm);
1457 amt_sgn = gnc_query_scm2numericop (scm);
1460 if (scm_is_null (query_term_scm))
1462 scm = SCM_CAR (query_term_scm);
1463 query_term_scm = SCM_CDR (query_term_scm);
1464 amount = scm_to_double (scm);
1469 if (!g_strcmp0 (pr_type,
"pr-price"))
1471 xaccQueryAddSharePriceMatch (q, val, how, QOF_QUERY_OR);
1475 else if (!g_strcmp0 (pr_type,
"pr-shares"))
1477 xaccQueryAddSharesMatch (q, val, how, QOF_QUERY_OR);
1481 else if (!g_strcmp0 (pr_type,
"pr-value"))
1483 xaccQueryAddValueMatch (q, val, amt_sgn, how, QOF_QUERY_OR);
1489 PINFO (
"unknown amount predicate: %s", pr_type);
1493 else if (!g_strcmp0 (pd_type,
"pd-account"))
1496 GList *account_guids;
1499 if (scm_is_null (query_term_scm))
1501 PINFO (
"pd-account: null how");
1505 scm = SCM_CAR (query_term_scm);
1506 query_term_scm = SCM_CDR (query_term_scm);
1507 how = gnc_scm2acct_match_how (scm);
1510 if (scm_is_null (query_term_scm))
1512 PINFO (
"pd-account: null guids");
1516 scm = SCM_CAR (query_term_scm);
1517 query_term_scm = SCM_CDR (query_term_scm);
1519 account_guids = gnc_scm2guid_glist (scm);
1521 xaccQueryAddAccountGUIDMatch (q, account_guids, how, QOF_QUERY_OR);
1523 gnc_guid_glist_free (account_guids);
1528 else if (!g_strcmp0 (pd_type,
"pd-string"))
1531 gboolean use_regexp;
1535 if (scm_is_null (query_term_scm))
1538 scm = SCM_CAR (query_term_scm);
1539 query_term_scm = SCM_CDR (query_term_scm);
1540 case_sens = scm_is_true (scm);
1543 if (scm_is_null (query_term_scm))
1546 scm = SCM_CAR (query_term_scm);
1547 query_term_scm = SCM_CDR (query_term_scm);
1548 use_regexp = scm_is_true (scm);
1551 if (scm_is_null (query_term_scm))
1554 scm = SCM_CAR (query_term_scm);
1555 query_term_scm = SCM_CDR (query_term_scm);
1556 matchstring = gnc_scm_to_utf8_string (scm);
1558 if (!g_strcmp0 (pr_type,
"pr-action"))
1560 xaccQueryAddActionMatch (q, matchstring, case_sens, use_regexp,
1561 QOF_COMPARE_CONTAINS, QOF_QUERY_OR);
1565 else if (!g_strcmp0 (pr_type,
"pr-desc"))
1567 xaccQueryAddDescriptionMatch (q, matchstring, case_sens,
1568 use_regexp, QOF_COMPARE_CONTAINS, QOF_QUERY_OR);
1572 else if (!g_strcmp0 (pr_type,
"pr-memo"))
1574 xaccQueryAddMemoMatch (q, matchstring, case_sens, use_regexp,
1575 QOF_COMPARE_CONTAINS, QOF_QUERY_OR);
1579 else if (!g_strcmp0 (pr_type,
"pr-num"))
1581 xaccQueryAddNumberMatch (q, matchstring, case_sens, use_regexp,
1582 QOF_COMPARE_CONTAINS, QOF_QUERY_OR);
1588 PINFO (
"Unknown string predicate: %s", pr_type);
1590 g_free (matchstring);
1593 else if (!g_strcmp0 (pd_type,
"pd-cleared"))
1595 cleared_match_t how;
1598 if (scm_is_null (query_term_scm))
1601 scm = SCM_CAR (query_term_scm);
1602 query_term_scm = SCM_CDR (query_term_scm);
1603 how = gnc_scm2cleared_match_how (scm);
1605 xaccQueryAddClearedMatch (q, how, QOF_QUERY_OR);
1609 else if (!g_strcmp0 (pd_type,
"pd-balance"))
1614 if (scm_is_null (query_term_scm))
1617 scm = SCM_CAR (query_term_scm);
1618 query_term_scm = SCM_CDR (query_term_scm);
1619 if (gnc_scm2balance_match_how (scm, &how) == FALSE)
1622 xaccQueryAddBalanceMatch (q, how, QOF_QUERY_OR);
1626 else if (!g_strcmp0 (pd_type,
"pd-guid"))
1632 if (scm_is_null (query_term_scm))
1635 scm = SCM_CAR (query_term_scm);
1636 query_term_scm = SCM_CDR (query_term_scm);
1637 guid = gnc_scm2guid (scm);
1640 scm = SCM_CAR (query_term_scm);
1641 query_term_scm = SCM_CDR (query_term_scm);
1642 id_type = (
QofIdType) gnc_scm_to_utf8_string (scm);
1644 xaccQueryAddGUIDMatch (q, &guid, id_type, QOF_QUERY_OR);
1645 g_free ((
void *) id_type);
1649 else if (!g_strcmp0 (pd_type,
"pd-kvp"))
1657 if (scm_is_null (query_term_scm))
1659 scm = SCM_CAR (query_term_scm);
1660 query_term_scm = SCM_CDR (query_term_scm);
1661 how = gnc_scm2kvp_match_how (scm);
1664 if (scm_is_null (query_term_scm))
1666 scm = SCM_CAR (query_term_scm);
1667 query_term_scm = SCM_CDR (query_term_scm);
1668 where = gnc_scm2kvp_match_where (scm);
1671 if (scm_is_null (query_term_scm))
1673 scm = SCM_CAR (query_term_scm);
1674 query_term_scm = SCM_CDR (query_term_scm);
1675 path = gnc_query_scm2path (scm);
1678 if (scm_is_null (query_term_scm))
1680 scm = SCM_CAR (query_term_scm);
1681 query_term_scm = SCM_CDR (query_term_scm);
1682 value = gnc_scm2KvpValue (scm);
1684 xaccQueryAddKVPMatch (q, path, value, how, where, QOF_QUERY_OR);
1686 gnc_query_path_free (path);
1693 PINFO (
"Unknown Predicate: %s", pd_type);
1722 gnc_scm2query_term_query (SCM query_term_scm, query_version_t vers)
1727 return gnc_scm2query_term_query_v1 (query_term_scm);
1729 return gnc_scm2query_term_query_v2 (query_term_scm);
1736 gnc_query_terms2scm (
const GList *terms)
1738 SCM or_terms = SCM_EOL;
1739 const GList *or_node;
1741 for (or_node = terms; or_node; or_node = or_node->next)
1743 SCM and_terms = SCM_EOL;
1746 for (and_node = or_node->data; and_node; and_node = and_node->next)
1748 QofQueryTerm *qt = and_node->data;
1751 qt_scm = gnc_queryterm2scm (qt);
1753 and_terms = scm_cons (qt_scm, and_terms);
1756 and_terms = scm_reverse (and_terms);
1758 or_terms = scm_cons (and_terms, or_terms);
1761 return scm_reverse (or_terms);
1765 gnc_scm2query_and_terms (SCM and_terms, query_version_t vers)
1769 if (!scm_is_list (and_terms))
1772 while (!scm_is_null (and_terms))
1776 term = SCM_CAR (and_terms);
1777 and_terms = SCM_CDR (and_terms);
1780 q = gnc_scm2query_term_query (term, vers);
1786 q_and = gnc_scm2query_term_query (term, vers);
1805 gnc_scm2query_or_terms (SCM or_terms, query_version_t vers)
1809 if (!scm_is_list (or_terms))
1812 q = qof_query_create_for(GNC_ID_SPLIT);
1814 while (!scm_is_null (or_terms))
1818 and_terms = SCM_CAR (or_terms);
1819 or_terms = SCM_CDR (or_terms);
1822 q = gnc_scm2query_and_terms (and_terms, vers);
1828 q_or = gnc_scm2query_and_terms (and_terms, vers);
1847 gnc_query_sort2scm (
const QofQuerySort *qs)
1849 SCM sort_scm = SCM_EOL;
1852 path = qof_query_sort_get_param_path (qs);
1856 sort_scm = scm_cons (gnc_query_path2scm (path), sort_scm);
1857 sort_scm = scm_cons (scm_from_int (qof_query_sort_get_sort_options (qs)), sort_scm);
1858 sort_scm = scm_cons (SCM_BOOL (qof_query_sort_get_increasing (qs)), sort_scm);
1860 return scm_reverse (sort_scm);
1864 gnc_query_scm2sort (SCM sort_scm, GSList **path, gint *options, gboolean *inc)
1871 g_return_val_if_fail (path && options && inc, FALSE);
1872 g_return_val_if_fail (*path == NULL, FALSE);
1875 if (scm_is_bool (sort_scm))
1879 if (!scm_is_list (sort_scm))
1883 val = SCM_CAR (sort_scm);
1884 sort_scm = SCM_CDR (sort_scm);
1885 if (!scm_is_list (val))
1887 p = gnc_query_scm2path (val);
1890 val = SCM_CAR (sort_scm);
1891 sort_scm = SCM_CDR (sort_scm);
1892 if (!scm_is_number (val))
1894 gnc_query_path_free (p);
1897 o = scm_to_int (val);
1900 val = SCM_CAR (sort_scm);
1901 sort_scm = SCM_CDR (sort_scm);
1902 if (!scm_is_bool (val))
1904 gnc_query_path_free (p);
1907 i = scm_is_true (val);
1910 if (!scm_is_null (sort_scm))
1912 gnc_query_path_free (p);
1925 SCM query_scm = SCM_EOL;
1927 QofQuerySort *s1, *s2, *s3;
1929 if (!q)
return SCM_BOOL_F;
1932 pair = scm_cons (gnc_query_terms2scm (qof_query_get_terms (q)), SCM_EOL);
1933 pair = scm_cons (scm_from_locale_symbol (
"terms"), pair);
1934 query_scm = scm_cons (pair, query_scm);
1938 pair = scm_cons (scm_from_locale_symbol (
"search-for"), pair);
1939 query_scm = scm_cons (pair, query_scm);
1942 qof_query_get_sorts (q, &s1, &s2, &s3);
1945 pair = scm_cons (gnc_query_sort2scm (s1), SCM_EOL);
1946 pair = scm_cons (scm_from_locale_symbol (
"primary-sort"), pair);
1947 query_scm = scm_cons (pair, query_scm);
1950 pair = scm_cons (gnc_query_sort2scm (s2), SCM_EOL);
1951 pair = scm_cons (scm_from_locale_symbol (
"secondary-sort"), pair);
1952 query_scm = scm_cons (pair, query_scm);
1955 pair = scm_cons (gnc_query_sort2scm (s3), SCM_EOL);
1956 pair = scm_cons (scm_from_locale_symbol (
"tertiary-sort"), pair);
1957 query_scm = scm_cons (pair, query_scm);
1960 pair = scm_cons (scm_from_int (qof_query_get_max_results (q)), SCM_EOL);
1961 pair = scm_cons (scm_from_locale_symbol (
"max-results"), pair);
1962 query_scm = scm_cons (pair, query_scm);
1965 pair = scm_reverse (query_scm);
1966 return scm_cons (scm_from_locale_symbol (
"query-v2"), pair);
1970 gnc_query_sort_to_list (
const gchar * symbol)
1972 GSList *path = NULL;
1977 if (!g_strcmp0 (symbol,
"by-none"))
1981 else if (!g_strcmp0 (symbol,
"by-standard"))
1986 else if (!g_strcmp0 (symbol,
"by-date") ||
1987 !g_strcmp0 (symbol,
"by-date-rounded"))
1989 path = g_slist_prepend (path, TRANS_DATE_POSTED);
1990 path = g_slist_prepend (path, SPLIT_TRANS);
1993 else if (!g_strcmp0 (symbol,
"by-date-entered") ||
1994 !g_strcmp0 (symbol,
"by-date-entered-rounded"))
1996 path = g_slist_prepend (path, TRANS_DATE_ENTERED);
1997 path = g_slist_prepend (path, SPLIT_TRANS);
2000 else if (!g_strcmp0 (symbol,
"by-date-reconciled") ||
2001 !g_strcmp0 (symbol,
"by-date-reconciled-rounded"))
2003 path = g_slist_prepend (path, SPLIT_DATE_RECONCILED);
2006 else if (!g_strcmp0 (symbol,
"by-num"))
2008 path = g_slist_prepend (path, TRANS_NUM);
2009 path = g_slist_prepend (path, SPLIT_TRANS);
2012 else if (!g_strcmp0 (symbol,
"by-amount"))
2014 path = g_slist_prepend (path, SPLIT_VALUE);
2017 else if (!g_strcmp0 (symbol,
"by-memo"))
2019 path = g_slist_prepend (path, SPLIT_MEMO);
2022 else if (!g_strcmp0 (symbol,
"by-desc"))
2024 path = g_slist_prepend (path, TRANS_DESCRIPTION);
2025 path = g_slist_prepend (path, SPLIT_TRANS);
2028 else if (!g_strcmp0 (symbol,
"by-reconcile"))
2030 path = g_slist_prepend (path, SPLIT_RECONCILE);
2033 else if (!g_strcmp0 (symbol,
"by-account-full-name"))
2035 path = g_slist_prepend (path, SPLIT_ACCT_FULLNAME);
2038 else if (!g_strcmp0 (symbol,
"by-account-code"))
2040 path = g_slist_prepend (path, ACCOUNT_CODE_);
2041 path = g_slist_prepend (path, SPLIT_ACCOUNT);
2044 else if (!g_strcmp0 (symbol,
"by-corr-account-full-name"))
2046 path = g_slist_prepend (path, SPLIT_CORR_ACCT_NAME);
2049 else if (!g_strcmp0 (symbol,
"by-corr-account-code"))
2051 path = g_slist_prepend (path, SPLIT_CORR_ACCT_CODE);
2056 PERR (
"Unknown sort-type, %s", symbol);
2063 gnc_scm2query_v1 (SCM query_scm)
2067 gchar * primary_sort = NULL;
2068 gchar * secondary_sort = NULL;
2069 gchar * tertiary_sort = NULL;
2070 gboolean primary_increasing = TRUE;
2071 gboolean secondary_increasing = TRUE;
2072 gboolean tertiary_increasing = TRUE;
2073 int max_splits = -1;
2075 while (!scm_is_null (query_scm))
2082 pair = SCM_CAR (query_scm);
2083 query_scm = SCM_CDR (query_scm);
2085 if (!scm_is_pair (pair))
2087 PERR (
"Not a Pair");
2092 sym_scm = SCM_CAR (pair);
2093 value = SCM_CADR (pair);
2095 if (!scm_is_symbol (sym_scm))
2097 PERR (
"Not a symbol");
2102 symbol = gnc_scm_symbol_to_locale_string (sym_scm);
2105 PERR (
"No string found");
2110 if (g_strcmp0 (
"terms", symbol) == 0)
2115 q = gnc_scm2query_or_terms (value, gnc_QUERY_v1);
2118 PINFO (
"invalid terms");
2124 else if (g_strcmp0 (
"primary-sort", symbol) == 0)
2126 if (!scm_is_symbol (value))
2128 PINFO (
"Invalid primary sort");
2133 primary_sort = gnc_scm_symbol_to_locale_string (value);
2136 else if (g_strcmp0 (
"secondary-sort", symbol) == 0)
2138 if (!scm_is_symbol (value))
2140 PINFO (
"Invalid secondary sort");
2145 secondary_sort = gnc_scm_symbol_to_locale_string (value);
2148 else if (g_strcmp0 (
"tertiary-sort", symbol) == 0)
2150 if (!scm_is_symbol (value))
2152 PINFO (
"Invalid tertiary sort");
2157 tertiary_sort = gnc_scm_symbol_to_locale_string (value);
2160 else if (g_strcmp0 (
"primary-increasing", symbol) == 0)
2162 primary_increasing = scm_is_true (value);
2165 else if (g_strcmp0 (
"secondary-increasing", symbol) == 0)
2167 secondary_increasing = scm_is_true (value);
2170 else if (g_strcmp0 (
"tertiary-increasing", symbol) == 0)
2172 tertiary_increasing = scm_is_true (value);
2175 else if (g_strcmp0 (
"max-splits", symbol) == 0)
2177 if (!scm_is_number (value))
2179 PERR (
"invalid max-splits");
2184 max_splits = scm_to_int (value);
2189 PERR (
"Unknown symbol: %s", symbol);
2199 GSList *s1, *s2, *s3;
2200 s1 = gnc_query_sort_to_list (primary_sort);
2201 s2 = gnc_query_sort_to_list (secondary_sort);
2202 s3 = gnc_query_sort_to_list (tertiary_sort);
2206 tertiary_increasing);
2215 g_free (primary_sort);
2216 g_free (secondary_sort);
2217 g_free (tertiary_sort);
2223 gnc_scm2query_v2 (SCM query_scm)
2227 gchar * search_for = NULL;
2228 GSList *sp1 = NULL, *sp2 = NULL, *sp3 = NULL;
2229 gint so1 = 0, so2 = 0, so3 = 0;
2230 gboolean si1 = TRUE, si2 = TRUE, si3 = TRUE;
2231 int max_results = -1;
2233 while (!scm_is_null (query_scm))
2240 pair = SCM_CAR (query_scm);
2241 query_scm = SCM_CDR (query_scm);
2243 if (!scm_is_pair (pair))
2249 sym_scm = SCM_CAR (pair);
2250 value = SCM_CADR (pair);
2252 if (!scm_is_symbol (sym_scm))
2258 symbol = gnc_scm_symbol_to_locale_string (sym_scm);
2265 if (!g_strcmp0 (
"terms", symbol))
2270 q = gnc_scm2query_or_terms (value, gnc_QUERY_v2);
2278 else if (!g_strcmp0 (
"search-for", symbol))
2280 if (!scm_is_symbol (value))
2285 search_for = gnc_scm_symbol_to_locale_string (value);
2288 else if (g_strcmp0 (
"primary-sort", symbol) == 0)
2290 if (! gnc_query_scm2sort (value, &sp1, &so1, &si1))
2297 else if (!g_strcmp0 (
"secondary-sort", symbol))
2299 if (! gnc_query_scm2sort (value, &sp2, &so2, &si2))
2306 else if (!g_strcmp0 (
"tertiary-sort", symbol))
2308 if (! gnc_query_scm2sort (value, &sp3, &so3, &si3))
2315 else if (!g_strcmp0 (
"max-results", symbol))
2317 if (!scm_is_number (value))
2323 max_results = scm_to_int (value);
2335 if (ok && search_for)
2339 qof_query_set_sort_options (q, so1, so2, so3);
2349 g_free (search_for);
2355 gnc_scm2query (SCM query_scm)
2362 if (!scm_is_list (query_scm) || scm_is_null (query_scm))
2366 q_type = SCM_CAR (query_scm);
2368 if (!scm_is_symbol (q_type))
2370 if (scm_is_pair (q_type))
2373 return gnc_scm2query_v1 (query_scm);
2382 type = gnc_scm_symbol_to_locale_string (q_type);
2386 if (!g_strcmp0 (type,
"query-v2"))
2387 q = gnc_scm2query_v2 (SCM_CDR (query_scm));
2394 gnc_gh_gint64_p(SCM num)
2396 static int initialized = 0;
2411 maxval = scm_from_int64(tmp);
2415 minval = scm_from_int64(tmp);
2417 scm_gc_protect_object(maxval);
2418 scm_gc_protect_object(minval);
2422 return (scm_is_exact(num) &&
2423 (scm_geq_p(num, minval) != SCM_BOOL_F) &&
2424 (scm_leq_p(num, maxval) != SCM_BOOL_F));
2428 gnc_scm_to_numeric(SCM gncnum)
2430 static SCM get_num = SCM_BOOL_F;
2431 static SCM get_denom = SCM_BOOL_F;
2433 if (get_num == SCM_BOOL_F)
2435 get_num = scm_c_eval_string(
"gnc:gnc-numeric-num");
2437 if (get_denom == SCM_BOOL_F)
2439 get_denom = scm_c_eval_string(
"gnc:gnc-numeric-denom");
2442 return gnc_numeric_create(scm_to_int64(scm_call_1(get_num, gncnum)),
2443 scm_to_int64(scm_call_1(get_denom, gncnum)));
2449 static SCM maker = SCM_BOOL_F;
2451 if (maker == SCM_BOOL_F)
2453 maker = scm_c_eval_string(
"gnc:make-gnc-numeric");
2456 return scm_call_2(maker, scm_from_int64(gnc_numeric_num(arg)),
2457 scm_from_int64(gnc_numeric_denom(arg)));
2461 gnc_numeric_p(SCM arg)
2463 static SCM type_p = SCM_BOOL_F;
2464 SCM ret = SCM_BOOL_F;
2466 if (type_p == SCM_BOOL_F)
2468 type_p = scm_c_eval_string(
"gnc:gnc-numeric?");
2470 ret = scm_call_1(type_p, arg);
2472 if (ret == SCM_BOOL_F)
2484 gnc_generic_to_scm(
const void *cx,
const gchar *type_str)
2486 swig_type_info * stype = NULL;
2487 void *x = (
void*) cx;
2489 if (!x)
return SCM_BOOL_F;
2490 stype = SWIG_TypeQuery(type_str);
2494 PERR(
"Unknown SWIG Type: %s ", type_str);
2498 return SWIG_NewPointerObj(x, stype, 0);
2502 gnc_scm_to_generic(SCM scm,
const gchar *type_str)
2504 swig_type_info * stype = NULL;
2506 stype = SWIG_TypeQuery(type_str);
2509 PERR(
"Unknown SWIG Type: %s ", type_str);
2513 if (!SWIG_IsPointerOfType(scm, stype))
2516 return SWIG_MustGetPtr(scm, stype, 1, 0);
2520 gnc_scm_to_commodity(SCM scm)
2522 return gnc_scm_to_generic(scm,
"_p_gnc_commodity");
2528 return gnc_generic_to_scm(commodity,
"_p_gnc_commodity");
2532 gnc_book_to_scm (
const QofBook *book)
2534 return gnc_generic_to_scm(book,
"_p_QofBook");
void qof_query_add_term(QofQuery *query, QofQueryParamList *param_list, QofQueryPredData *pred_data, QofQueryOp op)
void xaccSplitSetAction(Split *split, const char *actn)
Date and Time handling routines.
QofQueryPredData * qof_query_kvp_predicate(QofQueryCompare how, QofQueryParamList *path, const KvpValue *value)
gnc_numeric double_to_gnc_numeric(double n, gint64 denom, gint how)
#define PINFO(format, args...)
void qof_query_set_sort_order(QofQuery *q, QofQueryParamList *primary_sort_params, QofQueryParamList *secondary_sort_params, QofQueryParamList *tertiary_sort_params)
KvpValueType
possible types in the union KvpValue
void xaccTransGetDateEnteredTS(const Transaction *trans, Timespec *ts)
gboolean string_to_guid(const gchar *string, GncGUID *guid)
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
void xaccTransSetNum(Transaction *trans, const char *xnum)
Use a 64-bit unsigned int timespec.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
void qof_query_set_sort_increasing(QofQuery *q, gboolean prim_inc, gboolean sec_inc, gboolean tert_inc)
const char * xaccTransGetNum(const Transaction *trans)
#define PERR(format, args...)
struct _QofQuery QofQuery
void xaccSplitGetDateReconciledTS(const Split *split, Timespec *ts)
void kvp_frame_delete(KvpFrame *frame)
gint64 kvp_value_get_gint64(const KvpValue *value)
void qof_query_set_max_results(QofQuery *q, int n)
#define PWARN(format, args...)
GDate timespec_to_gdate(Timespec ts)
QofBook * qof_session_get_book(const QofSession *session)
Account handling public routines.
void qof_query_destroy(QofQuery *q)
char * kvp_value_get_string(const KvpValue *value)
GncGUID * guid_malloc(void)
#define GUID_ENCODING_LENGTH
void kvp_frame_set_slot_nc(KvpFrame *frame, const gchar *key, KvpValue *value)
#define kvp_value_new_gnc_numeric
GList * kvp_value_get_glist(const KvpValue *value)
QofQuery * qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op)
GncGUID * kvp_value_get_guid(const KvpValue *value)
QofQuery * qof_query_invert(QofQuery *q)
All type declarations for the whole Gnucash engine.
KvpValue * kvp_value_new_glist(const GList *value)
void kvp_frame_for_each_slot(KvpFrame *f, void(*proc)(const gchar *key, KvpValue *value, gpointer data), gpointer data)
const GncGUID * guid_null(void)
QofIdType qof_query_get_search_for(const QofQuery *q)
struct KvpFrameImpl KvpFrame
#define QUERY_DEFAULT_SORT
KvpFrame * kvp_frame_new(void)
const char * xaccSplitGetAction(const Split *split)
KvpFrame * kvp_value_get_frame(const KvpValue *value)
void kvp_value_delete(KvpValue *value)
QofQuery * qof_query_create(void)
struct KvpValueImpl KvpValue
#define GNC_HOW_DENOM_SIGFIGS(n)
void qof_query_search_for(QofQuery *query, QofIdTypeConst obj_type)
void xaccTransGetDatePostedTS(const Transaction *trans, Timespec *ts)
const gchar * QofLogModule
void xaccTransSetDatePostedTS(Transaction *trans, const Timespec *ts)