Module: kamailio
Branch: master
Commit: df659d2ee44eca688507aab48eb22260ef3577bd
URL: 
https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb22260ef3577bd

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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/df659d2ee44eca688507aab48eb22260ef3577bd.diff
Patch: 
https://github.com/kamailio/kamailio/commit/df659d2ee44eca688507aab48eb22260ef3577bd.patch

---

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;


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to