From c68bf8adbdf51e41b4d91075ebe2a698d962e925 Mon Sep 17 00:00:00 2001 From: Derek Atkins Date: Wed, 6 Feb 2002 02:39:01 +0000 Subject: [PATCH] Move the query_compare_t (compraritor, or "what kind of comparrison to make") into the Predicate Data, which allows the predicate creation functions to sanity check the validity. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6694 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/engine/QueryCore.c | 93 ++++++++++++++++++++++++------------------ src/engine/QueryCore.h | 22 ++++++---- src/engine/QueryNew.c | 9 ++-- src/engine/QueryNew.h | 3 +- 4 files changed, 71 insertions(+), 56 deletions(-) diff --git a/src/engine/QueryCore.c b/src/engine/QueryCore.c index e843a782c7..a4b77faf16 100644 --- a/src/engine/QueryCore.c +++ b/src/engine/QueryCore.c @@ -123,7 +123,7 @@ static GHashTable *freeTable = NULL; /* QUERYCORE_STRING */ static int string_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { query_string_t pdata = (query_string_t) pd; const char *s; @@ -154,13 +154,13 @@ static int string_match_predicate (gpointer object, QueryAccess get_fcn, } while (FALSE); - switch (how) { + switch (pd->how) { case COMPARE_EQUAL: return ret; case COMPARE_NEQ: return !ret; default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -200,20 +200,23 @@ static QueryPredData_t string_copy_predicate (QueryPredData_t pd) VERIFY_PDATA_R (query_string_type); - return gncQueryStringPredicate (pdata->matchstring, pdata->options, + return gncQueryStringPredicate (pd->how, pdata->matchstring, pdata->options, pdata->is_regex); } -QueryPredData_t gncQueryStringPredicate (char *str, string_match_t options, +QueryPredData_t gncQueryStringPredicate (query_compare_t how, + char *str, string_match_t options, gboolean is_regex) { query_string_t pdata; g_return_val_if_fail (str, NULL); g_return_val_if_fail (*str != '\0', NULL); + g_return_val_if_fail (how == COMPARE_EQUAL || how == COMPARE_NEQ, NULL); pdata = g_new0 (query_string_def, 1); pdata->pd.type_name = query_string_type; + pdata->pd.how = how; pdata->options = options; pdata->matchstring = g_strdup (str); @@ -252,7 +255,7 @@ static int date_compare (Timespec ta, Timespec tb, date_match_t options) } static int date_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { query_date_t pdata = (query_date_t)pd; Timespec objtime; @@ -263,7 +266,7 @@ static int date_match_predicate (gpointer object, QueryAccess get_fcn, objtime = ((query_date_getter)get_fcn) (object); compare = date_compare (objtime, pdata->date, pdata->options); - switch (how) { + switch (pd->how) { case COMPARE_LT: return (compare < 0); case COMPARE_LTE: @@ -277,7 +280,7 @@ static int date_match_predicate (gpointer object, QueryAccess get_fcn, case COMPARE_NEQ: return (compare != 0); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -310,15 +313,17 @@ static QueryPredData_t date_copy_predicate (QueryPredData_t pd) VERIFY_PDATA_R (query_date_type); - return gncQueryDatePredicate (pdata->options, pdata->date); + return gncQueryDatePredicate (pd->how, pdata->options, pdata->date); } -QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date) +QueryPredData_t gncQueryDatePredicate (query_compare_t how, + date_match_t options, Timespec date) { query_date_t pdata; pdata = g_new0 (query_date_def, 1); pdata->pd.type_name = query_date_type; + pdata->pd.how = how; pdata->options = options; pdata->date = date; return ((QueryPredData_t)pdata); @@ -327,7 +332,7 @@ QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date) /* QUERYCORE_NUMERIC */ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { query_numeric_t pdata = (query_numeric_t)pd; gnc_numeric obj_val; @@ -348,7 +353,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn, break; } - if (how == COMPARE_EQUAL) { + if (pd->how == COMPARE_EQUAL) { gnc_numeric cmp_val = gnc_numeric_create (1, 10000); compare = (gnc_numeric_compare (gnc_numeric_sub (gnc_numeric_abs (obj_val), @@ -358,7 +363,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn, } else compare = gnc_numeric_compare (gnc_numeric_abs (obj_val), pdata->amount); - switch (how) { + switch (pd->how) { case COMPARE_LT: return (compare < 0); case COMPARE_LTE: @@ -372,7 +377,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn, case COMPARE_NEQ: return (!compare); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -401,15 +406,17 @@ static QueryPredData_t numeric_copy_predicate (QueryPredData_t pd) { query_numeric_t pdata = (query_numeric_t)pd; VERIFY_PDATA_R (query_numeric_type); - return gncQueryNumericPredicate (pdata->options, pdata->amount); + return gncQueryNumericPredicate (pd->how, pdata->options, pdata->amount); } -QueryPredData_t gncQueryNumericPredicate (numeric_match_t options, +QueryPredData_t gncQueryNumericPredicate (query_compare_t how, + numeric_match_t options, gnc_numeric value) { query_numeric_t pdata; pdata = g_new0 (query_numeric_def, 1); pdata->pd.type_name = query_numeric_type; + pdata->pd.how = how; pdata->options = options; pdata->amount = value; return ((QueryPredData_t)pdata); @@ -418,7 +425,7 @@ QueryPredData_t gncQueryNumericPredicate (numeric_match_t options, /* QUERYCORE_GUID */ static int guid_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { query_guid_t pdata = (query_guid_t)pd; GList *node; @@ -513,7 +520,7 @@ QueryPredData_t gncQueryGUIDPredicate (guid_match_t options, GList *guids) /* QUERYCORE_INT64 */ static int int64_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { gint64 val; query_int64_t pdata = (query_int64_t)pd; @@ -522,7 +529,7 @@ static int int64_match_predicate (gpointer object, QueryAccess get_fcn, val = ((query_int64_getter)get_fcn) (object); - switch (how) { + switch (pd->how) { case COMPARE_LT: return (val < pdata->val); case COMPARE_LTE: @@ -536,7 +543,7 @@ static int int64_match_predicate (gpointer object, QueryAccess get_fcn, case COMPARE_NEQ: return (val != pdata->val); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -566,13 +573,14 @@ static QueryPredData_t int64_copy_predicate (QueryPredData_t pd) { query_int64_t pdata = (query_int64_t)pd; VERIFY_PDATA_R (query_int64_type); - return gncQueryInt64Predicate (pdata->val); + return gncQueryInt64Predicate (pd->how, pdata->val); } -QueryPredData_t gncQueryInt64Predicate (gint64 val) +QueryPredData_t gncQueryInt64Predicate (query_compare_t how, gint64 val) { query_int64_t pdata = g_new0 (query_int64_def, 1); pdata->pd.type_name = query_int64_type; + pdata->pd.how = how; pdata->val = val; return ((QueryPredData_t)pdata); } @@ -580,7 +588,7 @@ QueryPredData_t gncQueryInt64Predicate (gint64 val) /* QUERYCORE_DOUBLE */ static int double_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { double val; query_double_t pdata = (query_double_t)pd; @@ -589,7 +597,7 @@ static int double_match_predicate (gpointer object, QueryAccess get_fcn, val = ((query_double_getter)get_fcn) (object); - switch (how) { + switch (pd->how) { case COMPARE_LT: return (val < pdata->val); case COMPARE_LTE: @@ -603,7 +611,7 @@ static int double_match_predicate (gpointer object, QueryAccess get_fcn, case COMPARE_NEQ: return (val != pdata->val); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -633,13 +641,14 @@ static QueryPredData_t double_copy_predicate (QueryPredData_t pd) { query_double_t pdata = (query_double_t)pd; VERIFY_PDATA_R (query_double_type); - return gncQueryDoublePredicate (pdata->val); + return gncQueryDoublePredicate (pd->how, pdata->val); } -QueryPredData_t gncQueryDoublePredicate (double val) +QueryPredData_t gncQueryDoublePredicate (query_compare_t how, double val) { query_double_t pdata = g_new0 (query_double_def, 1); pdata->pd.type_name = query_double_type; + pdata->pd.how = how; pdata->val = val; return ((QueryPredData_t)pdata); } @@ -648,7 +657,7 @@ QueryPredData_t gncQueryDoublePredicate (double val) /* QUERYCORE_BOOLEAN */ static int boolean_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { gboolean val; query_boolean_t pdata = (query_boolean_t)pd; @@ -657,13 +666,13 @@ static int boolean_match_predicate (gpointer object, QueryAccess get_fcn, val = ((query_boolean_getter)get_fcn) (object); - switch (how) { + switch (pd->how) { case COMPARE_EQUAL: return (val == pdata->val); case COMPARE_NEQ: return (val != pdata->val); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -691,13 +700,17 @@ static QueryPredData_t boolean_copy_predicate (QueryPredData_t pd) { query_boolean_t pdata = (query_boolean_t)pd; VERIFY_PDATA_R (query_boolean_type); - return gncQueryBooleanPredicate (pdata->val); + return gncQueryBooleanPredicate (pd->how, pdata->val); } -QueryPredData_t gncQueryBooleanPredicate (gboolean val) +QueryPredData_t gncQueryBooleanPredicate (query_compare_t how, gboolean val) { - query_boolean_t pdata = g_new0 (query_boolean_def, 1); + query_boolean_t pdata; + g_return_val_if_fail (how == COMPARE_EQUAL || how == COMPARE_NEQ, NULL); + + pdata = g_new0 (query_boolean_def, 1); pdata->pd.type_name = query_boolean_type; + pdata->pd.how = how; pdata->val = val; return ((QueryPredData_t)pdata); } @@ -705,7 +718,7 @@ QueryPredData_t gncQueryBooleanPredicate (gboolean val) /* QUERYCORE_CHAR */ static int char_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { char c; query_char_t pdata = (query_char_t)pd; @@ -767,7 +780,7 @@ QueryPredData_t gncQueryCharPredicate (char_match_t options, const char *chars) /* QUERYCORE_KVP */ static int kvp_match_predicate (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pd) + QueryPredData_t pd) { int compare; kvp_frame *kvp; @@ -789,7 +802,7 @@ static int kvp_match_predicate (gpointer object, QueryAccess get_fcn, compare = kvp_value_compare (value, pdata->value); - switch (how) + switch (pd->how) { case COMPARE_LT: return (compare < 0); @@ -804,7 +817,7 @@ static int kvp_match_predicate (gpointer object, QueryAccess get_fcn, case COMPARE_NEQ: return (compare != 0); default: - PWARN ("bad match type: %d", how); + PWARN ("bad match type: %d", pd->how); return 0; } } @@ -828,10 +841,11 @@ static QueryPredData_t kvp_copy_predicate (QueryPredData_t pd) { query_kvp_t pdata = (query_kvp_t)pd; VERIFY_PDATA_R (query_kvp_type); - return gncQueryKVPPredicate (pdata->path, pdata->value); + return gncQueryKVPPredicate (pd->how, pdata->path, pdata->value); } -QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value) +QueryPredData_t gncQueryKVPPredicate (query_compare_t how, + GSList *path, const kvp_value *value) { query_kvp_t pdata; GSList *node; @@ -840,6 +854,7 @@ QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value) pdata = g_new0 (query_kvp_def, 1); pdata->pd.type_name = query_kvp_type; + pdata->pd.how = how; pdata->value = kvp_value_copy (value); pdata->path = g_slist_copy (path); for (node = pdata->path; node; node = node->next) diff --git a/src/engine/QueryCore.h b/src/engine/QueryCore.h index bfb9c20a33..6a2a922589 100644 --- a/src/engine/QueryCore.h +++ b/src/engine/QueryCore.h @@ -17,7 +17,8 @@ /* Head of Predicate Data structures. All PData must start like this. */ typedef struct query_pred_data { - const char * type_name; + const char * type_name; + query_compare_t how; } QueryPredDataDef; /* @@ -28,7 +29,6 @@ typedef struct query_pred_data { */ typedef int (*QueryPredicate) (gpointer object, QueryAccess get_fcn, - query_compare_t how, QueryPredData_t pdata); /* A callback for how to destroy a query predicate's pdata */ @@ -73,17 +73,21 @@ QueryPredData_t gncQueryCorePredicateCopy (QueryPredData_t pdata); void gncQueryCorePredicateFree (QueryPredData_t pdata); /* Core Data Type Predicates */ -QueryPredData_t gncQueryStringPredicate (char *str, string_match_t options, +QueryPredData_t gncQueryStringPredicate (query_compare_t how, char *str, + string_match_t options, gboolean is_regex); -QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date); -QueryPredData_t gncQueryNumericPredicate (numeric_match_t options, +QueryPredData_t gncQueryDatePredicate (query_compare_t how, + date_match_t options, Timespec date); +QueryPredData_t gncQueryNumericPredicate (query_compare_t how, + numeric_match_t options, gnc_numeric value); QueryPredData_t gncQueryGUIDPredicate (guid_match_t options, GList *guids); -QueryPredData_t gncQueryInt64Predicate (gint64 val); -QueryPredData_t gncQueryDoublePredicate (double val); -QueryPredData_t gncQueryBooleanPredicate (gboolean val); +QueryPredData_t gncQueryInt64Predicate (query_compare_t how, gint64 val); +QueryPredData_t gncQueryDoublePredicate (query_compare_t how, double val); +QueryPredData_t gncQueryBooleanPredicate (query_compare_t how, gboolean val); QueryPredData_t gncQueryCharPredicate (char_match_t options, const char *chars); -QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value); +QueryPredData_t gncQueryKVPPredicate (query_compare_t how, + GSList *path, const kvp_value *value); #endif /* GNC_QUERYCORE_H */ diff --git a/src/engine/QueryNew.c b/src/engine/QueryNew.c index 2bd923bae0..60f332a315 100644 --- a/src/engine/QueryNew.c +++ b/src/engine/QueryNew.c @@ -27,7 +27,6 @@ static short module = MOD_QUERY; typedef struct { GSList * param_list; QueryPredData_t pdata; - query_compare_t how; gboolean invert; /* These values are filled in during "compilation" of the query @@ -342,7 +341,7 @@ static int check_object (QueryNew *q, gpointer object) conv_obj = get_fcn (conv_obj); } - if (((qt->pred_fcn)(conv_obj, get_fcn, qt->how, qt->pdata)) + if (((qt->pred_fcn)(conv_obj, get_fcn, qt->pdata)) == qt->invert) { and_terms_ok = 0; break; @@ -529,8 +528,7 @@ void gncQueryNewShutdown (void) } void gncQueryAddTerm (QueryNew *q, GSList *param_list, - query_compare_t comparitor, QueryPredData_t pred_data, - QueryOp op) + QueryPredData_t pred_data, QueryOp op) { QueryNewTerm *qt; QueryNew *qr, *qs; @@ -540,7 +538,6 @@ void gncQueryAddTerm (QueryNew *q, GSList *param_list, qt = g_new0 (QueryNewTerm, 1); qt->param_list = param_list; qt->pdata = pred_data; - qt->how = comparitor; qs = gncQueryCreate (); query_init (qs, qt); @@ -958,7 +955,7 @@ void gncQueryAddGUIDListMatch (QueryNew *q, GSList *param_list, g_return_if_fail (options == GUID_MATCH_NULL); pdata = gncQueryGUIDPredicate (options, guid_list); - gncQueryAddTerm (q, param_list, COMPARE_EQUAL, pdata, op); + gncQueryAddTerm (q, param_list, pdata, op); } void gncQueryAddGUIDMatch (QueryNew *q, GSList *param_list, diff --git a/src/engine/QueryNew.h b/src/engine/QueryNew.h index 9c57fb3a46..605c1c5bc8 100644 --- a/src/engine/QueryNew.h +++ b/src/engine/QueryNew.h @@ -154,8 +154,7 @@ typedef enum { typedef struct query_pred_data *QueryPredData_t; void gncQueryAddTerm (QueryNew *query, GSList *param_list, - query_compare_t comparitor, QueryPredData_t pred_data, - QueryOp op); + QueryPredData_t pred_data, QueryOp op); void gncQuerySetBook (QueryNew *q, GNCBook *book); void gncQueryAddGUIDMatch (QueryNew *q, GSList *param_list,