int sql_do_pvquery(struct sip_msg *msg, sql_con_t *con, pv_elem_t *query, pvname_list_t *res) { db1_res_t* db_res = NULL; pvname_list_t* pv; str sv; int i, j; if(msg==NULL || query==NULL || res==NULL) { LM_ERR("bad parameters\n"); return -1; } if(pv_printf_s(msg, query, &sv)!=0) { LM_ERR("cannot print the sql query\n"); return -1; } if(con->dbf.raw_query(con->dbh, &sv, &db_res)!=0) { LM_ERR("cannot do the query\n"); return -1; } if(db_res==NULL || RES_ROW_N(db_res)<=0 || RES_COL_N(db_res)<=0) { LM_DBG("no result after query\n"); con->dbf.free_result(con->dbh, db_res); return 2; } for(i=RES_ROW_N(db_res)-1; i>=0; i--) { pv = res; for(j=0; j<RES_COL_N(db_res); j++) { if (pv == NULL) { LM_ERR("Missing pv spec for column %d\n", j+1); goto error; } if (db_val2pv_spec(msg, &RES_ROWS(db_res)[i].values[j], &pv->sname) != 0) { LM_ERR("Failed to convert value for column %.*s (row %d)\n", RES_NAMES(db_res)[j]->len, RES_NAMES(db_res)[j]->s, i); goto error; } pv = pv->next; } } con->dbf.free_result(con->dbh, db_res); return 1; error: con->dbf.free_result(con->dbh, db_res); return -1; }
/* * Generate AVPs from the database result */ static int generate_avps(struct sip_msg* msg, db1_res_t* db_res) { pv_elem_t *cred; int i; for (cred=credentials, i=1; cred; cred=cred->next, i++) { if (db_val2pv_spec(msg, &RES_ROWS(db_res)[0].values[i], cred->spec) != 0) { LM_ERR("Failed to convert value for column %.*s\n", RES_NAMES(db_res)[i]->len, RES_NAMES(db_res)[i]->s); return -1; } } return 0; }
int fetch_credentials(sip_msg_t *msg, str *user, str* domain, str *table, int flags) { pv_elem_t *cred; db_key_t keys[2]; db_val_t vals[2]; db_key_t *col; db1_res_t *res = NULL; int n, nc; if(flags&AUTH_DB_SUBS_SKIP_CREDENTIALS) { nc = 1; } else { nc = credentials_n; } col = pkg_malloc(sizeof(*col) * (nc+1)); if (col == NULL) { LM_ERR("no more pkg memory\n"); return -1; } keys[0] = &user_column; keys[1] = &domain_column; if(flags&AUTH_DB_SUBS_SKIP_CREDENTIALS) { col[0] = &user_column; } else { for (n = 0, cred=credentials; cred ; n++, cred=cred->next) { col[n] = &cred->text; } } VAL_TYPE(vals) = VAL_TYPE(vals + 1) = DB1_STR; VAL_NULL(vals) = VAL_NULL(vals + 1) = 0; n = 1; VAL_STR(vals) = *user; if (domain && domain->len) { VAL_STR(vals + 1) = *domain; n = 2; } if (auth_dbf.use_table(auth_db_handle, table) < 0) { LM_ERR("failed to use_table\n"); pkg_free(col); return -1; } if (auth_dbf.query(auth_db_handle, keys, 0, vals, col, n, nc, 0, &res) < 0) { LM_ERR("failed to query database\n"); pkg_free(col); if(res) auth_dbf.free_result(auth_db_handle, res); return -1; } pkg_free(col); if (RES_ROW_N(res) == 0) { if(res) auth_dbf.free_result(auth_db_handle, res); LM_DBG("no result for user \'%.*s%s%.*s\' in [%.*s]\n", user->len, user->s, (n==2)?"@":"", (n==2)?domain->len:0, (n==2)?domain->s:"", table->len, table->s); return -2; } if(flags&AUTH_DB_SUBS_SKIP_CREDENTIALS) { /* there is a result and flag to skip loading credentials is set */ goto done; } for (cred=credentials, n=0; cred; cred=cred->next, n++) { if (db_val2pv_spec(msg, &RES_ROWS(res)[0].values[n], cred->spec) != 0) { if(res) auth_dbf.free_result(auth_db_handle, res); LM_ERR("Failed to convert value for column %.*s\n", RES_NAMES(res)[n]->len, RES_NAMES(res)[n]->s); return -3; } } done: if(res) auth_dbf.free_result(auth_db_handle, res); return 0; }