X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Finclude%2Fcore%2Fstore.h;h=2624194955c3ed9ebee454fec4e83dc017e0c8ec;hp=df4d853106bac891ae96e887a24354e58895a726;hb=31566d5c9218638665c0992ccf0b5286899ef855;hpb=c5168cb68478e7dff4dedb666e36b1fea2b018e2 diff --git a/src/include/core/store.h b/src/include/core/store.h index df4d853..2624194 100644 --- a/src/include/core/store.h +++ b/src/include/core/store.h @@ -64,6 +64,30 @@ enum { struct sdb_store_obj; typedef struct sdb_store_obj sdb_store_obj_t; +/* + * Expressions represent arithmetic expressions based on stored objects and + * their various attributes. + * + * An expression object inherits from sdb_object_t and, thus, may safely be + * cast to a generic object. + */ +struct sdb_store_expr; +typedef struct sdb_store_expr sdb_store_expr_t; +#define SDB_STORE_EXPR(obj) ((sdb_store_expr_t *)(obj)) + +/* + * Store matchers may be used to lookup hosts from the store based on their + * various attributes. Service and attribute matchers are applied to a host's + * services and attributes and evaluate to true if *any* service or attribute + * matches. + * + * A store matcher object inherits from sdb_object_t and, thus, may safely be + * cast to a generic object. + */ +struct sdb_store_matcher; +typedef struct sdb_store_matcher sdb_store_matcher_t; +#define SDB_STORE_MATCHER(obj) ((sdb_store_matcher_t *)(obj)) + /* * Queryable fields of a stored object. */ @@ -257,25 +281,17 @@ sdb_store_get_field(sdb_store_obj_t *obj, int field, sdb_data_t *res); * sdb_store_get_attr: * Get the value of a stored object's attribute. The caller is responsible for * freeing any dynamically allocated memory possibly stored in the returned - * value.If 'res' is NULL, the function will return whether the attribute - * exists. + * value. If 'res' is NULL, the function will return whether the attribute + * exists. If specified, only attributes matching the filter will be + * considered. * * Returns: * - 0 if the attribute exists * - a negative value else */ int -sdb_store_get_attr(sdb_store_obj_t *obj, const char *name, sdb_data_t *res); - -/* - * Expressions specify arithmetic expressions. - * - * A expression object inherits from sdb_object_t and, thus, may safely be - * cast to a generic object. - */ -struct sdb_store_expr; -typedef struct sdb_store_expr sdb_store_expr_t; -#define SDB_STORE_EXPR(obj) ((sdb_store_expr_t *)(obj)) +sdb_store_get_attr(sdb_store_obj_t *obj, const char *name, sdb_data_t *res, + sdb_store_matcher_t *filter); /* * sdb_store_expr_create: @@ -301,6 +317,19 @@ sdb_store_expr_create(int op, sdb_store_expr_t *left, sdb_store_expr_t *right); sdb_store_expr_t * sdb_store_expr_fieldvalue(int field); +/* + * sdb_store_expr_attrvalue: + * Creates an expression which evaluates to the value of the specified + * attribute of a stored object. Evaluates to a NULL value if the attribute + * does not exist. + * + * Returns: + * - an expression object on success + * - NULL else + */ +sdb_store_expr_t * +sdb_store_expr_attrvalue(const char *name); + /* * sdb_store_expr_constvalue: * Creates an expression which evaluates to the specified constant value. @@ -318,7 +347,8 @@ sdb_store_expr_constvalue(const sdb_data_t *value); * result in 'res'. The result's value will be allocated dynamically if * necessary and, thus, should be free'd by the caller (e.g. using * sdb_data_free_datum). The object may be NULL, in which case the expression - * needs to evaluate to a constant value. + * needs to evaluate to a constant value. If specified, only objects matching + * the filter will be used during the evaluation. * * Returns: * - 0 on success @@ -326,7 +356,7 @@ sdb_store_expr_constvalue(const sdb_data_t *value); */ int sdb_store_expr_eval(sdb_store_expr_t *expr, sdb_store_obj_t *obj, - sdb_data_t *res); + sdb_data_t *res, sdb_store_matcher_t *filter); /* * Conditionals may be used to lookup hosts from the store based on a @@ -357,19 +387,6 @@ sdb_store_attr_cond(const char *name, sdb_store_expr_t *expr); sdb_store_cond_t * sdb_store_obj_cond(int field, sdb_store_expr_t *expr); -/* - * Store matchers may be used to lookup hosts from the store based on their - * various attributes. Service and attribute matchers are applied to a host's - * services and attributes and evaluate to true if *any* service or attribute - * matches. - * - * A store matcher object inherits from sdb_object_t and, thus, may safely be - * cast to a generic object. - */ -struct sdb_store_matcher; -typedef struct sdb_store_matcher sdb_store_matcher_t; -#define SDB_STORE_MATCHER(obj) ((sdb_store_matcher_t *)(obj)) - /* * sdb_store_name_matcher: * Creates a matcher matching by the specified object type's name. If 're' is @@ -390,10 +407,25 @@ sdb_store_attr_matcher(const char *name, const char *value, _Bool re); /* * sdb_store_isnull_matcher: - * Creates a matcher matching "missing" attributes. + * Creates a matcher matching NULL values. */ sdb_store_matcher_t * -sdb_store_isnull_matcher(const char *attr_name); +sdb_store_isnull_matcher(sdb_store_expr_t *expr); + +/* + * sdb_store_isnnull_matcher: + * Creates a matcher matching non-NULL values. + */ +sdb_store_matcher_t * +sdb_store_isnnull_matcher(sdb_store_expr_t *expr); + +/* + * sdb_store_child_matcher: + * Creates a matcher matching an object's children of the specified type. It + * matches if *any* of those children match 'm'. + */ +sdb_store_matcher_t * +sdb_store_child_matcher(int type, sdb_store_matcher_t *m); /* * sdb_store_lt_matcher, sdb_store_le_matcher, sdb_store_eq_matcher, @@ -414,6 +446,66 @@ sdb_store_ge_matcher(sdb_store_cond_t *cond); sdb_store_matcher_t * sdb_store_gt_matcher(sdb_store_cond_t *cond); +sdb_store_matcher_t * +sdb_store_cmp_lt(sdb_store_expr_t *left, sdb_store_expr_t *right); +sdb_store_matcher_t * +sdb_store_cmp_le(sdb_store_expr_t *left, sdb_store_expr_t *right); +sdb_store_matcher_t * +sdb_store_cmp_eq(sdb_store_expr_t *left, sdb_store_expr_t *right); +sdb_store_matcher_t * +sdb_store_cmp_ne(sdb_store_expr_t *left, sdb_store_expr_t *right); +sdb_store_matcher_t * +sdb_store_cmp_ge(sdb_store_expr_t *left, sdb_store_expr_t *right); +sdb_store_matcher_t * +sdb_store_cmp_gt(sdb_store_expr_t *left, sdb_store_expr_t *right); + +/* + * sdb_store_in_matcher: + * Creates a matcher which matches if the right value evaluates to an array + * value and the left value is included in that array. See sdb_data_inarray + * for more details. + */ +sdb_store_matcher_t * +sdb_store_in_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right); + +/* + * sdb_store_regex_matcher: + * Creates a matcher which matches the string value the left expression + * evaluates to against the regular expression the right expression evaluates + * to. The right expression may either be a constant value regular expression + * or string or a dynamic value evaluating to a string. In the latter case, + * the string is compiled to a regex every time the matcher is executed. + */ +sdb_store_matcher_t * +sdb_store_regex_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right); + +/* + * sdb_store_nregex_matcher: + * Creates a regex matcher just like sdb_store_regex_matcher except that it + * matches in case the regular expression does not match. + */ +sdb_store_matcher_t * +sdb_store_nregex_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right); + +/* + * sdb_store_matcher_op_cb: + * Callback constructing a matcher operator. + */ +typedef sdb_store_matcher_t *(*sdb_store_matcher_op_cb) + (sdb_store_expr_t *, sdb_store_expr_t *); + +/* + * sdb_store_parse_matcher_op: + * Parse a matcher operator and return a constructor for the respective + * matcher. + * + * Returns: + * - matcher operator constructor on success + * - NULL else + */ +sdb_store_matcher_op_cb +sdb_store_parse_matcher_op(const char *op); + /* * sdb_store_parse_object_type_plural: * Parse the type name (plural) of a stored object. @@ -501,14 +593,6 @@ int sdb_store_matcher_matches(sdb_store_matcher_t *m, sdb_store_obj_t *obj, sdb_store_matcher_t *filter); -/* - * sdb_store_matcher_tostring: - * Format a matcher object as string. This is meant for logging or debugging - * purposes. - */ -char * -sdb_store_matcher_tostring(sdb_store_matcher_t *m, char *buf, size_t buflen); - /* * sdb_store_lookup_cb: * Lookup callback. It is called for each matching object when looking up data