Skip to content

Commit e1e3e17

Browse files
InterLinked1Friendly Automation
authored and
Friendly Automation
committed
db: Add AMI action to retrieve DB keys at prefix.
Adds the DBGetTree action, which can be used to retrieve all of the DB keys beginning with a particular prefix, similar to the capability provided by the database show CLI command. ASTERISK-30136 #close Change-Id: I3be9425e53be71f24303fdd4d2923c14e84337e6
1 parent b910857 commit e1e3e17

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

doc/CHANGES-staging/db_prefix.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Subject: db
2+
3+
The DBPrefixGet AMI action now allows retrieving
4+
all of the DB keys beginning with a particular
5+
prefix.

main/db.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@
6565
<description>
6666
</description>
6767
</manager>
68+
<manager name="DBGetTree" language="en_US">
69+
<synopsis>
70+
Get DB entries, optionally at a particular family/key
71+
</synopsis>
72+
<syntax>
73+
<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
74+
<parameter name="Family" required="false" />
75+
<parameter name="Key" required="false" />
76+
</syntax>
77+
<description>
78+
</description>
79+
</manager>
6880
<manager name="DBPut" language="en_US">
6981
<synopsis>
7082
Put DB entry.
@@ -979,6 +991,70 @@ static int manager_dbget(struct mansession *s, const struct message *m)
979991
return 0;
980992
}
981993

994+
static int manager_db_tree_get(struct mansession *s, const struct message *m)
995+
{
996+
char prefix[MAX_DB_FIELD];
997+
char idText[256];
998+
const char *id = astman_get_header(m,"ActionID");
999+
const char *family = astman_get_header(m, "Family");
1000+
const char *key = astman_get_header(m, "Key");
1001+
sqlite3_stmt *stmt = gettree_stmt;
1002+
1003+
if (!ast_strlen_zero(family) && !ast_strlen_zero(key)) {
1004+
/* Family and key tree */
1005+
snprintf(prefix, sizeof(prefix), "/%s/%s", family, key);
1006+
} else if (!ast_strlen_zero(family)) {
1007+
/* Family only */
1008+
snprintf(prefix, sizeof(prefix), "/%s", family);
1009+
} else {
1010+
/* Neither */
1011+
prefix[0] = '\0';
1012+
stmt = gettree_all_stmt;
1013+
}
1014+
1015+
idText[0] = '\0';
1016+
if (!ast_strlen_zero(id)) {
1017+
snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id);
1018+
}
1019+
1020+
ast_mutex_lock(&dblock);
1021+
if (!ast_strlen_zero(prefix) && (sqlite3_bind_text(stmt, 1, prefix, -1, SQLITE_STATIC) != SQLITE_OK)) {
1022+
ast_log(LOG_WARNING, "Couldn't bind %s to stmt: %s\n", prefix, sqlite3_errmsg(astdb));
1023+
sqlite3_reset(stmt);
1024+
ast_mutex_unlock(&dblock);
1025+
astman_send_error(s, m, "Unable to search database");
1026+
return 0;
1027+
}
1028+
1029+
astman_send_listack(s, m, "Result will follow", "start");
1030+
1031+
while (sqlite3_step(stmt) == SQLITE_ROW) {
1032+
const char *key_s, *value_s;
1033+
if (!(key_s = (const char *) sqlite3_column_text(stmt, 0))) {
1034+
ast_log(LOG_WARNING, "Skipping invalid key!\n");
1035+
continue;
1036+
}
1037+
if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) {
1038+
ast_log(LOG_WARNING, "Skipping invalid value!\n");
1039+
continue;
1040+
}
1041+
astman_append(s, "Event: DBGetTreeResponse\r\n"
1042+
"Key: %s\r\n"
1043+
"Val: %s\r\n"
1044+
"%s"
1045+
"\r\n",
1046+
key_s, value_s, idText);
1047+
}
1048+
1049+
sqlite3_reset(stmt);
1050+
ast_mutex_unlock(&dblock);
1051+
1052+
astman_send_list_complete_start(s, m, "DBGetTreeComplete", 1);
1053+
astman_send_list_complete_end(s);
1054+
1055+
return 0;
1056+
}
1057+
9821058
static int manager_dbdel(struct mansession *s, const struct message *m)
9831059
{
9841060
const char *family = astman_get_header(m, "Family");
@@ -1091,6 +1167,7 @@ static void astdb_atexit(void)
10911167
{
10921168
ast_cli_unregister_multiple(cli_database, ARRAY_LEN(cli_database));
10931169
ast_manager_unregister("DBGet");
1170+
ast_manager_unregister("DBGetTree");
10941171
ast_manager_unregister("DBPut");
10951172
ast_manager_unregister("DBDel");
10961173
ast_manager_unregister("DBDelTree");
@@ -1126,6 +1203,7 @@ int astdb_init(void)
11261203
ast_register_atexit(astdb_atexit);
11271204
ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database));
11281205
ast_manager_register_xml_core("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget);
1206+
ast_manager_register_xml_core("DBGetTree", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_db_tree_get);
11291207
ast_manager_register_xml_core("DBPut", EVENT_FLAG_SYSTEM, manager_dbput);
11301208
ast_manager_register_xml_core("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel);
11311209
ast_manager_register_xml_core("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree);

0 commit comments

Comments
 (0)