n->val.str = strdup((char *) data);
if (!n->val.str)
return -ENOMEM;
- n->has_value = 1;
break;
case F_DATA_NUMBER:
n->val.num = *((unsigned long long *) data);
- n->has_value = 1;
break;
case F_DATA_FLOAT:
n->val.fnum = *((long double *) data);
- n->has_value = 1;
break;
case F_DATA_BOOLEAN:
n->val.boolean = *((bool *) data) == 0 ? 0 : 1;
- n->has_value = 1;
break;
default:
- break;
+ return 0;
}
+
+ n->type = type;
+ n->has_value = 1;
return 0;
}
switch (holder) {
case F_HOLDER_COLUMN:
- n->val.str = strdup((char *) data);
+ n->holder_name = strdup((char *) data);
+ DBG(FLTR, ul_debugobj(fltr, "new %s holder", n->holder_name));
break;
default:
break;
return (struct filter_node *) n;
}
-void filter_free_param(struct filter_param *n)
+static void param_reset_data(struct filter_param *n)
{
- if (n->type == F_DATA_STRING || n->holder == F_HOLDER_COLUMN)
+ if (n->type == F_DATA_STRING)
free(n->val.str);
+ memset(&n->val, 0, sizeof(n->val));
+ n->has_value = 0;
+}
+
+
+void filter_free_param(struct filter_param *n)
+{
+ param_reset_data(n);
+
+ free(n->holder_name);
list_del_init(&n->pr_params);
scols_unref_column(n->col);
free(n);
switch (n->holder) {
case F_HOLDER_COLUMN:
- ul_jsonwrt_value_s(json, "column", n->val.str);
+ ul_jsonwrt_value_s(json, "column", n->holder_name);
break;
default:
break;
ul_jsonwrt_object_close(json);
}
-int filter_eval_param(struct libscols_filter *fltr __attribute__((__unused__)),
+static int fetch_holder_data(struct libscols_filter *fltr,
+ struct filter_param *n, struct libscols_line *ln)
+{
+ const char *data;
+ int rc;
+
+ if (n->holder != F_HOLDER_COLUMN)
+ return 0;
+ if (!n->col) {
+ DBG(FLTR, ul_debugobj(fltr, "no column for %s holder", n->holder_name));
+ return -EINVAL;
+ }
+
+ DBG(FLTR, ul_debugobj(fltr, "fetching %s data", n->holder_name));
+
+ param_reset_data(n);
+
+ data = scols_line_get_column_data(ln, n->col);
+ rc = param_set_data(n, F_DATA_STRING, data);
+
+ return rc;
+}
+
+int filter_eval_param(struct libscols_filter *fltr,
struct filter_param *n,
- struct libscols_line *ln __attribute__((__unused__)),
+ struct libscols_line *ln,
int *status)
{
int rc = 0;
- if (!n->has_value) {
+ DBG(FLTR, ul_debugobj(fltr, "eval param"));
+
+ if (!n->has_value && n->holder)
+ rc = fetch_holder_data(fltr, n, ln);
+
+ if (!n->has_value || rc) {
*status = 0;
goto done;
}
break;
}
done:
+ if (rc)
+ DBG(FLTR, ul_debugobj(fltr, "failed eval param [rc=%d]", rc));
return rc;
}
do {
rc = filter_next_param(fltr, itr, &prm);
if (rc == 0 && (int) prm->holder == type) {
- *name = prm->val.str;
+ *name = prm->holder_name;
}
} while (rc == 0 && !*name);
scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
while (filter_next_param(fltr, &itr, &prm) == 0) {
- if (prm->holder != F_HOLDER_COLUMN || strcmp(name, prm->val.str) != 0)
+ if (prm->holder != F_HOLDER_COLUMN || strcmp(name, prm->holder_name) != 0)
continue;
prm->col = col;
scols_ref_column(col);
int scols_line_apply_filter(struct libscols_line *ln,
struct libscols_filter *fltr, int *status)
{
+ int rc;
if (!ln || !fltr || !fltr->root)
return -EINVAL;
- return filter_eval_node(fltr, fltr->root, ln, status);
+ rc = filter_eval_node(fltr, fltr->root, ln, status);
+
+ DBG(FLTR, ul_debugobj(fltr, "filter applid [rc=%d, status=%d]", rc, *status));
+ return rc;
}