|
65 | 65 | <description>
|
66 | 66 | </description>
|
67 | 67 | </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> |
68 | 80 | <manager name="DBPut" language="en_US">
|
69 | 81 | <synopsis>
|
70 | 82 | Put DB entry.
|
@@ -979,6 +991,70 @@ static int manager_dbget(struct mansession *s, const struct message *m)
|
979 | 991 | return 0;
|
980 | 992 | }
|
981 | 993 |
|
| 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 | + |
982 | 1058 | static int manager_dbdel(struct mansession *s, const struct message *m)
|
983 | 1059 | {
|
984 | 1060 | const char *family = astman_get_header(m, "Family");
|
@@ -1091,6 +1167,7 @@ static void astdb_atexit(void)
|
1091 | 1167 | {
|
1092 | 1168 | ast_cli_unregister_multiple(cli_database, ARRAY_LEN(cli_database));
|
1093 | 1169 | ast_manager_unregister("DBGet");
|
| 1170 | + ast_manager_unregister("DBGetTree"); |
1094 | 1171 | ast_manager_unregister("DBPut");
|
1095 | 1172 | ast_manager_unregister("DBDel");
|
1096 | 1173 | ast_manager_unregister("DBDelTree");
|
@@ -1126,6 +1203,7 @@ int astdb_init(void)
|
1126 | 1203 | ast_register_atexit(astdb_atexit);
|
1127 | 1204 | ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database));
|
1128 | 1205 | 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); |
1129 | 1207 | ast_manager_register_xml_core("DBPut", EVENT_FLAG_SYSTEM, manager_dbput);
|
1130 | 1208 | ast_manager_register_xml_core("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel);
|
1131 | 1209 | ast_manager_register_xml_core("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree);
|
|
0 commit comments