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
changes/65/22265/2
Kirill Solomko 7 years ago
parent 817adc052e
commit 62ab36fec2

30
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;
}

@ -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;

@ -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;
}
/**********************************************************************/

@ -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 *);

@ -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)

@ -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);

Loading…
Cancel
Save