|
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