diff options
Diffstat (limited to 'res/res_sorcery_memory.c')
-rw-r--r-- | res/res_sorcery_memory.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/res/res_sorcery_memory.c b/res/res_sorcery_memory.c index 57d5eace0..6c91dad2d 100644 --- a/res/res_sorcery_memory.c +++ b/res/res_sorcery_memory.c @@ -46,6 +46,7 @@ static void *sorcery_memory_retrieve_fields(const struct ast_sorcery *sorcery, v static void sorcery_memory_retrieve_multiple(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const struct ast_variable *fields); static void sorcery_memory_retrieve_regex(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *regex); +static void sorcery_memory_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *prefix, const size_t prefix_len); static int sorcery_memory_update(const struct ast_sorcery *sorcery, void *data, void *object); static int sorcery_memory_delete(const struct ast_sorcery *sorcery, void *data, void *object); static void sorcery_memory_close(void *data); @@ -58,6 +59,7 @@ static struct ast_sorcery_wizard memory_object_wizard = { .retrieve_fields = sorcery_memory_retrieve_fields, .retrieve_multiple = sorcery_memory_retrieve_multiple, .retrieve_regex = sorcery_memory_retrieve_regex, + .retrieve_prefix = sorcery_memory_retrieve_prefix, .update = sorcery_memory_update, .delete = sorcery_memory_delete, .close = sorcery_memory_close, @@ -74,6 +76,12 @@ struct sorcery_memory_fields_cmp_params { /*! \brief Regular expression for checking object id */ regex_t *regex; + /*! \brief Prefix for matching object id */ + const char *prefix; + + /*! \brief Prefix length in bytes for matching object id */ + const size_t prefix_len; + /*! \brief Optional container to put object into */ struct ao2_container *container; }; @@ -125,6 +133,11 @@ static int sorcery_memory_fields_cmp(void *obj, void *arg, int flags) ao2_link(params->container, obj); } return 0; + } else if (params->prefix) { + if (!strncmp(params->prefix, ast_sorcery_object_get_id(obj), params->prefix_len)) { + ao2_link(params->container, obj); + } + return 0; } else if (params->fields && (!(objset = ast_sorcery_objectset_create(params->sorcery, obj)) || (!ast_variable_lists_match(objset, params->fields, 0)))) { @@ -198,6 +211,18 @@ static void sorcery_memory_retrieve_regex(const struct ast_sorcery *sorcery, voi regfree(&expression); } +static void sorcery_memory_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *prefix, const size_t prefix_len) +{ + struct sorcery_memory_fields_cmp_params params = { + .sorcery = sorcery, + .container = objects, + .prefix = prefix, + .prefix_len = prefix_len, + }; + + ao2_callback(data, 0, sorcery_memory_fields_cmp, ¶ms); +} + static int sorcery_memory_update(const struct ast_sorcery *sorcery, void *data, void *object) { RAII_VAR(void *, existing, NULL, ao2_cleanup); |