From 44b141e570a8ed61533d616949141378fbdb5e8f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 28 Jun 2022 08:08:19 -0400 Subject: [PATCH] TT#182200 use single-pass JSON parsing Attempt to parse each src/dst leg only once (which is a JSON document these days) and use the same logic for determining whether to create a CDR for both intermediate and final CDRs. Change-Id: If8afae812585cb8624799b0d2f4e6be64980cea9 --- cdr.c | 57 +++++---------------------------------------------------- 1 file changed, 5 insertions(+), 52 deletions(-) diff --git a/cdr.c b/cdr.c index 947b4ac..1e77de2 100644 --- a/cdr.c +++ b/cdr.c @@ -1290,47 +1290,6 @@ static int cdr_parse_dstleg_list(char *dstleg, cdr_entry_t *cdr) return 0; } -static int validate_src_dst_leg(med_entry_t *e) -{ - if (!e->src_leg[0]) - { - L_DEBUG("Missing src_leg"); - return -1; - } - - if (!e->dst_leg[0]) - { - L_DEBUG("Missing dst_leg"); - return -1; - } - - int invalid; - - json_object *json_src_leg = json_tokener_parse(e->src_leg); - invalid = (!(json_src_leg && json_object_is_type(json_src_leg, json_type_object)) && - strchr(e->src_leg, MED_SEP) == NULL); - if (json_src_leg) - json_object_put(json_src_leg); - if (invalid) - { - L_DEBUG("Invalid src_leg"); - return -1; - } - - json_object *json_dst_leg = json_tokener_parse(e->dst_leg); - invalid = (!(json_dst_leg && json_object_is_type(json_dst_leg, json_type_object)) && - strchr(e->dst_leg, MED_SEP) == NULL); - if (json_dst_leg) - json_object_put(json_dst_leg); - if (invalid) - { - L_DEBUG("Invalid dst_leg"); - return -1; - } - - return 0; -} - static int cdr_parse_srcleg(char *srcleg, cdr_entry_t *cdr) { json_object *json = json_tokener_parse(srcleg); @@ -1522,14 +1481,6 @@ static int cdr_create_cdrs(med_entry_t *records, uint64_t count, if (!tmp_unix_endtime) { if (do_intermediate && !timed_out) { L_DEBUG("CDR %lu is an intermediate record\n", cdr_index); - - if (validate_src_dst_leg(e)) - { - L_DEBUG("Skip intermediate CDR index %lu without valid src_leg and dst_leg for call-id '%s'\n", cdr_index, e->callid); - cdr_index--; - continue; - } - cdr->intermediate = 1; } else { @@ -1553,15 +1504,17 @@ static int cdr_create_cdrs(med_entry_t *records, uint64_t count, cdr->destination_reseller_cost = 0; cdr->destination_customer_cost = 0; - if(cdr_parse_srcleg(e->src_leg, cdr) < 0 && !cdr->intermediate) + if(cdr_parse_srcleg(e->src_leg, cdr) < 0) { - *trash = 1; + if (!cdr->intermediate) + *trash = 1; return 0; } if(cdr_parse_dstleg(e->dst_leg, cdr) < 0 && !cdr->intermediate && !timed_out) { - *trash = 1; + if (!cdr->intermediate) + *trash = 1; return 0; }