40 #define OBJECT_BUCKETS 53
42 static void *sorcery_memory_open(
const char *data);
43 static int sorcery_memory_create(
const struct ast_sorcery *sorcery,
void *data,
void *
object);
44 static void *sorcery_memory_retrieve_id(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
const char *
id);
45 static void *sorcery_memory_retrieve_fields(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
const struct ast_variable *fields);
48 static void sorcery_memory_retrieve_regex(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
struct ao2_container *
objects,
const char *regex);
49 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);
50 static int sorcery_memory_update(
const struct ast_sorcery *sorcery,
void *data,
void *
object);
51 static int sorcery_memory_delete(
const struct ast_sorcery *sorcery,
void *data,
void *
object);
52 static void sorcery_memory_close(
void *data);
56 .open = sorcery_memory_open,
57 .create = sorcery_memory_create,
58 .retrieve_id = sorcery_memory_retrieve_id,
59 .retrieve_fields = sorcery_memory_retrieve_fields,
60 .retrieve_multiple = sorcery_memory_retrieve_multiple,
61 .retrieve_regex = sorcery_memory_retrieve_regex,
62 .retrieve_prefix = sorcery_memory_retrieve_prefix,
63 .update = sorcery_memory_update,
64 .delete = sorcery_memory_delete,
65 .close = sorcery_memory_close,
100 const char *
id = arg;
105 static int sorcery_memory_create(
const struct ast_sorcery *sorcery,
void *data,
void *
object)
125 static int sorcery_memory_fields_cmp(
void *obj,
void *arg,
int flags)
136 }
else if (params->
prefix) {
141 }
else if (params->
fields &&
161 static void *sorcery_memory_retrieve_fields(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
const struct ast_variable *
fields)
174 return ao2_callback(data, 0, sorcery_memory_fields_cmp, ¶ms);
177 static void *sorcery_memory_retrieve_id(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
const char *
id)
179 return ao2_find(data,
id,
OBJ_KEY);
187 .container = objects,
190 ao2_callback(data, 0, sorcery_memory_fields_cmp, ¶ms);
193 static void sorcery_memory_retrieve_regex(
const struct ast_sorcery *sorcery,
void *data,
const char *type,
struct ao2_container *objects,
const char *
regex)
198 .container = objects,
199 .regex = &expression,
202 if (ast_strlen_zero(regex)) {
206 if (regcomp(&expression, regex, REG_EXTENDED | REG_NOSUB)) {
210 ao2_callback(data, 0, sorcery_memory_fields_cmp, ¶ms);
211 regfree(&expression);
218 .container = objects,
223 ao2_callback(data, 0, sorcery_memory_fields_cmp, ¶ms);
226 static int sorcery_memory_update(
const struct ast_sorcery *sorcery,
void *data,
void *
object)
228 RAII_VAR(
void *, existing, NULL, ao2_cleanup);
244 static int sorcery_memory_delete(
const struct ast_sorcery *sorcery,
void *data,
void *
object)
248 return existing ? 0 : -1;
251 static void *sorcery_memory_open(
const char *data)
257 static void sorcery_memory_close(
void *data)
262 static int load_module(
void)
271 static int unload_module(
void)
277 AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER,
"Sorcery In-Memory Object Wizard",
278 .support_level = AST_MODULE_SUPPORT_CORE,
280 .unload = unload_module,
Asterisk main include file. File version handling, generic pbx functions.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container, as described below.
Structure for variables, used for configurations and for channel variables.
Assume that the ao2_container is already locked.
Full structure for sorcery.
#define ao2_link_flags(container, obj, flags)
Add an object to a container.
const char * name
Name of the wizard.
struct ao2_container * container
Optional container to put object into.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
struct ao2_global_obj objects
Objects retrieved from the configuration file.
regex_t * regex
Regular expression for checking object id.
#define ast_sorcery_wizard_register(interface)
See __ast_sorcery_wizard_register()
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
const size_t prefix_len
Prefix length in bytes for matching object id.
#define OBJECT_BUCKETS
Number of buckets for sorcery objects.
int ast_sorcery_wizard_unregister(const struct ast_sorcery_wizard *interface)
Unregister a sorcery wizard.
#define ast_sorcery_objectset_create(sorcery, object)
Create an object set (KVP list) for an object.
Module has failed to load, may be in an inconsistent state.
const char * prefix
Prefix for matching object id.
Interface for a sorcery wizard.
int ast_variable_lists_match(const struct ast_variable *left, const struct ast_variable *right, int exact_match)
Tests 2 variable lists to see if they match.
static int sorcery_memory_hash(const void *obj, const int flags)
Hashing function for sorcery objects.
const struct ast_variable * fields
Pointer to the fields to check.
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
static int sorcery_memory_cmp(void *obj, void *arg, int flags)
Comparator function for sorcery objects.
const struct ast_sorcery * sorcery
Pointer to the sorcery structure.
Structure used for fields comparison.
Sorcery Data Access Layer API.
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
#define ao2_link(container, obj)
Add an object to a container.