Merge pull request #996 in FS/freeswitch from ~DINGDING/freeswitch:feature/FS-9615-mod_odbc_cdr-add-quote-and-default-value to master
* commit '8e28cbc02682a7c9508a5819798f8f2d1a50b79b': FS-9615 [mod_odbc_cdr] New Feature add field Non-string types and default values are supported
This commit is contained in:
commit
984ff2b6c8
|
@ -24,6 +24,7 @@
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*
|
*
|
||||||
* Emmanuel Schmidbauer <eschmidbauer@gmail.com>
|
* Emmanuel Schmidbauer <eschmidbauer@gmail.com>
|
||||||
|
* ding ding <cdevelop@qq.com>
|
||||||
*
|
*
|
||||||
* mod_odbc_cdr.c
|
* mod_odbc_cdr.c
|
||||||
*
|
*
|
||||||
|
@ -65,6 +66,12 @@ static struct {
|
||||||
switch_memory_pool_t *pool;
|
switch_memory_pool_t *pool;
|
||||||
} globals;
|
} globals;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *chan_var_name;
|
||||||
|
char *default_value;
|
||||||
|
switch_bool_t quote;
|
||||||
|
} cdr_field_t;
|
||||||
|
|
||||||
struct table_profile {
|
struct table_profile {
|
||||||
char *name;
|
char *name;
|
||||||
odbc_cdr_log_leg_t log_leg;
|
odbc_cdr_log_leg_t log_leg;
|
||||||
|
@ -130,12 +137,30 @@ static table_profile_t *load_table(const char *table_name)
|
||||||
for (x_field = switch_xml_child(x_table, "field"); x_field; x_field = x_field->next) {
|
for (x_field = switch_xml_child(x_table, "field"); x_field; x_field = x_field->next) {
|
||||||
char *var = (char *) switch_xml_attr_soft(x_field, "name");
|
char *var = (char *) switch_xml_attr_soft(x_field, "name");
|
||||||
char *val = (char *) switch_xml_attr_soft(x_field, "chan-var-name");
|
char *val = (char *) switch_xml_attr_soft(x_field, "chan-var-name");
|
||||||
char *value = NULL;
|
cdr_field_t *field = NULL;
|
||||||
|
const char *attr;
|
||||||
|
|
||||||
if (zstr(var) || zstr(val)) {
|
if (zstr(var) || zstr(val)) {
|
||||||
continue; // Ignore empty entries
|
continue; // Ignore empty entries
|
||||||
}
|
}
|
||||||
value = switch_core_strdup(pool, val);
|
|
||||||
switch_core_hash_insert_locked(table->field_hash, var, value, table->mutex);
|
field = switch_core_alloc(pool, sizeof(cdr_field_t));
|
||||||
|
field->chan_var_name = switch_core_strdup(pool, val);
|
||||||
|
|
||||||
|
/* Assume all fields should be quoted (treated as strings), unless specified otherwise */
|
||||||
|
if (switch_false(switch_xml_attr(x_field, "quote"))) {
|
||||||
|
field->quote = SWITCH_FALSE;
|
||||||
|
} else {
|
||||||
|
field->quote = SWITCH_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((attr = switch_xml_attr(x_field, "default-value"))) {
|
||||||
|
field->default_value = switch_core_strdup(pool,attr);
|
||||||
|
} else {
|
||||||
|
field->default_value = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_core_hash_insert_locked(table->field_hash, var, field, table->mutex);
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Field [%s] (%s) added to [%s]\n", var, val, table->name);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Field [%s] (%s) added to [%s]\n", var, val, table->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +299,7 @@ static switch_status_t odbc_cdr_reporting(switch_core_session_t *session)
|
||||||
const void *i_var;
|
const void *i_var;
|
||||||
void *i_val;
|
void *i_val;
|
||||||
char *field_hash_key;
|
char *field_hash_key;
|
||||||
char *field_hash_val;
|
cdr_field_t *field_hash_val;
|
||||||
char *sql = NULL;
|
char *sql = NULL;
|
||||||
char *full_path = NULL;
|
char *full_path = NULL;
|
||||||
switch_stream_handle_t stream_field = { 0 };
|
switch_stream_handle_t stream_field = { 0 };
|
||||||
|
@ -288,16 +313,27 @@ static switch_status_t odbc_cdr_reporting(switch_core_session_t *session)
|
||||||
const char *tmp;
|
const char *tmp;
|
||||||
switch_core_hash_this(i_hi, &i_var, NULL, &i_val);
|
switch_core_hash_this(i_hi, &i_var, NULL, &i_val);
|
||||||
field_hash_key = (char *) i_var;
|
field_hash_key = (char *) i_var;
|
||||||
field_hash_val = (char *) i_val;
|
field_hash_val = (cdr_field_t *) i_val;
|
||||||
|
tmp = switch_channel_get_variable(channel, field_hash_val->chan_var_name);
|
||||||
|
|
||||||
if ((tmp = switch_channel_get_variable(channel, field_hash_val))) {
|
if (!tmp && field_hash_val->default_value) {
|
||||||
if (started == SWITCH_FALSE) {
|
tmp = field_hash_val->default_value;
|
||||||
stream_field.write_function(&stream_field, "%s", field_hash_key);
|
}
|
||||||
stream_value.write_function(&stream_value, "'%s'", tmp);
|
|
||||||
} else {
|
if (tmp) {
|
||||||
stream_field.write_function(&stream_field, ", %s", field_hash_key);
|
if (started == SWITCH_TRUE) {
|
||||||
stream_value.write_function(&stream_value, ", '%s'", tmp);
|
stream_field.write_function(&stream_field, ", ");
|
||||||
|
stream_value.write_function(&stream_value, ", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream_field.write_function(&stream_field, "%q", field_hash_key);
|
||||||
|
|
||||||
|
if (field_hash_val->quote) {
|
||||||
|
stream_value.write_function(&stream_value, "'%q'", tmp);
|
||||||
|
} else {
|
||||||
|
stream_value.write_function(&stream_value, "%q", tmp);
|
||||||
|
}
|
||||||
|
|
||||||
started = SWITCH_TRUE;
|
started = SWITCH_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue