瀏覽代碼

Merge pull request #125 from mikomarrache/patch-7

acc: use appropriate types for core values
Daniel-Constantin Mierla 10 年之前
父節點
當前提交
f2b468ab50
共有 3 個文件被更改,包括 56 次插入16 次删除
  1. 7 9
      lib/srdb1/schema/acc_cdrs.xml
  2. 1 1
      modules/acc/acc_api.h
  3. 48 6
      modules/acc/acc_cdr.c

+ 7 - 9
lib/srdb1/schema/acc_cdrs.xml

@@ -9,7 +9,7 @@
 
 
 <table id="acc_cdrs" xmlns:db="http://docbook.org/ns/docbook">
 <table id="acc_cdrs" xmlns:db="http://docbook.org/ns/docbook">
     <name>acc_cdrs</name>
     <name>acc_cdrs</name>
-    <version>1</version>
+    <version>2</version>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type>
     <description>
     <description>
         <db:para>This table is used by the ACC module to report on CDRs relying on dialog callbacks. More information is available at: &KAMAILIO_MOD_DOC;acc.html
         <db:para>This table is used by the ACC module to report on CDRs relying on dialog callbacks. More information is available at: &KAMAILIO_MOD_DOC;acc.html
@@ -28,24 +28,22 @@
 
 
 	<column id="start_time">
 	<column id="start_time">
         <name>start_time</name>
         <name>start_time</name>
-        <type>string</type>
-        <size>32</size>
-        <description>Start time</description>
+        <type>datetime</type>
+        <description>Start date and time</description>
         <default/>
         <default/>
     </column>
     </column>
 
 
     <column>
     <column>
         <name>end_time</name>
         <name>end_time</name>
-        <type>string</type>
-        <size>32</size>
-        <description>End time</description>
+        <type>datetime</type>
+        <description>End date and time</description>
         <default/>
         <default/>
     </column>
     </column>
 
 
     <column>
     <column>
         <name>duration</name>
         <name>duration</name>
-        <type>string</type>
-        <size>32</size>
+        <type>float</type>
+        <size>10,3</size>
         <description>Duration</description>
         <description>Duration</description>
         <default/>
         <default/>
     </column>
     </column>

+ 1 - 1
modules/acc/acc_api.h

