Index: db.c =================================================================== RCS file: /usr/cvsroot/asterisk/db.c,v retrieving revision 1.10 diff -u -r1.10 db.c --- db.c 9 Jul 2004 10:08:09 -0000 1.10 +++ db.c 21 Dec 2004 17:42:08 -0000 @@ -68,6 +68,19 @@ return 0; } +static inline int subkeymatch(const char *key, const char *suffix) +{ + int suffixlen = strlen(suffix); + if (suffixlen) { + char *subkey = key + strlen(key) - suffixlen; + if (subkey < key) + return 0; + if (!strcasecmp(subkey, suffix)) + return 1; + } + return 0; +} + int ast_db_deltree(const char *family, const char *keytree) { char prefix[256]; @@ -307,6 +320,47 @@ return RESULT_SUCCESS; } +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 = ""; + if (data.size) { + values = data.data; + values[data.size - 1]='\0'; + } else + values = ""; + if (subkeymatch(keys, suffix)) { + ast_cli(fd, "%-50s: %-25s\n", keys, values); + } + } + ast_mutex_unlock(&dblock); + return RESULT_SUCCESS; +} + struct ast_db_entry *ast_db_gettree(const char *family, const char *keytree) { char prefix[256]; @@ -380,6 +434,10 @@ " Shows Asterisk database contents, optionally restricted\n" "to a given family, or family and keytree.\n"; +static char database_showkey_usage[] = +"Usage: database show \n" +" Shows Asterisk database contents, restricted to a given key.\n"; + static char database_put_usage[] = "Usage: database put \n" " Adds or updates an entry in the Asterisk database for\n" @@ -403,6 +461,9 @@ struct ast_cli_entry cli_database_show = { { "database", "show", NULL }, database_show, "Shows database contents", database_show_usage }; +struct ast_cli_entry cli_database_showkey = +{ { "database", "showkey", NULL }, database_showkey, "Shows database contents", database_showkey_usage }; + struct ast_cli_entry cli_database_get = { { "database", "get", NULL }, database_get, "Gets database value", database_get_usage }; @@ -419,6 +480,7 @@ { dbinit(); ast_cli_register(&cli_database_show); + ast_cli_register(&cli_database_showkey); ast_cli_register(&cli_database_get); ast_cli_register(&cli_database_put); ast_cli_register(&cli_database_del);