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
mr10.5.2
Richard Fuchs 3 years ago
parent bbbe2c9a7b
commit 5583350bed

59
cdr.c

@ -1280,47 +1280,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(med_entry_t *e, cdr_entry_t *cdr)
{
cdr_parse_entry(e);
@ -1510,14 +1469,6 @@ static int cdr_create_cdrs(GQueue *records,
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 {
@ -1541,15 +1492,17 @@ static int cdr_create_cdrs(GQueue *records,
cdr->destination_reseller_cost = 0;
cdr->destination_customer_cost = 0;
if(cdr_parse_srcleg(e, cdr) < 0 && !cdr->intermediate)
if(cdr_parse_srcleg(e, cdr) < 0)
{
*trash = 1;
if (!cdr->intermediate)
*trash = 1;
return 0;
}
if(cdr_parse_dstleg(e, cdr) < 0 && !cdr->intermediate && !timed_out)
if(cdr_parse_dstleg(e, cdr) < 0 && !timed_out)
{
*trash = 1;
if (!cdr->intermediate)
*trash = 1;
return 0;
}

Loading…
Cancel
Save