@@ -110,7 +110,7 @@ typedef struct acc_engine {
 #define ACC_CORE_LEN  6
 #define ACC_CORE_LEN  6
 
 
 
 
-enum {TYPE_NULL = 0, TYPE_INT, TYPE_STR};
+enum {TYPE_NULL = 0, TYPE_INT, TYPE_STR, TYPE_DOUBLE, TYPE_DATE};
 
 
 
 
 typedef int (*register_engine_f)(acc_engine_t *eng);
 typedef int (*register_engine_f)(acc_engine_t *eng);

+ 48 - 6
modules/acc/acc_cdr.c

@@ -90,6 +90,8 @@ extern str acc_cdrs_table;
 extern int cdr_log_enable;
 extern int cdr_log_enable;
 extern int _acc_cdr_on_failed;
 extern int _acc_cdr_on_failed;
 
 
+static int string2time( str* time_str, struct timeval* time_value);
+
 /* write all basic information to buffers(e.g. start-time ...) */
 /* write all basic information to buffers(e.g. start-time ...) */
 static int cdr_core2strar( struct dlg_cell* dlg,
 static int cdr_core2strar( struct dlg_cell* dlg,
                            str* values,
                            str* values,
@@ -111,13 +113,13 @@ static int cdr_core2strar( struct dlg_cell* dlg,
     duration = dlgb.get_dlg_var( dlg, (str*)&cdr_duration_str);
     duration = dlgb.get_dlg_var( dlg, (str*)&cdr_duration_str);
 
 
     values[0] = ( start != NULL ? *start : empty_string);
     values[0] = ( start != NULL ? *start : empty_string);
-    types[0] = ( start != NULL ? TYPE_STR : TYPE_NULL);
+    types[0] = ( start != NULL ? TYPE_DATE : TYPE_NULL);
 
 
     values[1] = ( end != NULL ? *end : empty_string);
     values[1] = ( end != NULL ? *end : empty_string);
-    types[1] = ( end != NULL ? TYPE_STR : TYPE_NULL);
+    types[1] = ( end != NULL ? TYPE_DATE : TYPE_NULL);
 
 
     values[2] = ( duration != NULL ? *duration : empty_string);
     values[2] = ( duration != NULL ? *duration : empty_string);
-    types[2] = ( duration != NULL ? TYPE_STR : TYPE_NULL);
+    types[2] = ( duration != NULL ? TYPE_DOUBLE : TYPE_NULL);
 
 
     return MAX_CDR_CORE;
     return MAX_CDR_CORE;
 }
 }
@@ -138,6 +140,10 @@ static int db_write_cdr( struct dlg_cell* dialog,
 	db1_con_t *dh=NULL;
 	db1_con_t *dh=NULL;
 	void *vf=NULL;
 	void *vf=NULL;
 	void *vh=NULL;
 	void *vh=NULL;
+	struct timeval timeval_val;
+	long long_val;
+	double double_val;
+	char * end;
 
 
 	if(acc_cdrs_table.len<=0)
 	if(acc_cdrs_table.len<=0)
 		return 0;
 		return 0;
@@ -157,9 +163,45 @@ static int db_write_cdr( struct dlg_cell* dialog,
 
 
 	for(i=0; i<m; i++) {
 	for(i=0; i<m; i++) {
 		db_cdr_keys[i] = &cdr_attrs[i];
 		db_cdr_keys[i] = &cdr_attrs[i];
-		VAL_TYPE(db_cdr_vals+i)=DB1_STR;
-		VAL_NULL(db_cdr_vals+i)=0;
-		VAL_STR(db_cdr_vals+i) = cdr_value_array[i];
+		switch(cdr_type_array[i]) {
+			case TYPE_NULL:
+				VAL_NULL(db_cdr_vals+i)=1;
+				break;
+			case TYPE_INT:
+				VAL_TYPE(db_cdr_vals+i)=DB1_INT;
+				VAL_NULL(db_cdr_vals+i)=0;
+				long_val = strtol(cdr_value_array[i].s, &end, 10);
+				if(errno && (errno != EAGAIN)) {
+					LM_ERR("failed to convert string to integer - %d.\n", errno);
+					goto error;
+				}
+				VAL_INT(db_cdr_vals+i) = long_val;
+				break;
+			case TYPE_STR:
+				VAL_TYPE(db_cdr_vals+i)=DB1_STR;
+				VAL_NULL(db_cdr_vals+i)=0;
+				VAL_STR(db_cdr_vals+i) = cdr_value_array[i];
+				break;
+			case TYPE_DATE:
+				VAL_TYPE(db_cdr_vals+i)=DB1_DATETIME;
+				VAL_NULL(db_cdr_vals+i)=0;
+				if(string2time(&cdr_value_array[i], &timeval_val) < 0) {
+					LM_ERR("failed to convert string to timeval.\n");
+					goto error;
+				}
+				VAL_TIME(db_cdr_vals+i) = timeval_val.tv_sec;
+				break;
+			case TYPE_DOUBLE:
+				VAL_TYPE(db_cdr_vals+i)=DB1_DOUBLE;
+				VAL_NULL(db_cdr_vals+i)=0;
+				double_val = strtod(cdr_value_array[i].s, &end);
+				if(errno && (errno != EAGAIN)) {
+					LM_ERR("failed to convert string to double - %d.\n", errno);
+					goto error;
+				}
+				VAL_DOUBLE(db_cdr_vals+i) = double_val;
+				break;
+		}
 	}
 	}
 
 
     /* get extra values */
     /* get extra values */