From 62ab36fec2d4aba2a1643362617545f764acd4d5 Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Thu, 28 Jun 2018 20:19:14 +0200 Subject: [PATCH] TT#39374 store data in cdr_tag_data * type=id values are pre-fetched from cdr_tag_data on init * 3 new data columns are stored in cdr_tag_data furnished_charing_info, header=P-Asserted-Identity header=Diversion Change-Id: I228743beb05cc09cc28d7df8dedc90dd3cdbcfed --- cdr.c | 30 ++++++++++++++ cdr.h | 4 ++ mediator.c | 7 ++++ mediator.h | 1 + medmysql.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++------- medmysql.h | 1 + 6 files changed, 147 insertions(+), 14 deletions(-) diff --git a/cdr.c b/cdr.c index cfde16c..c26b207 100644 --- a/cdr.c +++ b/cdr.c @@ -423,6 +423,26 @@ static int cdr_parse_srcleg(char *srcleg, cdr_entry_t *cdr) g_strlcpy(cdr->source_lnp_type, tmp2, sizeof(cdr->source_lnp_type)); tmp2 = ++tmp1; + tmp1 = strchr(tmp2, MED_SEP); + if(tmp1 == NULL) + { + L_WARNING("Call-Id '%s' has no separated P-Asserted-Identity header, '%s'", cdr->call_id, tmp2); + return -1; + } + *tmp1 = '\0'; + g_strlcpy(cdr->header_pai, tmp2, sizeof(cdr->header_pai)); + tmp2 = ++tmp1; + + tmp1 = strchr(tmp2, MED_SEP); + if(tmp1 == NULL) + { + L_WARNING("Call-Id '%s' has no separated Diversion header, '%s'", cdr->call_id, tmp2); + return -1; + } + *tmp1 = '\0'; + g_strlcpy(cdr->header_diversion, tmp2, sizeof(cdr->header_diversion)); + tmp2 = ++tmp1; + return 0; } @@ -601,6 +621,16 @@ static int cdr_parse_dstleg(char *dstleg, cdr_entry_t *cdr) g_strlcpy(cdr->destination_lnp_type, tmp2, sizeof(cdr->destination_lnp_type)); tmp2 = ++tmp1; + tmp1 = strchr(tmp2, MED_SEP); + if(tmp1 == NULL) + { + L_WARNING("Call-Id '%s' has no separated furnished charging info, '%s'", cdr->call_id, tmp2); + return -1; + } + *tmp1 = '\0'; + g_strlcpy(cdr->furnished_charging_info, tmp2, sizeof(cdr->furnished_charging_info)); + tmp2 = ++tmp1; + return 0; } diff --git a/cdr.h b/cdr.h index ae0fa3f..884e6df 100644 --- a/cdr.h +++ b/cdr.h @@ -76,6 +76,10 @@ typedef struct { uint32_t destination_reseller_cost; uint32_t destination_customer_cost; + char furnished_charging_info[256]; + char header_diversion[2048]; + char header_pai[2048]; + uint8_t split; mos_data_t mos; diff --git a/mediator.c b/mediator.c index cb25c6a..8cb517d 100644 --- a/mediator.c +++ b/mediator.c @@ -27,6 +27,7 @@ GHashTable *med_peer_host_table = NULL; GHashTable *med_peer_id_table = NULL; GHashTable *med_uuid_table = NULL; GHashTable *med_call_stat_info_table = NULL; +GHashTable *med_cdr_tag_table = NULL; /**********************************************************************/ static int mediator_load_maps() @@ -35,6 +36,7 @@ static int mediator_load_maps() med_peer_host_table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); med_peer_id_table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); med_uuid_table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); + med_cdr_tag_table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); if(medmysql_load_maps(med_peer_ip_table, med_peer_host_table, med_peer_id_table)) return -1; @@ -42,6 +44,8 @@ static int mediator_load_maps() return -1; if (medmysql_load_db_ids()) return -1; + if (medmysql_load_cdr_tag_ids(med_cdr_tag_table)) + return -1; return 0; } @@ -65,12 +69,15 @@ static void mediator_destroy_maps() g_hash_table_destroy(med_uuid_table); if(med_call_stat_info_table) g_hash_table_destroy(med_call_stat_info_table); + if(med_cdr_tag_table) + g_hash_table_destroy(med_cdr_tag_table); med_peer_ip_table = NULL; med_peer_host_table = NULL; med_peer_id_table = NULL; med_uuid_table = NULL; med_call_stat_info_table = NULL; + med_cdr_tag_table = NULL; } /**********************************************************************/ diff --git a/mediator.h b/mediator.h index 73dce1a..d469309 100644 --- a/mediator.h +++ b/mediator.h @@ -103,6 +103,7 @@ extern GHashTable *med_peer_ip_table; extern GHashTable *med_peer_id_table; extern GHashTable *med_uuid_table; extern GHashTable *med_call_stat_info_table; +extern GHashTable *med_cdr_tag_table; void critical(const char *); diff --git a/medmysql.c b/medmysql.c index 46d202b..e440112 100644 --- a/medmysql.c +++ b/medmysql.c @@ -52,6 +52,8 @@ "billing.contracts c, billing.contacts ct, billing.resellers r where c.id = vs.contract_id and " \ "c.contact_id = ct.id and ct.reseller_id = r.id" +#define MED_LOAD_CDR_TAG_IDS_QUERY "select id, type from accounting.cdr_tag" + typedef struct _medmysql_handler { const char *name; MYSQL *m; @@ -674,20 +676,21 @@ int medmysql_delete_entries(const char *callid, struct medmysql_batches *batches #define CDRESCAPE(x) batches->cdrs.len += mysql_real_escape_string(med_handler->m, batches->cdrs.str + batches->cdrs.len, x, strlen(x)) /**********************************************************************/ -// static int medmysql_tag_record(GQueue *q, unsigned long cdr_id, unsigned long provider_id, -// unsigned long direction_id, const char *value, double start_time, unsigned long tag_id) -// { -// cdr_tag_record *record = malloc(sizeof(*record)); -// record->cdr_id = cdr_id; -// if (asprintf(&record->sql_record, "%lu, %lu, %lu, '%s', %f", -// provider_id, direction_id, tag_id, value, start_time) <= 0) -// { -// free(record); -// return -1; -// } -// g_queue_push_tail(q, record); -// return 0; -// } +static int medmysql_tag_record(GQueue *q, unsigned long cdr_id, unsigned long provider_id, + unsigned long direction_id, const char *value, double start_time, unsigned long tag_id) +{ + cdr_tag_record *record = malloc(sizeof(*record)); + record->cdr_id = cdr_id; + if (asprintf(&record->sql_record, "%lu, %lu, %lu, '%s', %f", + provider_id, direction_id, tag_id, value, start_time) <= 0) + { + free(record); + return -1; + } + g_queue_push_tail(q, record); + return 0; +} + static int medmysql_mos_record(GQueue *q, unsigned long cdr_id, double avg_score, int avg_packetloss, int avg_jitter, int avg_rtt, double start_time) { @@ -709,6 +712,7 @@ int medmysql_insert_cdrs(cdr_entry_t *entries, uint64_t count, struct medmysql_b { uint64_t i; int gpp; + gpointer tag_id; for(i = 0; i < count; ++i) { @@ -878,6 +882,45 @@ int medmysql_insert_cdrs(cdr_entry_t *entries, uint64_t count, struct medmysql_b CDRPRINT("),"); + if(strnlen(e->furnished_charging_info, sizeof(e->furnished_charging_info)) > 0) + { + if ((tag_id = g_hash_table_lookup(med_cdr_tag_table, "furnished_charging_info")) == NULL) { + L_WARNING("Call-Id '%s' has no cdr tag type 'furnished_charging_info', '%s'", + e->call_id, e->header_diversion); + return -1; + } + if (medmysql_tag_record(&batches->cdr_tags, batches->num_cdrs, medmysql_tag_provider_customer, + medmysql_tag_direction_destination, e->furnished_charging_info, e->start_time, + GPOINTER_TO_UINT(tag_id))) + return -1; + } + + if(strnlen(e->header_pai, sizeof(e->header_pai)) > 0) + { + if ((tag_id = g_hash_table_lookup(med_cdr_tag_table, "header=P-Asserted-Identity")) == NULL) { + L_WARNING("Call-Id '%s' has no cdr tag type 'header=P-Asserted-Identity', '%s'", + e->call_id, e->header_diversion); + return -1; + } + if (medmysql_tag_record(&batches->cdr_tags, batches->num_cdrs, medmysql_tag_provider_customer, + medmysql_tag_direction_source, e->header_pai, e->start_time, + GPOINTER_TO_UINT(tag_id))) + return -1; + } + + if(strnlen(e->header_diversion, sizeof(e->header_diversion)) > 0) + { + if ((tag_id = g_hash_table_lookup(med_cdr_tag_table, "header=Diversion")) == NULL) { + L_WARNING("Call-Id '%s' has no cdr tag type 'header=Diversion', '%s'", + e->call_id, e->header_diversion); + return -1; + } + if (medmysql_tag_record(&batches->cdr_tags, batches->num_cdrs, medmysql_tag_provider_customer, + medmysql_tag_direction_source, e->header_diversion, e->start_time, + GPOINTER_TO_UINT(tag_id))) + return -1; + } + // entries for the CDR tags table // if (medmysql_tag_record(&batches->cdr_tags, batches->num_cdrs, medmysql_tag_provider_carrier, // medmysql_tag_direction_source, "foobar", e->start_time, 1)) @@ -1082,6 +1125,53 @@ int medmysql_load_db_ids() { return 0; } +int medmysql_load_cdr_tag_ids(GHashTable *cdr_tag_table) +{ + MYSQL_RES *res; + MYSQL_ROW row; + int ret = 0; + /* char query[1024] = ""; */ + gpointer key; + gpointer tag_id; + + /* snprintf(query, sizeof(query), MED_LOAD_CDR_TAG_IDS_QUERY); */ + + /* L_DEBUG("q='%s'", query); */ + if(medmysql_query_wrapper(cdr_handler, MED_LOAD_CDR_TAG_IDS_QUERY, strlen(MED_LOAD_CDR_TAG_IDS_QUERY)) != 0) + { + L_CRITICAL("Error loading cdr tag ids: %s", + mysql_error(prov_handler->m)); + return -1; + } + + res = mysql_store_result(cdr_handler->m); + + while((row = mysql_fetch_row(res)) != NULL) + { + if(row[0] == NULL || row[1] == NULL) + { + L_CRITICAL("Error loading cdr tag ids, a column is NULL"); + ret = -1; + goto out; + } + + tag_id = GUINT_TO_POINTER(strtoul(row[0], NULL, 10)); + if(tag_id == NULL) + { + L_CRITICAL("Error allocating cdr tag id memory: %s", strerror(errno)); + ret = -1; + goto out; + } + + key = (gpointer)g_strdup(row[1]); + g_hash_table_insert(cdr_tag_table, key, tag_id); + } + +out: + mysql_free_result(res); + return ret; +} + static int medmysql_handler_transaction(medmysql_handler *h) { if (h->is_transaction) diff --git a/medmysql.h b/medmysql.h index bbe9347..ddd683d 100644 --- a/medmysql.h +++ b/medmysql.h @@ -44,6 +44,7 @@ int medmysql_insert_cdrs(cdr_entry_t *records, uint64_t count, struct medmysql_b int medmysql_load_maps(GHashTable *ip_table, GHashTable *host_table, GHashTable *id_table); int medmysql_load_uuids(GHashTable *uuid_table); int medmysql_load_db_ids(); +int medmysql_load_cdr_tag_ids(GHashTable *cdr_tag_table); int medmysql_batch_start(struct medmysql_batches *); int medmysql_batch_end(struct medmysql_batches *); int medmysql_update_call_stat_info(const char *call_code, const double start_time);