Module: kamailio
Branch: master
Commit: df659d2ee44eca688507aab48eb22260ef3577bd
URL:
https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb2226…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2017-05-23T02:33:19+02:00
htable: implemented starts with matching for remove functions
---
Modified: src/modules/htable/doc/htable_admin.xml
Modified: src/modules/htable/ht_api.c
Modified: src/modules/htable/ht_api.h
Modified: src/modules/htable/htable.c
---
Diff:
https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb2226…
Patch:
https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb2226…
---
diff --git a/src/modules/htable/doc/htable_admin.xml
b/src/modules/htable/doc/htable_admin.xml
index 7d31e4cc0f..6cb19907ad 100644
--- a/src/modules/htable/doc/htable_admin.xml
+++ b/src/modules/htable/doc/htable_admin.xml
@@ -788,6 +788,12 @@ sht_rm_value_re("ha=>.*");
expression.
</para>
</listitem>
+ <listitem>
+ <para>
+ <emphasis>sw</emphasis> - match the val parameter as 'starts
+ with'.
+ </para>
+ </listitem>
</itemizedlist>
<para>
All parameters can be static strings or contain variables.
@@ -822,6 +828,12 @@ sht_rm_name("ha", "re", ".*");
expression.
</para>
</listitem>
+ <listitem>
+ <para>
+ <emphasis>sw</emphasis> - match the val parameter as 'starts
+ with'.
+ </para>
+ </listitem>
</itemizedlist>
<para>
All parameters can be static strings or contain variables.
@@ -830,7 +842,7 @@ sht_rm_name("ha", "re", ".*");
This function can be used from ANY_ROUTE.
</para>
<example>
- <title><function>sht_rm_value_re</function> usage</title>
+ <title><function>sht_rm_value</function> usage</title>
<programlisting format="linespecific">
...
sht_rm_value("ha", "re", ".*");
diff --git a/src/modules/htable/ht_api.c b/src/modules/htable/ht_api.c
index 4c4ba5315b..1bbd079b30 100644
--- a/src/modules/htable/ht_api.c
+++ b/src/modules/htable/ht_api.c
@@ -1270,6 +1270,61 @@ int ht_rm_cell_re(str *sre, ht_t *ht, int mode)
return 0;
}
+int ht_rm_cell_op(str *sre, ht_t *ht, int mode, int op)
+{
+ ht_cell_t *it;
+ ht_cell_t *it0;
+ int match;
+ int i;
+
+ if(sre==NULL || sre->len<=0 || ht==NULL)
+ return -1;
+
+ for(i=0; i<ht->htsize; i++)
+ {
+ /* free entries */
+ ht_slot_lock(ht, i);
+ it = ht->entries[i].first;
+ while(it)
+ {
+ it0 = it->next;
+ match = 0;
+ if(mode==0)
+ {
+ if(op==HT_RM_OP_SW) {
+ if(sre->len<=it->name.len
+ && strncmp(it->name.s, sre->s, sre->len)==0) {
+ match = 1;
+ }
+ }
+ } else {
+ if(op==HT_RM_OP_SW) {
+ if(it->flags&AVP_VAL_STR) {
+ if(sre->len<=it->value.s.len
+ && strncmp(it->value.s.s, sre->s, sre->len)==0) {
+ match = 1;
+ }
+ }
+ }
+ }
+ if(match==1)
+ {
+ if(it->prev==NULL)
+ ht->entries[i].first = it->next;
+ else
+ it->prev->next = it->next;
+ if(it->next)
+ it->next->prev = it->prev;
+ ht->entries[i].esize--;
+ ht_cell_free(it);
+ }
+ it = it0;
+ }
+ ht_slot_unlock(ht, i);
+ }
+ return 0;
+}
+
int ht_reset_content(ht_t *ht)
{
ht_cell_t *it;
diff --git a/src/modules/htable/ht_api.h b/src/modules/htable/ht_api.h
index 8dea56d5ab..d64b68ac95 100644
--- a/src/modules/htable/ht_api.h
+++ b/src/modules/htable/ht_api.h
@@ -115,6 +115,9 @@ int ht_count_cells_re(str *sre, ht_t *ht, int mode);
ht_t *ht_get_root(void);
int ht_reset_content(ht_t *ht);
+#define HT_RM_OP_SW 1
+int ht_rm_cell_op(str *sre, ht_t *ht, int mode, int op);
+
void ht_iterator_init(void);
int ht_iterator_start(str *iname, str *hname);
int ht_iterator_next(str *iname);
diff --git a/src/modules/htable/htable.c b/src/modules/htable/htable.c
index aaa4a5c5eb..40d1a558d1 100644
--- a/src/modules/htable/htable.c
+++ b/src/modules/htable/htable.c
@@ -437,6 +437,10 @@ static int ht_rm_items(sip_msg_t* msg, str* hname, str* op, str
*val,
return -1;
}
return 1;
+ } else if(strncmp(op->s, "sw", 2)==0) {
+ if(ht_rm_cell_op(val, ht, mkey, HT_RM_OP_SW)<0) {
+ return -1;
+ }
}
LM_WARN("unsupported match operator: %.*s\n", op->len, op->s);
break;