diff --git a/config.c b/config.c index 719e9e3..6c08868 100644 --- a/config.c +++ b/config.c @@ -26,6 +26,8 @@ char *config_cdr_user; char *config_cdr_pass; char *config_cdr_db; unsigned int config_cdr_port = MEDIATOR_DEFAULT_CDRPORT; +char *config_intermediate_cdr_host; +unsigned int config_intermediate_cdr_port = MEDIATOR_DEFAULT_CDRPORT; char *config_prov_host; char *config_prov_user; @@ -64,6 +66,8 @@ enum config_option { OPT_CDR_USER = 'U', OPT_CDR_PASS = 'P', OPT_CDR_DB = 'B', + OPT_INTERMEDIATE_CDR_HOST = 'y', + OPT_INTERMEDIATE_CDR_PORT = 'Y', OPT_PROV_HOST = 'S', OPT_PROV_PORT = 'T', OPT_PROV_USER = 'R', @@ -85,7 +89,7 @@ enum config_option { OPT_INTERMEDIATE_INTERVAL = 'I', }; -static const char options[] = "?a:c:e:D:i:dlL:h:u:p:b:o:H:U:P:B:O:S:t:T:r:R:A:N:Z:z:W:w:X:x:msM:I:"; +static const char options[] = "?a:c:e:D:i:dlL:h:u:p:b:o:H:U:P:B:O:S:t:T:r:R:A:N:Z:z:W:w:X:x:msM:I:y:Y:"; struct option long_options[] = { { "configfile", required_argument, NULL, OPT_CONFIGFILE }, @@ -104,6 +108,8 @@ struct option long_options[] = { { "cdr-user", required_argument, NULL, OPT_CDR_USER }, { "cdr-pass", required_argument, NULL, OPT_CDR_PASS }, { "cdr-db", required_argument, NULL, OPT_CDR_DB }, + { "intermediate-cdr-host", required_argument, NULL, OPT_INTERMEDIATE_CDR_HOST }, + { "intermediate-cdr-port", required_argument, NULL, OPT_INTERMEDIATE_CDR_PORT }, { "prov-host", required_argument, NULL, OPT_PROV_HOST }, { "prov-port", required_argument, NULL, OPT_PROV_PORT }, { "prov-user", required_argument, NULL, OPT_PROV_USER }, @@ -149,6 +155,8 @@ static void config_help(const char *self, int rc) " -U, --cdr-user USER\tThe CDR db user (default = '%s').\n" \ " -P, --cdr-pass PASS\tThe CDR db pass (default = '%s').\n" \ " -B, --cdr-db DB\tThe CDR db name (default = '%s').\n" \ +" -y, --intermediate-cdr-host HOST\tThe CDR db host (default = '%s').\n" \ +" -Y, --intermediate-cdr-port PORT\tThe CDR db port (default = '%d').\n" \ " -S, --prov-host HOST\tThe prov db host (default = '%s').\n" \ " -T, --prov-port PORT\tThe prov db port (default = '%d').\n" \ " -R, --prov-user USER\tThe prov db user (default = '%s').\n" \ @@ -178,6 +186,7 @@ static void config_help(const char *self, int rc) MEDIATOR_DEFAULT_CDRHOST, MEDIATOR_DEFAULT_CDRPORT, MEDIATOR_DEFAULT_CDRUSER, MEDIATOR_DEFAULT_CDRPASS, MEDIATOR_DEFAULT_CDRDB, + MEDIATOR_DEFAULT_CDRHOST, MEDIATOR_DEFAULT_CDRPORT, MEDIATOR_DEFAULT_PROVHOST, MEDIATOR_DEFAULT_PROVPORT, MEDIATOR_DEFAULT_PROVUSER, MEDIATOR_DEFAULT_PROVPASS, MEDIATOR_DEFAULT_PROVDB, @@ -253,6 +262,12 @@ static void config_set_option(enum config_option option, const char *value) case OPT_CDR_PORT: config_cdr_port = atoi(value); break; + case OPT_INTERMEDIATE_CDR_HOST: + config_set_string_option(&config_intermediate_cdr_host, value); + break; + case OPT_INTERMEDIATE_CDR_PORT: + config_intermediate_cdr_port = atoi(value); + break; case OPT_PROV_HOST: config_set_string_option(&config_prov_host, value); break; @@ -325,6 +340,7 @@ static void config_set_defaults(void) config_set_string_default(&config_cdr_user, MEDIATOR_DEFAULT_CDRUSER); config_set_string_default(&config_cdr_pass, MEDIATOR_DEFAULT_CDRPASS); config_set_string_default(&config_cdr_db, MEDIATOR_DEFAULT_CDRDB); + config_set_string_default(&config_intermediate_cdr_host, MEDIATOR_DEFAULT_CDRHOST); config_set_string_default(&config_prov_host, MEDIATOR_DEFAULT_PROVHOST); config_set_string_default(&config_prov_user, MEDIATOR_DEFAULT_PROVUSER); config_set_string_default(&config_prov_pass, MEDIATOR_DEFAULT_PROVPASS); @@ -446,6 +462,7 @@ void config_cleanup() free(config_cdr_user); free(config_cdr_pass); free(config_cdr_db); + free(config_intermediate_cdr_host); free(config_med_host); free(config_med_user); free(config_med_pass); diff --git a/config.h b/config.h index b17d047..c0b1661 100644 --- a/config.h +++ b/config.h @@ -24,6 +24,8 @@ extern unsigned int config_cdr_port; extern char *config_cdr_user; extern char *config_cdr_pass; extern char *config_cdr_db; +extern char *config_intermediate_cdr_host; +extern unsigned int config_intermediate_cdr_port; extern char *config_prov_host; extern unsigned int config_prov_port; diff --git a/medmysql.c b/medmysql.c index 126a7c5..9da988b 100644 --- a/medmysql.c +++ b/medmysql.c @@ -60,6 +60,7 @@ typedef struct _medmysql_batch_definition { } medmysql_batch_definition; static medmysql_handler *cdr_handler; +static medmysql_handler *int_cdr_handler; static medmysql_handler *med_handler; static medmysql_handler *prov_handler; static medmysql_handler *stats_handler; @@ -200,13 +201,13 @@ static const medmysql_batch_definition medmysql_int_cdr_def = { "values(destination_lnp_type), export_status = 'unexported'", .full_flush_func = medmysql_flush_int_cdr, .min_string_tail_room = 9000, - .handler_ptr = &cdr_handler, + .handler_ptr = &int_cdr_handler, }; static const medmysql_batch_definition medmysql_del_int_cdr_def = { .sql_init_string = "delete from int_cdr where call_id in (", .sql_finish_string = ")", .single_flush_func = medmysql_flush_med_str, - .handler_ptr = &cdr_handler, + .handler_ptr = &int_cdr_handler, }; static const medmysql_batch_definition medmysql_tag_def = { .sql_init_string = "insert into cdr_tag_data (cdr_id, provider_id, direction_id, tag_id, " \ @@ -220,7 +221,7 @@ static const medmysql_batch_definition medmysql_int_tag_def = { .sql_finish_string = " on duplicate key update " "val = values(val)", .single_flush_func = medmysql_flush_med_str, - .handler_ptr = &cdr_handler, + .handler_ptr = &int_cdr_handler, }; static const medmysql_batch_definition medmysql_mos_def = { .sql_init_string = "insert into cdr_mos_data (" \ @@ -242,7 +243,7 @@ static const medmysql_batch_definition medmysql_int_group_def = { "cdr_id, call_id, cdr_start_time" \ ") values ", .single_flush_func = medmysql_flush_med_str, - .handler_ptr = &cdr_handler, + .handler_ptr = &int_cdr_handler, }; @@ -454,6 +455,12 @@ int medmysql_init() if (!cdr_handler) goto err; + int_cdr_handler = medmysql_handler_init("INT-CDR", + config_intermediate_cdr_host, config_cdr_user, config_cdr_pass, + config_cdr_db, config_intermediate_cdr_port); + if (!int_cdr_handler) + goto err; + med_handler = medmysql_handler_init("ACC", config_med_host, config_med_user, config_med_pass, config_med_db, config_med_port); @@ -499,6 +506,7 @@ static void medmysql_handler_close(medmysql_handler **h) { void medmysql_cleanup() { medmysql_handler_close(&cdr_handler); + medmysql_handler_close(&int_cdr_handler); medmysql_handler_close(&med_handler); medmysql_handler_close(&prov_handler); medmysql_handler_close(&stats_handler); @@ -1131,7 +1139,7 @@ int medmysql_delete_intermediate(cdr_entry_t *entries, uint64_t count, struct me char *callid = e->call_id; char esc_callid[strlen(callid)*2+1]; - mysql_real_escape_string(cdr_handler->m, esc_callid, callid, strlen(callid)); + mysql_real_escape_string(int_cdr_handler->m, esc_callid, callid, strlen(callid)); if (medmysql_batch_prepare(&batches->int_cdr_delete)) return -1; @@ -1396,6 +1404,8 @@ static void medmysql_str_init(struct medmysql_str *str, const medmysql_batch_def int medmysql_batch_start(struct medmysql_batches *batches) { if (medmysql_handler_transaction(cdr_handler)) return -1; + if (medmysql_handler_transaction(int_cdr_handler)) + return -1; if (medmysql_handler_transaction(med_handler)) return -1; @@ -1620,6 +1630,8 @@ int medmysql_batch_end(struct medmysql_batches *batches) { if (medmysql_handler_commit(cdr_handler)) return -1; + if (medmysql_handler_commit(int_cdr_handler)) + return -1; if (medmysql_handler_commit(med_handler)) return -1;