Module: kamailio Branch: master Commit: df659d2ee44eca688507aab48eb22260ef3577bd URL: https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb22260...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@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/df659d2ee44eca688507aab48eb22260... Patch: https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb22260...
---
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;