diff --git a/cdr.c b/cdr.c index ccfc546..e978511 100644 --- a/cdr.c +++ b/cdr.c @@ -454,6 +454,16 @@ static int cdr_parse_srcleg(char *srcleg, cdr_entry_t *cdr) g_strlcpy(cdr->header_diversion, tmp2, sizeof(cdr->header_diversion)); tmp2 = ++tmp1; + tmp1 = strchr(tmp2, MED_SEP); + if(tmp1 == NULL) + { + L_WARNING("Call-Id '%s' has no separated group info, '%s'", cdr->call_id, tmp2); + return -1; + } + *tmp1 = '\0'; + g_strlcpy(cdr->group, tmp2, sizeof(cdr->group)); + tmp2 = ++tmp1; + return 0; } diff --git a/cdr.h b/cdr.h index 884e6df..ff47a22 100644 --- a/cdr.h +++ b/cdr.h @@ -80,6 +80,8 @@ typedef struct { char header_diversion[2048]; char header_pai[2048]; + char group[256]; + uint8_t split; mos_data_t mos; diff --git a/medmysql.c b/medmysql.c index 0767c8d..c90d943 100644 --- a/medmysql.c +++ b/medmysql.c @@ -149,6 +149,13 @@ static const medmysql_batch_definition medmysql_mos_def = { .single_flush_func = medmysql_flush_med_str, .handler_ptr = &cdr_handler, }; +static const medmysql_batch_definition medmysql_group_def = { + .sql_init_string = "insert into cdr_group (" \ + "cdr_id, call_id, cdr_start_time" \ + ") values ", + .single_flush_func = medmysql_flush_med_str, + .handler_ptr = &cdr_handler, +}; static void statement_free(void *stm_p) { @@ -720,6 +727,26 @@ static int medmysql_mos_record(GQueue *q, unsigned long cdr_id, double avg_score return 0; } +static int medmysql_group_record(MYSQL *m, GQueue *q, unsigned long cdr_id, const char *group, double start_time) +{ + cdr_tag_record *record = malloc(sizeof(*record)); + size_t len = strlen(group); + if (!len) + return 0; + char *escaped = malloc(len * 2 + 1); + mysql_real_escape_string(m, escaped, group, len); + record->cdr_id = cdr_id; + if (asprintf(&record->sql_record, "'%s', %.3f", escaped, start_time) <= 0) + { + free(escaped); + free(record); + return -1; + } + free(escaped); + g_queue_push_tail(q, record); + return 0; +} + int medmysql_insert_cdrs(cdr_entry_t *entries, uint64_t count, struct medmysql_batches *batches) { @@ -951,6 +978,10 @@ int medmysql_insert_cdrs(cdr_entry_t *entries, uint64_t count, struct medmysql_b return -1; } + if (medmysql_group_record(med_handler->m, &batches->cdr_group, batches->num_cdrs, e->group, + e->start_time)) + return -1; + batches->num_cdrs++; // no check for return codes here we should keep on nevertheless @@ -1221,9 +1252,11 @@ int medmysql_batch_start(struct medmysql_batches *batches) { batches->to_delete.len = 0; batches->tags.len = 0; batches->mos.len = 0; + batches->group.len = 0; batches->num_cdrs = 0; g_queue_init(&batches->cdr_tags); g_queue_init(&batches->cdr_mos); + g_queue_init(&batches->cdr_group); return 0; } @@ -1282,6 +1315,9 @@ static int medmysql_write_cdr_tags(struct medmysql_batches *batches, unsigned lo if (medmysql_write_tag_records(batches, &batches->mos, &batches->cdr_mos, &medmysql_mos_def, auto_id)) return -1; + if (medmysql_write_tag_records(batches, &batches->group, &batches->cdr_group, + &medmysql_group_def, auto_id)) + return -1; return 0; } @@ -1325,6 +1361,8 @@ static int medmysql_flush_cdr(struct medmysql_batches *batches) { return -1; if (medmysql_flush_med_str(&batches->mos, &medmysql_mos_def)) return -1; + if (medmysql_flush_med_str(&batches->group, &medmysql_group_def)) + return -1; batches->num_cdrs = 0; diff --git a/medmysql.h b/medmysql.h index f61397c..6d5aca5 100644 --- a/medmysql.h +++ b/medmysql.h @@ -22,9 +22,11 @@ struct medmysql_batches { struct medmysql_str to_delete; struct medmysql_str tags; struct medmysql_str mos; + struct medmysql_str group; unsigned long num_cdrs; GQueue cdr_tags; GQueue cdr_mos; + GQueue cdr_group; }; struct medmysql_call_stat_info_t {