|
@@ -66,6 +66,7 @@ int ht_param(modparam_t type, void* val);
|
|
|
|
|
|
static struct mi_root* ht_mi_reload(struct mi_root* cmd_tree, void* param);
|
|
static struct mi_root* ht_mi_reload(struct mi_root* cmd_tree, void* param);
|
|
static struct mi_root* ht_mi_dump(struct mi_root* cmd_tree, void* param);
|
|
static struct mi_root* ht_mi_dump(struct mi_root* cmd_tree, void* param);
|
|
|
|
+static struct mi_root* ht_mi_delete(struct mi_root* cmd_tree, void* param);
|
|
|
|
|
|
static pv_export_t mod_pvs[] = {
|
|
static pv_export_t mod_pvs[] = {
|
|
{ {"sht", sizeof("sht")-1}, PVT_OTHER, pv_get_ht_cell, pv_set_ht_cell,
|
|
{ {"sht", sizeof("sht")-1}, PVT_OTHER, pv_get_ht_cell, pv_set_ht_cell,
|
|
@@ -87,6 +88,7 @@ static pv_export_t mod_pvs[] = {
|
|
static mi_export_t mi_cmds[] = {
|
|
static mi_export_t mi_cmds[] = {
|
|
{ "sht_reload", ht_mi_reload, 0, 0, 0},
|
|
{ "sht_reload", ht_mi_reload, 0, 0, 0},
|
|
{ "sht_dump", ht_mi_dump, 0, 0, 0},
|
|
{ "sht_dump", ht_mi_dump, 0, 0, 0},
|
|
|
|
+ { "sht_delete", ht_mi_delete, 0, 0, 0},
|
|
{ 0, 0, 0, 0, 0}
|
|
{ 0, 0, 0, 0, 0}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -414,6 +416,39 @@ static struct mi_root* ht_mi_reload(struct mi_root* cmd_tree, void* param)
|
|
return init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
|
|
return init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static struct mi_root* ht_mi_delete(struct mi_root* cmd_tree, void* param) {
|
|
|
|
+ struct mi_node *node;
|
|
|
|
+ str *htname, *key;
|
|
|
|
+ ht_t *ht;
|
|
|
|
+
|
|
|
|
+ node = cmd_tree->node.kids;
|
|
|
|
+ if (!node)
|
|
|
|
+ goto param_err;
|
|
|
|
+
|
|
|
|
+ htname = &node->value;
|
|
|
|
+ if (!htname->len)
|
|
|
|
+ goto param_err;
|
|
|
|
+
|
|
|
|
+ node = node->next;
|
|
|
|
+ if (!node)
|
|
|
|
+ goto param_err;
|
|
|
|
+
|
|
|
|
+ key = &node->value;
|
|
|
|
+ if (!key->len)
|
|
|
|
+ goto param_err;
|
|
|
|
+
|
|
|
|
+ ht = ht_get_table(htname);
|
|
|
|
+ if (!ht)
|
|
|
|
+ return init_mi_tree(404, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
|
|
|
|
+
|
|
|
|
+ ht_del_cell(ht, key);
|
|
|
|
+
|
|
|
|
+ return init_mi_tree(200, MI_OK_S, MI_OK_LEN);
|
|
|
|
+
|
|
|
|
+param_err:
|
|
|
|
+ return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct mi_root* ht_mi_dump(struct mi_root* cmd_tree, void* param)
|
|
static struct mi_root* ht_mi_dump(struct mi_root* cmd_tree, void* param)
|
|
{
|
|
{
|
|
struct mi_node* node;
|
|
struct mi_node* node;
|
|
@@ -487,6 +522,27 @@ static const char* htable_dump_doc[2] = {
|
|
"Dump the contents of hash table.",
|
|
"Dump the contents of hash table.",
|
|
0
|
|
0
|
|
};
|
|
};
|
|
|
|
+static const char* htable_delete_doc[2] = {
|
|
|
|
+ "Delete one key from a hash table.",
|
|
|
|
+ 0
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void htable_rpc_delete(rpc_t* rpc, void* c) {
|
|
|
|
+ str htname, keyname;
|
|
|
|
+ ht_t *ht;
|
|
|
|
+
|
|
|
|
+ if (rpc->scan(c, "SS", &htname, &keyname) < 2) {
|
|
|
|
+ rpc->fault(c, 500, "Not enough parameters (htable name & key name");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ ht = ht_get_table(&htname);
|
|
|
|
+ if (!ht) {
|
|
|
|
+ rpc->fault(c, 500, "No such htable");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ht_del_cell(ht, &keyname);
|
|
|
|
+}
|
|
|
|
|
|
static void htable_rpc_dump(rpc_t* rpc, void* c)
|
|
static void htable_rpc_dump(rpc_t* rpc, void* c)
|
|
{
|
|
{
|
|
@@ -568,6 +624,7 @@ error:
|
|
|
|
|
|
rpc_export_t htable_rpc[] = {
|
|
rpc_export_t htable_rpc[] = {
|
|
{"htable.dump", htable_rpc_dump, htable_dump_doc, 0},
|
|
{"htable.dump", htable_rpc_dump, htable_dump_doc, 0},
|
|
|
|
+ {"htable.delete", htable_rpc_delete, htable_delete_doc, 0},
|
|
{0, 0, 0, 0}
|
|
{0, 0, 0, 0}
|
|
};
|
|
};
|
|
|
|
|