diff options
Diffstat (limited to 'res/res_sorcery_astdb.c')
-rw-r--r-- | res/res_sorcery_astdb.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/res/res_sorcery_astdb.c b/res/res_sorcery_astdb.c index 1aec0be95..fee857525 100644 --- a/res/res_sorcery_astdb.c +++ b/res/res_sorcery_astdb.c @@ -46,6 +46,7 @@ static void *sorcery_astdb_retrieve_fields(const struct ast_sorcery *sorcery, vo static void sorcery_astdb_retrieve_multiple(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const struct ast_variable *fields); static void sorcery_astdb_retrieve_regex(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *regex); +static void sorcery_astdb_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_astdb_update(const struct ast_sorcery *sorcery, void *data, void *object); static int sorcery_astdb_delete(const struct ast_sorcery *sorcery, void *data, void *object); static void sorcery_astdb_close(void *data); @@ -58,6 +59,7 @@ static struct ast_sorcery_wizard astdb_object_wizard = { .retrieve_fields = sorcery_astdb_retrieve_fields, .retrieve_multiple = sorcery_astdb_retrieve_multiple, .retrieve_regex = sorcery_astdb_retrieve_regex, + .retrieve_prefix = sorcery_astdb_retrieve_prefix, .update = sorcery_astdb_update, .delete = sorcery_astdb_delete, .close = sorcery_astdb_close, @@ -329,6 +331,42 @@ static void sorcery_astdb_retrieve_regex(const struct ast_sorcery *sorcery, void regfree(&expression); } +static void sorcery_astdb_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *prefix, const size_t prefix_len) +{ + const char *family_prefix = data; + size_t family_len = strlen(family_prefix) + strlen(type) + 1; /* +1 for slash delimiter */ + char family[family_len + 1]; + char tree[prefix_len + sizeof("%")]; + RAII_VAR(struct ast_db_entry *, entries, NULL, ast_db_freetree); + struct ast_db_entry *entry; + + snprintf(tree, sizeof(tree), "%.*s%%", (int) prefix_len, prefix); + snprintf(family, sizeof(family), "%s/%s", family_prefix, type); + + if (!(entries = ast_db_gettree(family, tree))) { + return; + } + + for (entry = entries; entry; entry = entry->next) { + /* The key in the entry includes the family, so we need to strip it out */ + const char *key = entry->key + family_len + 2; + RAII_VAR(struct ast_json *, json, NULL, ast_json_unref); + struct ast_json_error error; + RAII_VAR(void *, object, NULL, ao2_cleanup); + RAII_VAR(struct ast_variable *, objset, NULL, ast_variables_destroy); + + if (!(json = ast_json_load_string(entry->data, &error)) + || (ast_json_to_ast_variables(json, &objset) != AST_JSON_TO_AST_VARS_CODE_SUCCESS) + || !(objset = sorcery_astdb_filter_objectset(objset, sorcery, type)) + || !(object = ast_sorcery_alloc(sorcery, type, key)) + || ast_sorcery_objectset_apply(sorcery, object, objset)) { + return; + } + + ao2_link(objects, object); + } +} + static int sorcery_astdb_update(const struct ast_sorcery *sorcery, void *data, void *object) { const char *prefix = data; |