mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
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. Patches against 13 and 15 have a compatibility layer needed to maintain ABI that is not needed in master. Change-Id: I56f4e20ba1154bd52281f995c27a429a854f6a79
This commit is contained in:
@@ -59,6 +59,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);
|
||||
@@ -71,6 +73,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,
|
||||
@@ -262,6 +265,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;
|
||||
|
Reference in New Issue
Block a user