static int exec_avp_fixup(void** param, int param_no) { pvname_list_t *anlist = NULL; str s; s.s = (char*)(*param); if (param_no==1) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } return fixup_spve_null(param, 1); } else if(param_no==2) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } s.len = strlen(s.s); anlist = parse_pvname_list(&s, PVT_AVP); if(anlist==NULL) { LM_ERR("bad format in P%d [%s]\n", param_no, s.s); return E_UNSPEC; } *param = (void*)anlist; return 0; } return 0; }
static int fixup_sql_pvquery(void** param, int param_no) { sql_con_t *con = NULL; pv_elem_t *pv = NULL; pvname_list_t *res = NULL; pvname_list_t *pvl = NULL; str s; int i; if(*param == NULL) { LM_ERR("missing parameter %d\n", param_no); return E_UNSPEC; } s.s = (char*)(*param); s.len = strlen(s.s); if (param_no==1) { con = sql_get_connection(&s); if(con==NULL) { LM_ERR("invalid connection [%s]\n", s.s); return E_UNSPEC; } *param = (void*)con; } else if (param_no==2) { if(pv_parse_format(&s, &pv)<0) { LM_ERR("invalid query string [%s]\n", s.s); return E_UNSPEC; } *param = (void*)pv; } else if (param_no==3) { /* parse result variables into list of pv_spec_t's */ res = parse_pvname_list(&s, 0); if(res==NULL) { LM_ERR("invalid result parameter [%s]\n", s.s); return E_UNSPEC; } /* check if all result variables are writable */ pvl = res; i = 1; while (pvl) { if (pvl->sname.setf == NULL) { LM_ERR("result variable [%d] is read-only\n", i); return E_UNSPEC; } i++; pvl = pvl->next; } *param = (void*)res; return 0; } return 0; }
static int fixup_db_query_avp(void** param, int param_no) { pv_elem_t *model = NULL; pvname_list_t *anlist = NULL; str s; if (default_db_url==NULL) { LM_ERR("no db url defined to be used by this function\n"); return E_CFG; } s.s = (char*)(*param); if (param_no==1) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } s.len = strlen(s.s); if(pv_parse_format(&s, &model)<0) { LM_ERR("wrong format[%s]\n", s.s); return E_UNSPEC; } *param = (void*)model; return 0; } else if(param_no==2) { if(s.s==NULL || s.s[0]==0) { *param = NULL; return 0; } s.len = strlen(s.s); anlist = parse_pvname_list(&s, PVT_AVP); if(anlist==NULL) { LM_ERR("bad format in P%d [%s]\n", param_no, s.s); return E_UNSPEC; } *param = (void*)anlist; return 0; } else if (param_no==3) { return fixup_db_url(param); } return 0; }
static int fixup_db_query_avp(void** param, int param_no) { pv_elem_t *model = NULL; pvname_list_t *anlist = NULL; str s; if (db_url.s==0) { LM_ERR("you have to configure db_url for using avp_db_query function\n"); return E_UNSPEC; } s.s = (char*)(*param); if (param_no==1) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } s.len = strlen(s.s); if(pv_parse_format(&s, &model)<0) { LM_ERR("wrong format[%s]\n", s.s); return E_UNSPEC; } *param = (void*)model; return 0; } else if(param_no==2) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } s.len = strlen(s.s); anlist = parse_pvname_list(&s, PVT_AVP); if(anlist==NULL) { LM_ERR("bad format in P%d [%s]\n", param_no, s.s); return E_UNSPEC; } *param = (void*)anlist; return 0; } return 0; }
/** * @is_async - if set, a warning will be thrown if the underlying * driver does not support async operations, and will run queries in sync mode */ static int __fixup_db_query_avp(void** param, int param_no, int is_async) { int type; pv_elem_t *model = NULL; pvname_list_t *anlist = NULL; str s; if (default_db_url==NULL) { LM_ERR("no db url defined to be used by this function\n"); return E_CFG; } s.s = (char*)(*param); if (param_no==1) { if(s.s==NULL) { LM_ERR("null format in P%d\n", param_no); return E_UNSPEC; } s.len = strlen(s.s); if(pv_parse_format(&s, &model)<0) { LM_ERR("wrong format[%s]\n", s.s); return E_UNSPEC; } *param = (void*)model; return 0; } else if(param_no==2) { if(s.s==NULL || s.s[0]==0) { *param = NULL; return 0; } s.len = strlen(s.s); anlist = parse_pvname_list(&s, PVT_AVP); if(anlist==NULL) { LM_ERR("bad format in P%d [%s]\n", param_no, s.s); return E_UNSPEC; } *param = (void*)anlist; return 0; } else if (param_no==3) { struct db_url_container *db_id; if (*param==NULL) return 0; if (fixup_igp(param) < 0) { LM_ERR("fixup failed for param #3!\n"); return -1; } db_id=pkg_malloc(sizeof(struct db_url_container)); if (db_id==NULL) { LM_ERR("no more pkg!\n"); return -1; } if ((type=((gparam_p)*param)->type) == GPARAM_TYPE_INT) { db_id->type = URL; if (id2db_url(((gparam_p)*param)->v.ival, 1, is_async, &db_id->u.url) < 0) { LM_ERR("failed to get db url!\n"); return E_CFG; } } else if (type == GPARAM_TYPE_STR) { unsigned int int_id; if (str2int(&((gparam_p)*param)->v.sval, &int_id) < 0) { LM_ERR("failed to get db id!\n"); return -1; } db_id->type = URL; if (id2db_url(int_id, 1, is_async, &db_id->u.url) < 0) { LM_ERR("failed to get db url!\n"); return E_CFG; } } else if(type==GPARAM_TYPE_PVS||type==GPARAM_TYPE_PVE){ db_id->type = GPARAM; db_id->u.gp = (gparam_p)*param; } else { LM_ERR("invalid value for param #3!\n"); return E_CFG; } *param = db_id; } return 0; }