[sr-dev] git:master: acc: new parameter acc_time_format

Daniel-Constantin Mierla miconda at gmail.com
Fri Oct 4 12:15:40 CEST 2013


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Oct  4 12:02:32 2013 +0200

acc: new parameter acc_time_format

- specify the format to print time as string for acc_time_mode=3 (using
  localtime) and acc_time_mode=4 (using gmtime)
- default value is "%Y-%m-%d %H:%M:%S"

---

 modules/acc/acc.c     |   44 ++++++++++++++++++++++++++++++++++++++++----
 modules/acc/acc_mod.c |    2 ++
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/modules/acc/acc.c b/modules/acc/acc.c
index 8a6f3cc..efaebc0 100644
--- a/modules/acc/acc.c
+++ b/modules/acc/acc.c
@@ -75,6 +75,7 @@
 extern struct acc_extra *log_extra;
 extern struct acc_extra *leg_info;
 extern struct acc_enviroment acc_env;
+extern char *acc_time_format;
 
 #ifdef RAD_ACC
 extern struct acc_extra *rad_extra;
@@ -99,6 +100,9 @@ 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];
 
+#define ACC_TIME_FORMAT_SIZE	128
+static char acc_time_format_buf[ACC_TIME_FORMAT_SIZE];
+
 /********************************************
  *        acc CORE function
  ********************************************/
@@ -226,6 +230,7 @@ int acc_log_request( struct sip_msg *rq)
 	int n;
 	int m;
 	int i;
+	struct tm *t;
 
 	/* get default values */
 	m = core2strar( rq, val_arr, int_arr, type_arr);
@@ -279,19 +284,34 @@ 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_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts,
 			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",
-			acc_env.text.len, acc_env.text.s,(unsigned long) acc_env.ts,
+			acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts,
 			acc_time_attr.s,
 			(((double)(acc_env.tv.tv_sec * 1000)
 							+ (acc_env.tv.tv_usec / 1000)) / 1000),
 			log_msg);
+	} else if(acc_time_mode==3 || acc_time_mode==4) {
+		if(acc_time_mode==3) {
+			t = localtime(&acc_env.ts);
+		} else {
+			t = gmtime(&acc_env.ts);
+		}
+		if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE,
+					acc_time_format, t)<0) {
+			acc_time_format_buf[0] = '\0';
+		}
+		LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%s%s",
+			acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts,
+			acc_time_attr.s,
+			acc_time_format_buf,
+			log_msg);
 	} else {
 		LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu%s",
-			acc_env.text.len, acc_env.text.s,(unsigned long) acc_env.ts,
+			acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts,
 			log_msg);
 	}
 
@@ -337,7 +357,8 @@ static void acc_db_init_keys(void)
 	db_keys[n++] = &acc_sipreason_col;
 	db_keys[n++] = &acc_time_col;
 	time_idx = n-1;
-	if(acc_time_mode==1 || acc_time_mode==2) {
+	if(acc_time_mode==1 || acc_time_mode==2
+			|| acc_time_mode==3 || acc_time_mode==4) {
 		db_keys[n++] = &acc_time_attr;
 		if(acc_time_mode==1) {
 			db_keys[n++] = &acc_time_exten;
@@ -363,6 +384,8 @@ static void acc_db_init_keys(void)
 		VAL_TYPE(db_vals+time_idx+2)=DB1_INT;
 	} else if(acc_time_mode==2) {
 		VAL_TYPE(db_vals+time_idx+1)=DB1_DOUBLE;
+	} else if(acc_time_mode==3 || acc_time_mode==4) {
+		VAL_TYPE(db_vals+time_idx+1)=DB1_STRING;
 	}
 }
 
@@ -414,6 +437,7 @@ int acc_db_request( struct sip_msg *rq)
 	int m;
 	int n;
 	int i;
+	struct tm *t;
 
 	/* formated database columns */
 	m = core2strar( rq, val_arr, int_arr, type_arr );
@@ -432,6 +456,18 @@ int acc_db_request( struct sip_msg *rq)
 		VAL_DOUBLE(db_vals+(m++)) = ((double)(acc_env.tv.tv_sec * 1000)
 							+ (acc_env.tv.tv_usec / 1000)) / 1000;
 		i++;
+	} else if(acc_time_mode==3 || acc_time_mode==4) {
+		if(acc_time_mode==3) {
+			t = localtime(&acc_env.ts);
+		} else {
+			t = gmtime(&acc_env.ts);
+		}
+		if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE,
+					acc_time_format, t)<0) {
+			acc_time_format_buf[0] = '\0';
+		}
+		VAL_STRING(db_vals+(m++)) = acc_time_format_buf;
+		i++;
 	}
 
 	/* extra columns */
diff --git a/modules/acc/acc_mod.c b/modules/acc/acc_mod.c
index a36ecbe..2fb9258 100644
--- a/modules/acc/acc_mod.c
+++ b/modules/acc/acc_mod.c
@@ -109,6 +109,7 @@ unsigned short failed_filter[MAX_FAILED_FILTER_COUNT + 1];
 static char* leg_info_str = 0;	/*!< multi call-leg support */
 struct acc_extra *leg_info = 0;
 int acc_prepare_flag = -1; /*!< should the request be prepared for later acc */
+char *acc_time_format = "%Y-%m-%d %H:%M:%S";
 
 /* ----- time mode variables ------- */
 /*! \name AccTimeModeVariables  Time Mode Variables */
@@ -309,6 +310,7 @@ static param_export_t params[] = {
 	{"time_attr",            PARAM_STR, &acc_time_attr        },
 	{"time_exten",           PARAM_STR, &acc_time_exten       },
 	{"cdrs_table",           PARAM_STR, &acc_cdrs_table       },
+	{"time_format",          STR_PARAM, &acc_time_format      },
 	{0,0,0}
 };
 




More information about the sr-dev mailing list