Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mod_odbc_cdr] add sql output to file on failed db insert #2396

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/>
<!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" -->
<param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
<!-- value can be "never", "on-db-fail" -->
<param name="write-sql" value="on-db-fail"/>
<!-- failed INSERTs will be placed here -->
<param name="sql-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
<!-- dump SQL statement after leg ends -->
<param name="debug-sql" value="true"/>
</settings>
Expand Down
21 changes: 21 additions & 0 deletions src/mod/event_handlers/mod_odbc_cdr/mod_odbc_cdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,20 @@ typedef enum {
ODBC_CDR_CSV_ON_FAIL
} odbc_cdr_write_csv_t;

typedef enum {
ODBC_CDR_SQL_NEVER,
ODBC_CDR_SQL_ON_FAIL
} odbc_cdr_write_sql_t;

static struct {
char *odbc_dsn;
char *dbname;
char *csv_path;
char *csv_fail_path;
char *sql_fail_path;
odbc_cdr_log_leg_t log_leg;
odbc_cdr_write_csv_t write_csv;
odbc_cdr_write_sql_t write_sql;
switch_bool_t debug_sql;
switch_hash_t *table_hash;
uint32_t running;
Expand Down Expand Up @@ -364,6 +371,13 @@ static switch_status_t odbc_cdr_reporting(switch_core_session_t *session)
switch_safe_free(full_path);
}

if (globals.write_sql == ODBC_CDR_SQL_ON_FAIL && insert_fail == SWITCH_TRUE) {
full_path = switch_mprintf("%s%s%s_%s.sql", globals.sql_fail_path, SWITCH_PATH_SEPARATOR, uuid, table_name);
assert(full_path);
write_cdr(full_path, sql);
switch_safe_free(full_path);
}

switch_safe_free(sql);

switch_safe_free(stream_field.data);
Expand Down Expand Up @@ -414,6 +428,7 @@ static switch_status_t odbc_cdr_load_config(void)
globals.debug_sql = SWITCH_FALSE;
globals.log_leg = ODBC_CDR_LOG_BOTH;
globals.write_csv = ODBC_CDR_CSV_NEVER;
globals.write_sql = ODBC_CDR_SQL_NEVER;

if ((settings = switch_xml_child(cfg, "settings")) != NULL) {
for (param = switch_xml_child(settings, "param"); param; param = param->next) {
Expand Down Expand Up @@ -444,10 +459,16 @@ static switch_status_t odbc_cdr_load_config(void)
} else if (!strcasecmp(val, "on-db-fail")) {
globals.write_csv = ODBC_CDR_CSV_ON_FAIL;
}
} else if (!strcasecmp(var, "write-sql") && !zstr(val)) {
if (!strcasecmp(val, "on-db-fail")) {
globals.write_sql = ODBC_CDR_SQL_ON_FAIL;
}
} else if (!strcasecmp(var, "csv-path") && !zstr(val)) {
globals.csv_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
} else if (!strcasecmp(var, "csv-path-on-fail") && !zstr(val)) {
globals.csv_fail_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
} else if (!strcasecmp(var, "sql-path-on-fail") && !zstr(val)) {
globals.sql_fail_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
}
}
}
Expand Down