summaryrefslogtreecommitdiff
path: root/res/res_sorcery_realtime.c
diff options
context:
space:
mode:
authorSean Bright <sean.bright@gmail.com>2017-11-09 09:21:38 -0500
committerSean Bright <sean.bright@gmail.com>2017-11-13 15:15:33 -0500
commitffccce76d9c85fb09a28883452cf9df318c3d050 (patch)
tree21cfa458a58160fc2eb994906d7bdeb4e899bf8b /res/res_sorcery_realtime.c
parent9eacd55c7191a460fe8704f81b9e5e3beaf014b9 (diff)
sorcery: Add ast_sorcery_retrieve_by_prefix()
Some consumers of the sorcery API use ast_sorcery_retrieve_by_regex only so that they can anchor the potential match as a prefix and not because they truly need regular expressions. Rather than using regular expressions for simple prefix lookups, add a new operation - ast_sorcery_retrieve_by_prefix - that does them. Change-Id: I56f4e20ba1154bd52281f995c27a429a854f6a79
Diffstat (limited to 'res/res_sorcery_realtime.c')
-rw-r--r--res/res_sorcery_realtime.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/res/res_sorcery_realtime.c b/res/res_sorcery_realtime.c
index 3f114046c..a858cbcef 100644
--- a/res/res_sorcery_realtime.c
+++ b/res/res_sorcery_realtime.c
@@ -57,6 +57,8 @@ static void *sorcery_realtime_retrieve_fields(const struct ast_sorcery *sorcery,
static void sorcery_realtime_retrieve_multiple(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects,
const struct ast_variable *fields);
static void sorcery_realtime_retrieve_regex(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *regex);
+static void sorcery_realtime_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_realtime_update(const struct ast_sorcery *sorcery, void *data, void *object);
static int sorcery_realtime_delete(const struct ast_sorcery *sorcery, void *data, void *object);
static void sorcery_realtime_close(void *data);
@@ -69,6 +71,7 @@ static struct ast_sorcery_wizard realtime_object_wizard = {
.retrieve_fields = sorcery_realtime_retrieve_fields,
.retrieve_multiple = sorcery_realtime_retrieve_multiple,
.retrieve_regex = sorcery_realtime_retrieve_regex,
+ .retrieve_prefix = sorcery_realtime_retrieve_prefix,
.update = sorcery_realtime_update,
.delete = sorcery_realtime_delete,
.close = sorcery_realtime_close,
@@ -260,6 +263,23 @@ static void sorcery_realtime_retrieve_regex(const struct ast_sorcery *sorcery, v
sorcery_realtime_retrieve_multiple(sorcery, data, type, objects, fields);
}
+static void sorcery_realtime_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type,
+ struct ao2_container *objects, const char *prefix, const size_t prefix_len)
+{
+ char field[strlen(UUID_FIELD) + 6], value[prefix_len + 2];
+ RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
+
+ if (prefix_len) {
+ snprintf(field, sizeof(field), "%s LIKE", UUID_FIELD);
+ snprintf(value, sizeof(value), "%.*s%%", (int) prefix_len, prefix);
+ if (!(fields = ast_variable_new(field, value, ""))) {
+ return;
+ }
+ }
+
+ sorcery_realtime_retrieve_multiple(sorcery, data, type, objects, fields);
+}
+
static int sorcery_realtime_update(const struct ast_sorcery *sorcery, void *data, void *object)
{
struct sorcery_config *config = data;