w_query *w_query_parse(w_root_t *root, json_t *query, char **errmsg) { w_query *res; *errmsg = NULL; res = calloc(1, sizeof(*res)); if (!res) { *errmsg = strdup("out of memory"); goto error; } res->refcnt = 1; res->case_sensitive = root->case_sensitive; if (!parse_sync(res, query)) { goto error; } if (!parse_relative_root(root, res, query)) { goto error; } if (!parse_empty_on_fresh_instance(res, query)) { goto error; } /* Look for path generators */ if (!parse_paths(res, query)) { goto error; } /* Look for suffix generators */ if (!parse_suffixes(res, query)) { goto error; } /* Look for since generator */ if (!parse_since(res, query)) { goto error; } if (!parse_query_expression(res, query)) { goto error; } return res; error: if (res) { *errmsg = res->errmsg; res->errmsg = NULL; w_query_delref(res); } if (!*errmsg) { *errmsg = strdup("unspecified error"); } return NULL; }
std::shared_ptr<w_query> w_query_parse( const std::shared_ptr<w_root_t>& root, const json_ref& query) { auto result = std::make_shared<w_query>(); auto res = result.get(); parse_benchmark(res, query); parse_case_sensitive(res, root, query); parse_sync(res, query); parse_dedup(res, query); parse_lock_timeout(res, query); parse_relative_root(root, res, query); parse_empty_on_fresh_instance(res, query); /* Look for path generators */ parse_paths(res, query); /* Look for glob generators */ parse_globs(res, query); /* Look for suffix generators */ parse_suffixes(res, query); /* Look for since generator */ parse_since(res, query); parse_query_expression(res, query); parse_request_id(res, query); parse_field_list(query.get_default("fields"), &res->fieldList); res->query_spec = query; return result; }