[sr-dev] git:master: acc: for time_mode=1, save timestamp in time_attr and microsecs in time_exten

Daniel-Constantin Mierla miconda at gmail.com
Thu Sep 5 11:55:22 CEST 2013


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Thu Sep  5 11:54:03 2013 +0200

acc: for time_mode=1, save timestamp in time_attr and microsecs in time_exten

- database records stores time as datetime value
- new parameter time_exten to allow customization of attribute name

---

 modules/acc/README            |   39 ++++++++++++++++++++++++++++-----------
 modules/acc/acc.c             |   26 +++++++++++++++++---------
 modules/acc/acc_mod.c         |    2 ++
 modules/acc/acc_mod.h         |    1 +
 modules/acc/doc/acc_admin.xml |   28 ++++++++++++++++++++++++----
 5 files changed, 72 insertions(+), 24 deletions(-)

diff --git a/modules/acc/README b/modules/acc/README
index e837964..d54cd54 100644
--- a/modules/acc/README
+++ b/modules/acc/README
@@ -129,6 +129,7 @@ Sven Knoblich
               6.46. cdrs_table (str)
               6.47. time_mode (int)
               6.48. time_attr (str)
+              6.49. time_exten (str)
 
         7. Functions
 
@@ -189,10 +190,11 @@ Sven Knoblich
    1.46. cdrs_table example
    1.47. time_mode example
    1.48. time_attr example
-   1.49. acc_log_request usage
-   1.50. acc_db_request usage
-   1.51. acc_rad_request usage
-   1.52. acc_diam_request usage
+   1.49. time_exten example
+   1.50. acc_log_request usage
+   1.51. acc_db_request usage
+   1.52. acc_rad_request usage
+   1.53. acc_diam_request usage
 
 Chapter 1. Admin Guide
 
@@ -285,6 +287,7 @@ Chapter 1. Admin Guide
         6.46. cdrs_table (str)
         6.47. time_mode (int)
         6.48. time_attr (str)
+        6.49. time_exten (str)
 
    7. Functions
 
@@ -695,6 +698,7 @@ $dlg_var(callee) = $avp(callee); #callee='C'
    6.46. cdrs_table (str)
    6.47. time_mode (int)
    6.48. time_attr (str)
+   6.49. time_exten (str)
 
 6.1. early_media (integer)
 
@@ -1186,8 +1190,7 @@ modparam("acc", "cdrs_table", "acc_cdrs")
    Values can be:
      * 0 - (default), save only unix timestamp for syslog and datetime for
        database.
-     * 1 - save microseconds part (does not include the seconds in the
-       value) in time_attr.
+     * 1 - save seconds in time_attr and microseconds in time_exten.
      * 3 - save seconds.miliseconds in time_attr.
 
    Example 1.47. time_mode example
@@ -1203,8 +1206,22 @@ modparam("acc", "time_mode", 1)
      * 1 - time_attr column has to be int.
      * 2 - time_attr column has to be double.
 
+   For time_mode=1, this attribute is not written in syslog, because time
+   value is already unix timestamp, but in db accounting time value is
+   datetime and requires a function to get the timestamp.
+
    Example 1.48. time_attr example
-modparam("acc", "time_attr", "micorsecs")
+modparam("acc", "time_attr", "seconds")
+
+6.49. time_exten (str)
+
+   Name of the syslog attribute or database column where to store extended
+   value related to the time of event.
+
+   It is used now only for time_mode=1 and database column has to be int:
+
+   Example 1.49. time_exten example
+modparam("acc", "time_exten", "micorsecs")
 
 7. Functions
 
@@ -1225,7 +1242,7 @@ modparam("acc", "time_attr", "micorsecs")
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.49. acc_log_request usage
+   Example 1.50. acc_log_request usage
 ...
 acc_log_request("Some comment");
 ...
