Module: sip-router Branch: master Commit: 2f3ff59394450fa76cdbb46db4f8f605d6ad471e URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2f3ff593...
Author: Richard Fuchs rfuchs@sipwise.com Committer: Andreas Granig agranig@sipwise.com Date: Fri Apr 20 15:59:28 2012 +0200
htable(k): Implement "delete" mi/rpc function.
- Lets you delete specific keys from an htable via the MI or RPC interface.
---
modules_k/htable/doc/htable_admin.xml | 37 ++++++++++++++++++++- modules_k/htable/htable.c | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-)
diff --git a/modules_k/htable/doc/htable_admin.xml b/modules_k/htable/doc/htable_admin.xml index 09ee23c..9749c9b 100644 --- a/modules_k/htable/doc/htable_admin.xml +++ b/modules_k/htable/doc/htable_admin.xml @@ -620,7 +620,7 @@ sht_rm_value_re("ha=>.*"); _empty_line_ </programlisting> </section> - <section> + <section> <title> <function moreinfo="none">sht_dump</function> </title> @@ -635,12 +635,45 @@ sht_rm_value_re("ha=>.*"); <para> MI FIFO Command Format: </para> - <programlisting format="linespecific"> + <programlisting format="linespecific"> :sht_dump:_reply_fifo_file_ _hash_table_name_ _empty_line_ </programlisting> </section> + <section> + <title> + <function moreinfo="none">sht_delete</function> + </title> + <para> + Delete a key from a hash table via MI. + </para> + <para> + Name: <emphasis>sht_delete</emphasis> + </para> + <para>Parameters:</para> + <itemizedlist> + <listitem><para><emphasis>_hash_table_name: </emphasis>The table name to delete the key from</para></listitem> + <listitem><para><emphasis>_key_name: </emphasis>The key to delete from the htable</para></listitem> + </itemizedlist> + + <para> + MI FIFO Command Format: + </para> + <programlisting format="linespecific"> + :sht_delete:_reply_fifo_file_ + _hash_table_name_ + _key_name_ + _empty_line_ + </programlisting> + + <para> + Example (note the quoting when executing it via FIFO): + </para> + <programlisting format="linespecific"> + kamctl fifo sht_delete auth '"user@example.org::last_auth"' + </programlisting> + </section> </section> <section> <title>Event routes</title> diff --git a/modules_k/htable/htable.c b/modules_k/htable/htable.c index 66bde1c..702bda9 100644 --- a/modules_k/htable/htable.c +++ b/modules_k/htable/htable.c @@ -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_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[] = { { {"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[] = { { "sht_reload", ht_mi_reload, 0, 0, 0}, { "sht_dump", ht_mi_dump, 0, 0, 0}, + { "sht_delete", ht_mi_delete, 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); }
+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) { struct mi_node* node; @@ -487,6 +522,27 @@ static const char* htable_dump_doc[2] = { "Dump the contents of hash table.", 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) { @@ -568,6 +624,7 @@ error:
rpc_export_t htable_rpc[] = { {"htable.dump", htable_rpc_dump, htable_dump_doc, 0}, + {"htable.delete", htable_rpc_delete, htable_delete_doc, 0}, {0, 0, 0, 0} };