summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-11-16 10:59:23 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-11-16 10:59:23 -0600
commit8d55b132b94c830f3dae18e4c5519e5ce5af9a33 (patch)
tree27d318e39b293f5ca8c23ccf6122d79ce93d976e /main
parent9fb2da7963f9e02f8502db104c0e2dc0ddfc870a (diff)
parentcf062303e35e4baa0dc2aa3dfb68b2c25b1ed2c2 (diff)
Merge "sorcery: Add ast_sorcery_retrieve_by_prefix()" into 13
Diffstat (limited to 'main')
-rw-r--r--main/sorcery.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/main/sorcery.c b/main/sorcery.c
index 1bdf2c2f8..cb0aff538 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -544,6 +544,27 @@ static void sorcery_internal_wizard_destructor(void *obj)
int __ast_sorcery_wizard_register(const struct ast_sorcery_wizard *interface, struct ast_module *module)
{
+ struct ast_sorcery_wizard compat = {
+ .name = interface->name,
+ .open = interface->open,
+ .load = interface->load,
+ .reload = interface->reload,
+ .create = interface->create,
+ .retrieve_id = interface->retrieve_id,
+ .retrieve_regex = interface->retrieve_regex,
+ .retrieve_fields = interface->retrieve_fields,
+ .retrieve_multiple = interface->retrieve_multiple,
+ .update = interface->update,
+ .delete = interface->delete,
+ .close = interface->close,
+ .retrieve_prefix = NULL,
+ };
+
+ return __ast_sorcery_wizard_register_with_prefix(&compat, module);
+}
+
+int __ast_sorcery_wizard_register_with_prefix(const struct ast_sorcery_wizard *interface, struct ast_module *module)
+{
struct ast_sorcery_internal_wizard *wizard;
int res = -1;
@@ -1982,6 +2003,36 @@ struct ao2_container *ast_sorcery_retrieve_by_regex(const struct ast_sorcery *so
return objects;
}
+struct ao2_container *ast_sorcery_retrieve_by_prefix(const struct ast_sorcery *sorcery, const char *type, const char *prefix, const size_t prefix_len)
+{
+ RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
+ struct ao2_container *objects;
+ int i;
+
+ if (!object_type || !(objects = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, 1, NULL, NULL))) {
+ return NULL;
+ }
+
+ AST_VECTOR_RW_RDLOCK(&object_type->wizards);
+ for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
+ struct ast_sorcery_object_wizard *wizard =
+ AST_VECTOR_GET(&object_type->wizards, i);
+
+ if (!wizard->wizard->callbacks.retrieve_prefix) {
+ continue;
+ }
+
+ wizard->wizard->callbacks.retrieve_prefix(sorcery, wizard->data, object_type->name, objects, prefix, prefix_len);
+
+ if (wizard->caching && ao2_container_count(objects)) {
+ break;
+ }
+ }
+ AST_VECTOR_RW_UNLOCK(&object_type->wizards);
+
+ return objects;
+}
+
/*! \brief Internal function which returns if the wizard has created the object */
static int sorcery_wizard_create(const struct ast_sorcery_object_wizard *object_wizard, const struct sorcery_details *details)
{