int bdb_rrow_db2bdb(db_con_t* _h, db_key_t* _k, int _n, bdb_rrow_p *_r) { bdb_rrow_p r; bdb_table_p t; bdb_column_p c; int found; int i; int c_idx; *_r = NULL; if ((t = bdb_find_table(CON_TABLE(_h))) == NULL) { #ifdef BDB_EXTRA_DEBUG LOG(L_ERR, "BDB:bdb_rrow_db2bdb: no table in use\n"); #endif return -1; }; i = (_n == 0) ? BDB_CON_COL_NUM(_h) : _n; r = pkg_malloc(sizeof(*r) * i); memset(r, 0, sizeof(*r) * i); if (_n > 0) { for (i = 0; i < _n; i++) { found = 0; for (c = t->cols, c_idx = 0; c != NULL; c = c->next, c_idx++) { if (!strcmp(_k[i], c->name.s)) { #ifdef BDB_EXTRA_DEBUG LOG(L_NOTICE, "BDB:bdb_rrow_db2bdb: filling column '%.*s', c_idx = %0d\n", c->name.len, c->name.s, c_idx); #endif r[i] = c_idx; found = 1; break; } } if (!found) { LOG(L_ERR, "BDB:bdb_rrow_db2bdb: column '%s' does not exist\n", _k[i]); bdb_free_rrow(r); return -1; } } } else { /* return all columns */ for (c = t->cols, c_idx = 0; c != NULL; c = c->next, c_idx++) { #ifdef BDB_EXTRA_DEBUG LOG(L_NOTICE, "BDB:bdb_rrow_db2bdb: filling column '%.*s', c_idx = %0d\n", c->name.len, c->name.s, c_idx); #endif r[c_idx] = c_idx; } } *_r = r; return 0; };
int bdb_query(db_con_t* _h, db_key_t* _k, db_op_t* _op, db_val_t* _v, db_key_t* _c, int _n, int _nc, db_key_t _o, db_res_t** _r) { bdb_srow_p s_r; /* search keys row */ bdb_rrow_p r_r; /* return keys row */ int ret; *_r = NULL; s_r = NULL; r_r = NULL; if (_o) { LOG(L_ERR, "BDB:bdb_query: ORDER BY is not supported.\n"); return -1; } if ((ret = bdb_srow_db2bdb(_h, _k, _op, _v, _n, &s_r)) < 0) { return -1; }; if ((ret = bdb_rrow_db2bdb(_h, _c, _nc, &r_r)) < 0) { bdb_free_srow(s_r); return -1; }; if ((ret = bdb_query_table(_h, s_r, r_r, _nc, _r)) < 0) { bdb_free_rrow(r_r); bdb_free_srow(s_r); return -1; }; bdb_free_rrow(r_r); bdb_free_srow(s_r); return 0; }