diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-04-13 04:17:45 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-04-13 04:17:45 +0000 |
commit | acb0999c651be125edcb917e490decaf9842e1dd (patch) | |
tree | a1513af622062ed23537a4767f8b6cd05c1a4bbd | |
parent | b4948bf8340146a0575395247b751672ac081fd6 (diff) |
Add ast_db_freetree and ast_db_gettree
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@843 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | db.c | 70 | ||||
-rwxr-xr-x | include/asterisk/astdb.h | 10 |
2 files changed, 79 insertions, 1 deletions
@@ -294,7 +294,7 @@ static int database_show(int fd, int argc, char *argv[]) values = data.data; values[data.size - 1]='\0'; } else - values = "<vad value>"; + values = "<bad value>"; if (keymatch(keys, prefix)) { ast_cli(fd, "%-50s: %-25s\n", keys, values); } @@ -303,6 +303,74 @@ static int database_show(int fd, int argc, char *argv[]) return RESULT_SUCCESS; } +struct ast_db_entry *ast_db_gettree(const char *family, const char *keytree) +{ + char prefix[256]; + DBT key, data; + char *keys, *values; + int res; + int pass; + struct ast_db_entry *last = NULL; + struct ast_db_entry *cur, *ret=NULL; + + if (family && strlen(family)) { + if (keytree && strlen(keytree)) + /* Family and key tree */ + snprintf(prefix, sizeof(prefix), "/%s/%s", family, prefix); + else + /* Family only */ + snprintf(prefix, sizeof(prefix), "/%s", family); + } else + strcpy(prefix, ""); + ast_pthread_mutex_lock(&dblock); + if (dbinit()) { + ast_pthread_mutex_unlock(&dblock); + ast_log(LOG_WARNING, "Database unavailable\n"); + return NULL; + } + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + pass = 0; + while(!(res = astdb->seq(astdb, &key, &data, pass++ ? R_NEXT : R_FIRST))) { + if (key.size) { + keys = key.data; + keys[key.size - 1] = '\0'; + } else + keys = "<bad key>"; + if (data.size) { + values = data.data; + values[data.size - 1]='\0'; + } else + values = "<bad value>"; + if (keymatch(keys, prefix)) { + cur = malloc(sizeof(struct ast_db_entry) + strlen(keys) + strlen(values) + 2); + if (cur) { + cur->next = NULL; + cur->key = cur->data + strlen(values) + 1; + strcpy(cur->data, values); + strcpy(cur->key, keys); + if (last) + last->next = cur; + else + ret = cur; + last = cur; + } + } + } + ast_pthread_mutex_unlock(&dblock); + return ret; +} + +void ast_db_freetree(struct ast_db_entry *dbe) +{ + struct ast_db_entry *last; + while(dbe) { + last = dbe; + dbe = dbe->next; + free(last); + } +} + static char database_show_usage[] = "Usage: database show [family [keytree]]\n" " Shows Asterisk database contents, optionally restricted\n" diff --git a/include/asterisk/astdb.h b/include/asterisk/astdb.h index f40acf2df..547ffedea 100755 --- a/include/asterisk/astdb.h +++ b/include/asterisk/astdb.h @@ -18,6 +18,12 @@ extern "C" { #endif +struct ast_db_entry { + struct ast_db_entry *next; + char *key; + char data[0]; +}; + int ast_db_get(const char *family, const char *key, char *out, int outlen); int ast_db_put(const char *family, const char *key, char *value); @@ -26,6 +32,10 @@ int ast_db_del(const char *family, const char *key); int ast_db_deltree(const char *family, const char *keytree); +struct ast_db_entry *ast_db_gettree(const char *family, const char *keytree); + +void ast_db_freetree(struct ast_db_entry *entry); + #if defined(__cplusplus) || defined(c_plusplus) } #endif |