diff options
author | zuul <zuul@gerrit.asterisk.org> | 2016-05-09 18:23:44 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-05-09 18:23:44 -0500 |
commit | 53e965a572c1daa36a1949a6ed72cb166cf1f133 (patch) | |
tree | 38c273bd9a70bc8c15562294f315c4e530867994 /main | |
parent | 5b15ec966db9c686ca7fbc74be8d57b4c63253d7 (diff) | |
parent | 94cd351ec422287295c79658fb3d36f04b5966a5 (diff) |
Merge "datastore: Add common container based datastores API."
Diffstat (limited to 'main')
-rw-r--r-- | main/datastore.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/main/datastore.c b/main/datastore.c index a9079e837..c2bba4190 100644 --- a/main/datastore.c +++ b/main/datastore.c @@ -31,6 +31,11 @@ ASTERISK_REGISTER_FILE() #include "asterisk/datastore.h" #include "asterisk/utils.h" +#include "asterisk/astobj2.h" +#include "asterisk/uuid.h" + +/*! \brief Number of buckets for datastore container */ +#define DATASTORE_BUCKETS 53 struct ast_datastore *__ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid, const char *file, int line, const char *function) @@ -83,3 +88,78 @@ int ast_datastore_free(struct ast_datastore *datastore) return res; } + +AO2_STRING_FIELD_HASH_FN(ast_datastore, uid); +AO2_STRING_FIELD_CMP_FN(ast_datastore, uid); + +struct ao2_container *ast_datastores_alloc(void) +{ + return ao2_container_alloc(DATASTORE_BUCKETS, ast_datastore_hash_fn, ast_datastore_cmp_fn); +} + +int ast_datastores_add(struct ao2_container *datastores, struct ast_datastore *datastore) +{ + ast_assert(datastore != NULL); + ast_assert(datastore->info != NULL); + ast_assert(!ast_strlen_zero(datastore->uid)); + + if (!ao2_link(datastores, datastore)) { + return -1; + } + + return 0; +} + +void ast_datastores_remove(struct ao2_container *datastores, const char *name) +{ + ao2_find(datastores, name, OBJ_SEARCH_KEY | OBJ_UNLINK | OBJ_NODATA); +} + +struct ast_datastore *ast_datastores_find(struct ao2_container *datastores, const char *name) +{ + return ao2_find(datastores, name, OBJ_SEARCH_KEY); +} + +static void datastore_destroy(void *obj) +{ + struct ast_datastore *datastore = obj; + + /* Using the destroy function (if present) destroy the data */ + if (datastore->info->destroy != NULL && datastore->data != NULL) { + datastore->info->destroy(datastore->data); + datastore->data = NULL; + } + + ast_free((void *) datastore->uid); + datastore->uid = NULL; +} + +struct ast_datastore *ast_datastores_alloc_datastore(const struct ast_datastore_info *info, const char *uid) +{ + struct ast_datastore *datastore; + char uuid_buf[AST_UUID_STR_LEN]; + const char *uid_ptr = uid; + + if (!info) { + return NULL; + } + + datastore = ao2_alloc(sizeof(*datastore), datastore_destroy); + if (!datastore) { + return NULL; + } + + datastore->info = info; + if (ast_strlen_zero(uid)) { + /* They didn't provide an ID so we'll provide one ourself */ + uid_ptr = ast_uuid_generate_str(uuid_buf, sizeof(uuid_buf)); + } + + datastore->uid = ast_strdup(uid_ptr); + if (!datastore->uid) { + ao2_ref(datastore, -1); + return NULL; + } + + return datastore; +} |