Module: sip-router Branch: master Commit: 4b68b3ca0aef58f21e46f06944fa31391ef22fe5 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4b68b3ca...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Thu May 31 19:15:52 2012 +0200
usrloc(k): option to check if contact DB UPDATE was successful
- use DB API affected_rows() when available to detect if the DB UPDATE operation for a contact was successful, if not, do an INSERT instead - behaviour controlled by parameter db_check_update, default is 0 (no check for affected rows and no insert -- backward compatible) - closes items FS#41 and FS#226
---
modules_k/usrloc/README | 31 +++++++++++++++++++++++++------ modules_k/usrloc/doc/usrloc_admin.xml | 24 ++++++++++++++++++++++++ modules_k/usrloc/ucontact.c | 9 +++++++++ modules_k/usrloc/ul_mod.c | 2 ++ modules_k/usrloc/ul_mod.h | 1 + 5 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/modules_k/usrloc/README b/modules_k/usrloc/README index 06094af..9b9cc51 100644 --- a/modules_k/usrloc/README +++ b/modules_k/usrloc/README @@ -64,7 +64,8 @@ Bogdan-Andrei Iancu 3.26. hash_size (integer) 3.27. preload (string) 3.28. db_update_as_insert (string) - 3.29. timer_procs (string) + 3.29. db_check_update (string) + 3.30. timer_procs (string)
4. Functions 5. MI Commands @@ -137,7 +138,8 @@ Bogdan-Andrei Iancu 1.26. Set hash_size parameter 1.27. Set preload parameter 1.28. Set db_update_as_insert parameter - 1.29. Set timer_procs parameter + 1.29. Set db_check_update parameter + 1.30. Set timer_procs parameter
Chapter 1. Admin Guide
@@ -182,7 +184,8 @@ Chapter 1. Admin Guide 3.26. hash_size (integer) 3.27. preload (string) 3.28. db_update_as_insert (string) - 3.29. timer_procs (string) + 3.29. db_check_update (string) + 3.30. timer_procs (string)
4. Functions 5. MI Commands @@ -287,7 +290,8 @@ Chapter 1. Admin Guide 3.26. hash_size (integer) 3.27. preload (string) 3.28. db_update_as_insert (string) - 3.29. timer_procs (string) + 3.29. db_check_update (string) + 3.30. timer_procs (string)
3.1. nat_bflag (integer)
@@ -667,7 +671,22 @@ modparam("usrloc", "preload", "location") modparam("usrloc", "db_update_as_insert", 1) ...
-3.29. timer_procs (string) +3.29. db_check_update (string) + + Set this parameter to 1 if you want to do DB INSERT if the number of + affected rows by contact DB UPDATE operation is 0. The database module + driver has to implement affected_rows() DB API function, otherwise this + parameter is ignored - e.g., MySQL and Postgres DB connectors offer + affected_rows(). + + Default value is "0" (no DB INSERT). + + Example 1.29. Set db_check_update parameter +... +modparam("usrloc", "db_check_update", 1) +... + +3.30. timer_procs (string)
Number of timer processes to be started by module. Timer processes take care of checking expired records and syncronization with database. If @@ -676,7 +695,7 @@ modparam("usrloc", "db_update_as_insert", 1)
Default value is "0".
- Example 1.29. Set timer_procs parameter + Example 1.30. Set timer_procs parameter ... modparam("usrloc", "timer_procs", 4) ... diff --git a/modules_k/usrloc/doc/usrloc_admin.xml b/modules_k/usrloc/doc/usrloc_admin.xml index 6624705..ddcf122 100644 --- a/modules_k/usrloc/doc/usrloc_admin.xml +++ b/modules_k/usrloc/doc/usrloc_admin.xml @@ -775,6 +775,30 @@ modparam("usrloc", "db_update_as_insert", 1) </example> </section>
+ <section id="db_check_update"> + <title><varname>db_check_update</varname> (string)</title> + <para> + Set this parameter to 1 if you want to do DB INSERT if the number + of affected rows by contact DB UPDATE operation is 0. The + database module driver has to implement affected_rows() DB API + function, otherwise this parameter is ignored - e.g., MySQL and + Postgres DB connectors offer affected_rows(). + </para> + <para> + <emphasis> + Default value is <quote>0</quote> (no DB INSERT). + </emphasis> + </para> + <example> + <title>Set <varname>db_check_update</varname> parameter</title> + <programlisting format="linespecific"> +... +modparam("usrloc", "db_check_update", 1) +... +</programlisting> + </example> + </section> + <section id="timer_procs"> <title><varname>timer_procs</varname> (string)</title> <para> diff --git a/modules_k/usrloc/ucontact.c b/modules_k/usrloc/ucontact.c index 0f385bb..2d07a26 100644 --- a/modules_k/usrloc/ucontact.c +++ b/modules_k/usrloc/ucontact.c @@ -728,6 +728,15 @@ int db_update_ucontact(ucontact_t* _c) return -1; }
+ if (ul_db_check_update==1 && ul_dbf.affected_rows) { + /* supposed to be an UPDATE, but if affected rows is 0, then try + * to do an INSERT */ + if(ul_dbf.affected_rows(ul_dbh)==0) { + LM_DBG("affected rows by UPDATE was 0, doing an INSERT\n"); + return db_insert_ucontact(_c); + } + } + return 0; }
diff --git a/modules_k/usrloc/ul_mod.c b/modules_k/usrloc/ul_mod.c index ccd94e8..7cbf257 100644 --- a/modules_k/usrloc/ul_mod.c +++ b/modules_k/usrloc/ul_mod.c @@ -107,6 +107,7 @@ extern int bind_usrloc(usrloc_api_t* api); extern int ul_locks_no; int ul_db_update_as_insert = 0; int ul_timer_procs = 0; +int ul_db_check_update = 0;
/* sruid to get internal uid for mi/rpc commands */ sruid_t _ul_sruid; @@ -194,6 +195,7 @@ static param_export_t params[] = { {"preload", STR_PARAM|USE_FUNC_PARAM, (void*)ul_preload_param}, {"db_update_as_insert", INT_PARAM, &ul_db_update_as_insert}, {"timer_procs", INT_PARAM, &ul_timer_procs}, + {"db_check_update", INT_PARAM, &ul_db_check_update}, {0, 0, 0} };
diff --git a/modules_k/usrloc/ul_mod.h b/modules_k/usrloc/ul_mod.h index d01e504..30b8885 100644 --- a/modules_k/usrloc/ul_mod.h +++ b/modules_k/usrloc/ul_mod.h @@ -73,6 +73,7 @@ extern int cseq_delay; extern int ul_fetch_rows; extern int ul_hash_size; extern int ul_db_update_as_insert; +extern int ul_db_check_update;
extern db1_con_t* ul_dbh; /* Database connection handle */ extern db_func_t ul_dbf;