[sr-dev] git:master: usrloc(k): option to check if contact DB UPDATE was successful

Daniel-Constantin Mierla miconda at gmail.com
Thu May 31 19:19:09 CEST 2012


Module: sip-router
Branch: master
Commit: 4b68b3ca0aef58f21e46f06944fa31391ef22fe5
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4b68b3ca0aef58f21e46f06944fa31391ef22fe5

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at 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;




More information about the sr-dev mailing list