static char *handle_cli_database_showkey(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { char suffix[256]; DBT key, data; char *keys, *values; int res; int pass; int counter = 0; switch (cmd) { case CLI_INIT: e->command = "database showkey"; e->usage = "Usage: database showkey <keytree>\n" " Shows Asterisk database contents, restricted to a given key.\n"; return NULL; case CLI_GENERATE: return NULL; } if (a->argc == 3) { /* Key only */ snprintf(suffix, sizeof(suffix), "/%s", a->argv[2]); } else { return CLI_SHOWUSAGE; } ast_mutex_lock(&dblock); if (dbinit()) { ast_mutex_unlock(&dblock); ast_cli(a->fd, "Database unavailable\n"); return CLI_SUCCESS; } 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 (subkeymatch(keys, suffix)) { ast_cli(a->fd, "%-50s: %-25s\n", keys, values); counter++; } } ast_mutex_unlock(&dblock); ast_cli(a->fd, "%d results found.\n", counter); return CLI_SUCCESS; }
static int db_showkey_cb(DBT *key, DBT *value, const char *filter, void *data) { struct ast_cli_args *a = data; const char *key_s = dbt_data2str_full(key, "<bad key>"); const char *value_s = dbt_data2str_full(value, "<bad value>"); if (subkeymatch(key_s, filter)) { ast_cli(a->fd, "%-50s: %-25s\n", key_s, value_s); return 1; } return 0; }
static int database_showkey(int fd, int argc, char *argv[]) { char suffix[256]; DBT key, data; char *keys, *values; int res; int pass; if (argc == 3) { /* Key only */ snprintf(suffix, sizeof(suffix), "/%s", argv[2]); } else { return RESULT_SHOWUSAGE; } ast_mutex_lock(&dblock); if (dbinit()) { ast_mutex_unlock(&dblock); ast_cli(fd, "Database unavailable\n"); return RESULT_SUCCESS; } 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 (subkeymatch(keys, suffix)) { ast_cli(fd, "%-50s: %-25s\n", keys, values); } } ast_mutex_unlock(&dblock); return RESULT_SUCCESS; }