| 1374 | } |
| 1375 | |
| 1376 | static int w_cache_raw_query(struct sip_msg *msg, str *id, str *raw_query_s, |
| 1377 | pvname_list_t *avp_list) |
| 1378 | { |
| 1379 | cdb_raw_entry **cdb_reply = NULL; |
| 1380 | int num_cols=0,i,j; |
| 1381 | int num_rows=0; |
| 1382 | pvname_list_t *it; |
| 1383 | int_str avp_val; |
| 1384 | int_str avp_name; |
| 1385 | unsigned short avp_type; |
| 1386 | int ret; |
| 1387 | |
| 1388 | if (!raw_query_s || !raw_query_s->s || !raw_query_s->len) { |
| 1389 | LM_ERR("raw query cannot be empty\n"); |
| 1390 | return E_UNSPEC; |
| 1391 | } |
| 1392 | |
| 1393 | if (!avp_list) |
| 1394 | return cachedb_raw_query(id, raw_query_s, NULL,0,NULL); |
| 1395 | |
| 1396 | for (it=avp_list;it;it=it->next) |
| 1397 | num_cols++; |
| 1398 | |
| 1399 | LM_DBG("The query expects %d fields per result\n", num_cols); |
| 1400 | |
| 1401 | ret = cachedb_raw_query(id, raw_query_s, &cdb_reply, num_cols, &num_rows); |
| 1402 | if (ret >= 0 && num_cols > 0) { |
| 1403 | for (i=num_rows-1; i>=0;i--) { |
| 1404 | it=avp_list; |
| 1405 | for (j=0;j < num_cols;j++) { |
| 1406 | avp_type = 0; |
| 1407 | if (pv_get_avp_name(msg,&it->sname.pvp,&avp_name.n, |
| 1408 | &avp_type) != 0) { |
| 1409 | LM_ERR("cannot get avp name [%d/%d]\n",i,j); |
| 1410 | goto next_avp; |
| 1411 | } |
| 1412 | |
| 1413 | switch (cdb_reply[i][j].type) { |
| 1414 | case CDB_INT32: |
| 1415 | avp_val.n = cdb_reply[i][j].val.n; |
| 1416 | break; |
| 1417 | case CDB_STR: |
| 1418 | avp_type |= AVP_VAL_STR; |
| 1419 | avp_val.s = cdb_reply[i][j].val.s; |
| 1420 | break; |
| 1421 | case CDB_NULL: |
| 1422 | avp_type |= AVP_VAL_NULL; |
| 1423 | avp_val.s = cdb_reply[i][j].val.s; |
| 1424 | break; |
| 1425 | default: |
| 1426 | LM_WARN("Unknown type %d\n",cdb_reply[i][j].type); |
| 1427 | goto next_avp; |
| 1428 | } |
| 1429 | if (add_avp(avp_type,avp_name.n,avp_val) != 0) { |
| 1430 | LM_ERR("Unable to add AVP\n"); |
| 1431 | free_raw_fetch(cdb_reply,num_cols,num_rows); |
| 1432 | return -1; |
| 1433 | } |
nothing calls this directly
no test coverage detected