@@ -1243,7 +1260,7 @@ acc_log_request("Some comment");
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.50. acc_db_request usage
+   Example 1.51. acc_db_request usage
 ...
 acc_db_request("Some comment", "SomeTable");
 acc_db_request("Some comment", "acc_$time(year)_$time(mon)");
@@ -1259,7 +1276,7 @@ acc_db_request("Some comment", "acc_$time(year)_$time(mon)");
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.51. acc_rad_request usage
+   Example 1.52. acc_rad_request usage
 ...
 acc_rad_request("Some comment");
 ...
@@ -1274,7 +1291,7 @@ acc_rad_request("Some comment");
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.52. acc_diam_request usage
+   Example 1.53. acc_diam_request usage
 ...
 acc_diam_request("Some comment");
 ...
diff --git a/modules/acc/acc.c b/modules/acc/acc.c
index 2849809..8a6f3cc 100644
--- a/modules/acc/acc.c
+++ b/modules/acc/acc.c
@@ -93,10 +93,11 @@ extern struct acc_extra *db_extra;
 #endif
 
 /* arrays used to collect the values before being
- * pushed to the storage backend (whatever used) */
-static str val_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+2];
-static int int_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+2];
-static char type_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+2];
+ * pushed to the storage backend (whatever used)
+ * (3 = datetime + max 2 from time_mode) */
+static str val_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+3];
+static int int_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+3];
+static char type_arr[ACC_CORE_LEN+MAX_ACC_EXTRA+MAX_ACC_LEG+3];
 
 /********************************************
  *        acc CORE function
@@ -279,7 +280,7 @@ int acc_log_request( struct sip_msg *rq)
 	if(acc_time_mode==1) {
 		LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%u%s",
 			acc_env.text.len, acc_env.text.s,(unsigned long) acc_env.ts,
-			acc_time_attr.s, (unsigned int)acc_env.tv.tv_usec,
+			acc_time_exten.s, (unsigned int)acc_env.tv.tv_usec,
 			log_msg);
 	} else if(acc_time_mode==2) {
 		LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%.3f%s",
@@ -304,9 +305,10 @@ int acc_log_request( struct sip_msg *rq)
 
 #ifdef SQL_ACC
 
-/* caution: keys need to be aligned to core format */
-static db_key_t db_keys[ACC_CORE_LEN+2+MAX_ACC_EXTRA+MAX_ACC_LEG];
-static db_val_t db_vals[ACC_CORE_LEN+2+MAX_ACC_EXTRA+MAX_ACC_LEG];
+/* caution: keys need to be aligned to core format
+ * (3 = datetime + max 2 from time_mode) */
+static db_key_t db_keys[ACC_CORE_LEN+3+MAX_ACC_EXTRA+MAX_ACC_LEG];
+static db_val_t db_vals[ACC_CORE_LEN+3+MAX_ACC_EXTRA+MAX_ACC_LEG];
 
 
 int acc_get_db_handlers(void **vf, void **vh) {
@@ -336,7 +338,10 @@ static void acc_db_init_keys(void)
 	db_keys[n++] = &acc_time_col;
 	time_idx = n-1;
 	if(acc_time_mode==1 || acc_time_mode==2) {
-		db_keys[n++] = &acc_time_attr;;
+		db_keys[n++] = &acc_time_attr;
+		if(acc_time_mode==1) {
+			db_keys[n++] = &acc_time_exten;
+		}
 	}
 
 	/* init the extra db keys */
@@ -355,6 +360,7 @@ static void acc_db_init_keys(void)
 	VAL_TYPE(db_vals+time_idx)=DB1_DATETIME;
 	if(acc_time_mode==1) {
 		VAL_TYPE(db_vals+time_idx+1)=DB1_INT;
+		VAL_TYPE(db_vals+time_idx+2)=DB1_INT;
 	} else if(acc_time_mode==2) {
 		VAL_TYPE(db_vals+time_idx+1)=DB1_DOUBLE;
 	}
@@ -418,6 +424,8 @@ int acc_db_request( struct sip_msg *rq)
 	VAL_TIME(db_vals+(m++)) = acc_env.ts;
 	/* extra time value */
 	if(acc_time_mode==1) {
+		VAL_INT(db_vals+(m++)) = (int)acc_env.tv.tv_sec;
+		i++;
 		VAL_INT(db_vals+(m++)) = (int)acc_env.tv.tv_usec;
 		i++;
 	} else if(acc_time_mode==2) {
diff --git a/modules/acc/acc_mod.c b/modules/acc/acc_mod.c
index 1f7540b..a36ecbe 100644
--- a/modules/acc/acc_mod.c
+++ b/modules/acc/acc_mod.c
@@ -116,6 +116,7 @@ int acc_prepare_flag = -1; /*!< should the request be prepared for later acc */
 
 int acc_time_mode  = 0;
 str acc_time_attr  = str_init("time_attr");
+str acc_time_exten  = str_init("time_exten");
 
 /*@}*/
 
@@ -306,6 +307,7 @@ static param_export_t params[] = {
 	/* time-mode-specific */
 	{"time_mode",            INT_PARAM, &acc_time_mode        },
 	{"time_attr",            PARAM_STR, &acc_time_attr        },
+	{"time_exten",           PARAM_STR, &acc_time_exten       },
 	{"cdrs_table",           PARAM_STR, &acc_cdrs_table       },
 	{0,0,0}
 };
diff --git a/modules/acc/acc_mod.h b/modules/acc/acc_mod.h
index b291abd..98cef33 100644
--- a/modules/acc/acc_mod.h
+++ b/modules/acc/acc_mod.h
@@ -99,6 +99,7 @@ extern int acc_db_insert_mode;
 /* time mode */
 extern int acc_time_mode;
 extern str acc_time_attr;
+extern str acc_time_exten;
 
 
 #endif
diff --git a/modules/acc/doc/acc_admin.xml b/modules/acc/doc/acc_admin.xml
index 78f025a..6ebb9a9 100644
--- a/modules/acc/doc/acc_admin.xml
+++ b/modules/acc/doc/acc_admin.xml
@@ -1278,8 +1278,8 @@ modparam("acc", "cdrs_table", "acc_cdrs")
 				timestamp for syslog and datetime for database.</para>
 		</listitem>
 		<listitem>
-			<para><emphasis>1</emphasis> - save microseconds part (does not
-				include the seconds in the value) in time_attr.</para>
+			<para><emphasis>1</emphasis> - save seconds in time_attr and
+				microseconds in time_exten.</para>
 		</listitem>
 		<listitem>
 			<para><emphasis>3</emphasis> - save seconds.miliseconds
@@ -1312,11 +1312,31 @@ modparam("acc", "time_mode", 1)
 			<para><emphasis>2</emphasis> - time_attr column has to be double.</para>
 		</listitem>
 		</itemizedlist>
-
+		<para>
+		For time_mode=1, this attribute is not written in syslog, because time
+		value is already unix timestamp, but in db accounting time value is
+		datetime and requires a function to get the timestamp.
+		</para>
 		<example>
 		<title>time_attr example</title>
 		<programlisting format="linespecific">
-modparam("acc", "time_attr", "micorsecs")
+modparam("acc", "time_attr", "seconds")
+</programlisting>
+		</example>
+	</section>
+	<section id="acc.p.time_exten">
+		<title><varname>time_exten</varname> (str)</title>
+		<para>
+		Name of the syslog attribute or database column where to store extended
+		value related to the time of event.
+		</para>
+		<para>
+		It is used now only for time_mode=1 and database column has to be int:
+		</para>
+		<example>
+		<title>time_exten example</title>
+		<programlisting format="linespecific">
+modparam("acc", "time_exten", "micorsecs")
 </programlisting>
 		</example>
 	</section>




More information about the sr-dev mailing list