本文整理汇总了C++中VAL_STR函数的典型用法代码示例。如果您正苦于以下问题:C++ VAL_STR函数的具体用法?C++ VAL_STR怎么用?C++ VAL_STR使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VAL_STR函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: bdb_push_data
void bdb_push_data(bdb_row_p _r, bdb_val_p _v)
{
if (_r->data.size == 0) {
_r->data.data = pkg_malloc(sizeof(*_v));
} else {
_r->data.data = pkg_realloc(_r->data.data, _r->data.size + sizeof(*_v));
}
memcpy(_r->data.data + _r->data.size, _v, sizeof(*_v));
_r->data.size += sizeof(*_v);
if (!VAL_NULL(&(_v->v))) {
switch (VAL_TYPE(&(_v->v))) {
case DB_STRING:
case DB_STR:
case DB_BLOB:
if (_r->tail.len == 0) {
_r->tail.s = pkg_malloc(VAL_STR(&(_v->v)).len);
} else {
_r->tail.s = pkg_realloc(_r->tail.s, _r->tail.len + VAL_STR(&(_v->v)).len);
}
memcpy(_r->tail.s + _r->tail.len, VAL_STR(&(_v->v)).s, VAL_STR(&(_v->v)).len);
_r->tail.len += VAL_STR(&(_v->v)).len;
break;
default:
break;
}
}
};
示例2: db_build_userbl_tree
int db_build_userbl_tree(const str *username, const str *domain, const str *table, struct dtrie_node_t *root, int use_domain)
{
db_key_t columns[2] = { &userblacklist_prefix_col, &userblacklist_whitelist_col };
db_key_t key[2] = { &userblacklist_username_col, &userblacklist_domain_col };
db_val_t val[2];
db1_res_t *res;
int i;
int n = 0;
void *nodeflags;
VAL_TYPE(val) = VAL_TYPE(val + 1) = DB1_STR;
VAL_NULL(val) = VAL_NULL(val + 1) = 0;
VAL_STR(val).s = username->s;
VAL_STR(val).len = username->len;
VAL_STR(val + 1).s = domain->s;
VAL_STR(val + 1).len = domain->len;
if (userblacklist_dbf.use_table(userblacklist_dbh, table) < 0) {
LM_ERR("cannot use table '%.*s'.\n", table->len, table->s);
return -1;
}
if (userblacklist_dbf.query(userblacklist_dbh, key, 0, val, columns, (!use_domain) ? (1) : (2), 2, 0, &res) < 0) {
LM_ERR("error while executing query.\n");
return -1;
}
dtrie_clear(root, NULL, match_mode);
if (RES_COL_N(res) > 1) {
for(i = 0; i < RES_ROW_N(res); i++) {
if ((!RES_ROWS(res)[i].values[0].nul) && (!RES_ROWS(res)[i].values[1].nul)) {
if ((RES_ROWS(res)[i].values[0].type == DB1_STRING) &&
(RES_ROWS(res)[i].values[1].type == DB1_INT)) {
/* LM_DBG("insert into tree prefix %s, whitelist %d",
RES_ROWS(res)[i].values[0].val.string_val,
RES_ROWS(res)[i].values[1].val.int_val); */
if (RES_ROWS(res)[i].values[1].val.int_val == 0) {
nodeflags=(void *)MARK_BLACKLIST;
} else {
nodeflags=(void *)MARK_WHITELIST;
}
if (dtrie_insert(root, RES_ROWS(res)[i].values[0].val.string_val, strlen(RES_ROWS(res)[i].values[0].val.string_val),
nodeflags, match_mode) < 0) LM_ERR("could not insert values into trie.\n");
n++;
}
else {
LM_ERR("got invalid result type from query.\n");
}
}
}
}
userblacklist_dbf.free_result(userblacklist_dbh, res);
return n;
}
示例3: db_sqlite_bind_values
static int db_sqlite_bind_values(sqlite3_stmt* stmt, const db_val_t* v, const int n)
{
int i, ret;
if (n>0 && v) {
for (i=0; i<n; i++) {
if (VAL_NULL(v+i)) {
ret=sqlite3_bind_null(stmt, i+1);
goto check_ret;
}
switch(VAL_TYPE(v+i)) {
/* every param has '+1' index because in sqlite the leftmost
* parameter has index '1' */
case DB_INT:
ret=sqlite3_bind_int(stmt, i+1, VAL_INT(v+i));
break;
case DB_BIGINT:
ret=sqlite3_bind_int64(stmt, i+1, VAL_BIGINT(v+i));
break;
case DB_DOUBLE:
ret=sqlite3_bind_double(stmt, i+1, VAL_DOUBLE(v+i));
break;
case DB_STRING:
ret=sqlite3_bind_text(stmt, i+1, VAL_STRING(v+i),
strlen(VAL_STRING(v+i)), SQLITE_STATIC);
break;
case DB_STR:
ret=sqlite3_bind_text(stmt, i+1, VAL_STR(v+i).s,
VAL_STR(v+i).len, SQLITE_STATIC);
break;
case DB_DATETIME:
ret=sqlite3_bind_int64(stmt, i+1, (long int)VAL_TIME(v+i));
break;
case DB_BLOB:
ret=sqlite3_bind_blob(stmt, i+1, (void*)VAL_BLOB(v+i).s,
VAL_BLOB(v+i).len, SQLITE_STATIC);
break;
case DB_BITMAP:
ret=sqlite3_bind_int(stmt, i+1, (int)VAL_BITMAP(v+i));
break;
default:
LM_BUG("invalid db type\n");
return 1;
}
check_ret:
if (ret != SQLITE_OK) {
return ret;
}
}
}
return SQLITE_OK;
}
示例4: switch
inline SV *valdata(db_val_t* val) {
SV *data = &PL_sv_undef;
const char* stringval;
switch(VAL_TYPE(val)) {
case DB1_INT:
data = newSViv(VAL_INT(val));
break;
case DB1_BIGINT:
LM_ERR("BIGINT not supported");
data = &PL_sv_undef;
break;
case DB1_DOUBLE:
data = newSVnv(VAL_DOUBLE(val));
break;
case DB1_STRING:
stringval = VAL_STRING(val);
if (strlen(stringval) > 0)
data = newSVpv(stringval, strlen(stringval));
else
data = &PL_sv_undef;
break;
case DB1_STR:
if (VAL_STR(val).len > 0)
data = newSVpv(VAL_STR(val).s, VAL_STR(val).len);
else
data = &PL_sv_undef;
break;
case DB1_DATETIME:
data = newSViv((unsigned int)VAL_TIME(val));
break;
case DB1_BLOB:
if (VAL_BLOB(val).len > 0)
data = newSVpv(VAL_BLOB(val).s,
VAL_BLOB(val).len);
else
data = &PL_sv_undef;
break;
case DB1_BITMAP:
data = newSViv(VAL_BITMAP(val));
break;
}
return data;
}
示例5: db_sqlite_free_result
/**
* Release a result set from memory.
* \param _h handle to the database
* \param _r result set that should be freed
* \return zero on success, negative value on failure
*/
int db_sqlite_free_result(db_con_t* _h, db_res_t* _r)
{
int i;
int j;
db_val_t* v;
db_row_t* res_col;
if (!_h) {
LM_ERR("invalid database handle\n");
return -1;
}
if (!_r) {
LM_DBG("nothing to free!\n");
return 0;
}
if (RES_ROWS(_r)) {
LM_DBG("freeing rows at %p\n", RES_ROWS(_r));
for (i = 0; i < RES_ROW_N(_r); i++) {
for (j = 0; j < RES_COL_N(_r); j++) {
res_col = &_r->rows[i];
v = &res_col->values[j];
if (VAL_NULL(v))
continue;
/* only allocated types; STR and BLOB;*/
if (VAL_TYPE(v) == DB_STR) {
pkg_free(VAL_STR(v).s);
VAL_STR(v).s = 0;
} else if (VAL_TYPE(v) == DB_BLOB) {
pkg_free(VAL_BLOB(v).s);
VAL_BLOB(v).s = 0;
}
}
}
pkg_free(_r->rows[0].values);
pkg_free(_r->rows);
RES_ROWS(_r) = NULL;
}
RES_ROW_N(_r) = 0;
pkg_free(_r);
_r = NULL;
return 0;
}
示例6: db_build_userbl_tree
/**
* Builds a d-tree using database entries.
* \return negative on failure, postive on success, indicating the number of d-tree entries
*/
int db_build_userbl_tree(const str *username, const str *domain, const str *table, struct dt_node_t *root, int use_domain)
{
db_key_t columns[2] = { &prefix_col, &whitelist_col };
db_key_t key[2] = { &username_key, &domain_key };
db_val_t val[2];
VAL_TYPE(val) = VAL_TYPE(val + 1) = DB_STR;
VAL_NULL(val) = VAL_NULL(val + 1) = 0;
VAL_STR(val).s = username->s;
VAL_STR(val).len = username->len;
VAL_STR(val + 1).s = domain->s;
VAL_STR(val + 1).len = domain->len;
db_res_t *res;
int i;
int n = 0;
if (dbf.use_table(dbc, table) < 0) {
LM_ERR("cannot use table '%.*s'.\n", table->len, table->s);
return -1;
}
if (dbf.query(dbc, key, 0, val, columns, (!use_domain) ? (1) : (2), 2, 0, &res) < 0) {
LM_ERR("error while executing query.\n");
return -1;
}
dt_clear(root);
if (RES_COL_N(res) > 1) {
for(i = 0; i < RES_ROW_N(res); i++) {
if ((!RES_ROWS(res)[i].values[0].nul) && (!RES_ROWS(res)[i].values[1].nul)) {
if ((RES_ROWS(res)[i].values[0].type == DB_STRING) &&
(RES_ROWS(res)[i].values[1].type == DB_INT)) {
/* LM_DBG("insert into tree prefix %s, whitelist %d",
RES_ROWS(res)[i].values[0].val.string_val,
RES_ROWS(res)[i].values[1].val.int_val); */
dt_insert(root, RES_ROWS(res)[i].values[0].val.string_val,
RES_ROWS(res)[i].values[1].val.int_val);
n++;
}
else {
LM_ERR("got invalid result type from query.\n");
}
}
}
}
dbf.free_result(dbc, res);
return n;
}
示例7: load_user_carrier
int load_user_carrier(str * user, str * domain) {
db1_res_t * res;
db_key_t cols[1];
db_key_t keys[2];
db_val_t vals[2];
db_op_t op[2];
int id;
int use_domain = cfg_get(carrierroute, carrierroute_cfg, use_domain);
if (!user || (use_domain && !domain)) {
LM_ERR("NULL pointer in parameter\n");
return -1;
}
cols[0] = subscriber_columns[SUBSCRIBER_CARRIER_COL];
keys[0] = subscriber_columns[SUBSCRIBER_USERNAME_COL];
op[0] = OP_EQ;
VAL_TYPE(vals) = DB1_STR;
VAL_NULL(vals) = 0;
VAL_STR(vals) = *user;
keys[1] = subscriber_columns[SUBSCRIBER_DOMAIN_COL];
op[1] = OP_EQ;
VAL_TYPE(vals+1) = DB1_STR;
VAL_NULL(vals+1) = 0;
VAL_STR(vals+1) = *domain;
if (carrierroute_dbf.use_table(carrierroute_dbh, &subscriber_table) < 0) {
LM_ERR("can't use table\n");
return -1;
}
if (carrierroute_dbf.query(carrierroute_dbh, keys, op, vals, cols, use_domain ? 2 : 1, 1, NULL, &res) < 0) {
LM_ERR("can't query database\n");
return -1;
}
if (RES_ROW_N(res) == 0) {
carrierroute_dbf.free_result(carrierroute_dbh, res);
return 0;
}
if (VAL_NULL(ROW_VALUES(RES_ROWS(res)))) {
carrierroute_dbf.free_result(carrierroute_dbh, res);
return 0;
}
id = VAL_INT(ROW_VALUES(RES_ROWS(res)));
carrierroute_dbf.free_result(carrierroute_dbh, res);
return id;
}
示例8: is_user_in
/*!
* \brief Check if username in specified header field is in a table
* \param _msg SIP message
* \param _hf Header field
* \param _grp checked table
* \return 1 on success, negative on failure
*/
int is_user_in(struct sip_msg* _msg, char* _hf, char* _grp)
{
db_key_t keys[3];
db_val_t vals[3];
db_key_t col[1];
db1_res_t* res = NULL;
keys[0] = &user_column;
keys[1] = &group_column;
keys[2] = &domain_column;
col[0] = &group_column;
if ( get_username_domain( _msg, (group_check_p)_hf, &(VAL_STR(vals)),
&(VAL_STR(vals+2)))!=0) {
LM_ERR("failed to get [email protected]\n");
return -1;
}
if (VAL_STR(vals).s==NULL || VAL_STR(vals).len==0 ) {
LM_DBG("no username part\n");
return -1;
}
VAL_TYPE(vals) = VAL_TYPE(vals + 1) = VAL_TYPE(vals + 2) = DB1_STR;
VAL_NULL(vals) = VAL_NULL(vals + 1) = VAL_NULL(vals + 2) = 0;
VAL_STR(vals + 1) = *((str*)_grp);
if (group_dbf.use_table(group_dbh, &table) < 0) {
LM_ERR("failed to use_table\n");
return -5;
}
if (group_dbf.query(group_dbh, keys, 0, vals, col, (use_domain) ? (3): (2),
1, 0, &res) < 0) {
LM_ERR("failed to query database\n");
return -5;
}
if (RES_ROW_N(res) == 0) {
LM_DBG("user is not in group '%.*s'\n",
((str*)_grp)->len, ZSW(((str*)_grp)->s));
group_dbf.free_result(group_dbh, res);
return -6;
} else {
LM_DBG("user is in group '%.*s'\n",
((str*)_grp)->len, ZSW(((str*)_grp)->s));
group_dbf.free_result(group_dbh, res);
return 1;
}
}
示例9: acc_db_request
int acc_db_request( struct sip_msg *rq, struct sip_msg *rpl,
query_list_t **ins_list)
{
static db_ps_t my_ps_ins = NULL;
static db_ps_t my_ps = NULL;
int m;
int n;
int i;
/* formated database columns */
m = core2strar( rq, val_arr );
for(i = 0; i < m; i++)
VAL_STR(db_vals+i) = val_arr[i];
/* time value */
VAL_TIME(db_vals+(m++)) = acc_env.ts;
/* extra columns */
m += extra2strar( db_extra, rq, rpl, val_arr+m, 0);
for( i++; i < m; i++)
VAL_STR(db_vals+i) = val_arr[i];
acc_dbf.use_table(db_handle, &acc_env.text/*table*/);
CON_PS_REFERENCE(db_handle) = ins_list? &my_ps_ins : &my_ps;
/* multi-leg columns */
if ( !leg_info ) {
if (con_set_inslist(&acc_dbf,db_handle,ins_list,db_keys,m) < 0 )
CON_RESET_INSLIST(db_handle);
if (acc_dbf.insert(db_handle, db_keys, db_vals, m) < 0) {
LM_ERR("failed to insert into database\n");
return -1;
}
} else {
n = legs2strar(leg_info,rq,val_arr+m,1);
do {
for ( i = m; i < m + n; i++)
VAL_STR(db_vals+i)=val_arr[i];
if (con_set_inslist(&acc_dbf,db_handle,ins_list,db_keys,m+n) < 0 )
CON_RESET_INSLIST(db_handle);
if (acc_dbf.insert(db_handle, db_keys, db_vals, m+n) < 0) {
LM_ERR("failed to insert into database\n");
return -1;
}
}while ( (n = legs2strar(leg_info,rq,val_arr+m,0))!=0 );
}
return 1;
}
示例10: check_manager_hello
/********************************************************************
* FUNCTION check_manager_hello
*
* Verify that the same NETCONF protocol verion is supported
* by the manager and this server
*
* INPUTS:
* scb == session control block
* val == value struct for the hello message to check
*
* RETURNS:
* status
*********************************************************************/
static status_t
check_manager_hello (ses_cb_t *scb,
val_value_t *val)
{
val_value_t *caps, *cap;
/* look for the NETCONF base capability string */
caps = val_find_child(val, NC_MODULE, NCX_EL_CAPABILITIES);
if (caps && caps->res == NO_ERR) {
if (ncx_protocol_enabled(NCX_PROTO_NETCONF11)) {
for (cap = val_find_child(caps, NC_MODULE, NCX_EL_CAPABILITY);
cap != NULL;
cap = val_find_next_child(caps, NC_MODULE,
NCX_EL_CAPABILITY, cap)) {
if (cap->res == NO_ERR) {
if (!xml_strcmp(VAL_STR(cap), CAP_BASE_URN11)) {
if (LOGDEBUG3) {
log_debug3("\nagt_hello: set "
"protocol to base:1.1");
}
return ses_set_protocol(scb, NCX_PROTO_NETCONF11);
}
}
}
}
if (ncx_protocol_enabled(NCX_PROTO_NETCONF10)) {
for (cap = val_find_child(caps, NC_MODULE, NCX_EL_CAPABILITY);
cap != NULL;
cap = val_find_next_child(caps, NC_MODULE,
NCX_EL_CAPABILITY, cap)) {
if (cap->res == NO_ERR) {
if (!xml_strcmp(VAL_STR(cap), CAP_BASE_URN)) {
if (LOGDEBUG3) {
log_debug3("\nagt_hello: set "
"protocol to base:1.0");
}
return ses_set_protocol(scb, NCX_PROTO_NETCONF10);
}
}
}
}
}
log_info("\nagt_hello: no NETCONF base:1.0 or base:1.1 URI found");
return ERR_NCX_MISSING_VAL_INST;
} /* check_manager_hello */
示例11: bdb_set_key
int bdb_set_key(bdb_row_p _r, bdb_val_p _v)
{
/* NULL is not allowed for primary key */
if (VAL_NULL(&(_v->v))) {
LOG(L_ERR, "BDB:bdb_set_key: NULL is not allowed for primary key\n");
return -1;
}
switch (VAL_TYPE(&(_v->v))) {
case DB_INT:
_r->key.data = &VAL_INT(&(_v->v));
_r->key.size = sizeof(VAL_INT(&(_v->v)));
break;
case DB_FLOAT:
_r->key.data = &VAL_FLOAT(&(_v->v));
_r->key.size = sizeof(VAL_FLOAT(&(_v->v)));
break;
case DB_DATETIME:
_r->key.data = &VAL_TIME(&(_v->v));
_r->key.size = sizeof(VAL_TIME(&(_v->v)));
break;
case DB_BLOB:
_r->key.data = VAL_BLOB(&(_v->v)).s;
_r->key.size = VAL_BLOB(&(_v->v)).len;
break;
case DB_DOUBLE:
_r->key.data = &VAL_DOUBLE(&(_v->v));
_r->key.size = sizeof(VAL_DOUBLE(&(_v->v)));
break;
case DB_STRING:
_r->key.data = (void *)VAL_STRING(&(_v->v));
_r->key.size = strlen(VAL_STRING(&(_v->v))) + 1;
break;
case DB_STR:
_r->key.data = VAL_STR(&(_v->v)).s;
_r->key.size = VAL_STR(&(_v->v)).len;
break;
case DB_BITMAP:
_r->key.data = &VAL_BITMAP(&(_v->v));
_r->key.size = sizeof(VAL_BITMAP(&(_v->v)));
break;
default:
LOG(L_ERR, "BDB:bdb_set_skey: unknown column type: %0X\n", VAL_TYPE(&(_v->v)));
return -1;
break;
}
return 0;
};
示例12: bdb_set_skey
void bdb_set_skey(bdb_srow_p _r, bdb_sval_p _v)
{
/* NULL is not allowed for primary key */
if (VAL_NULL(&(_v->v)))
return;
switch (VAL_TYPE(&(_v->v))) {
case DB_INT:
_r->key.data = &VAL_INT(&(_v->v));
_r->key.size = sizeof(VAL_INT(&(_v->v)));
break;
case DB_FLOAT:
_r->key.data = &VAL_FLOAT(&(_v->v));
_r->key.size = sizeof(VAL_FLOAT(&(_v->v)));
break;
case DB_DATETIME:
_r->key.data = &VAL_TIME(&(_v->v));
_r->key.size = sizeof(VAL_TIME(&(_v->v)));
break;
case DB_BLOB:
_r->key.data = VAL_BLOB(&(_v->v)).s;
_r->key.size = VAL_BLOB(&(_v->v)).len;
break;
case DB_DOUBLE:
_r->key.data = &VAL_DOUBLE(&(_v->v));
_r->key.size = sizeof(VAL_DOUBLE(&(_v->v)));
break;
case DB_STRING:
_r->key.data = (void *)VAL_STRING(&(_v->v));
_r->key.size = strlen(VAL_STRING(&(_v->v))) + 1;
break;
case DB_STR:
_r->key.data = VAL_STR(&(_v->v)).s;
_r->key.size = VAL_STR(&(_v->v)).len;
break;
case DB_BITMAP:
_r->key.data = &VAL_BITMAP(&(_v->v));
_r->key.size = sizeof(VAL_BITMAP(&(_v->v)));
break;
default:
LOG(L_ERR, "BDB:bdb_set_skey: unknown column type: %0X\n", VAL_TYPE(&(_v->v)));
break;
}
#ifdef BDB_EXTRA_DEBUG
LOG(L_NOTICE, "BDB:bdb_set_skey: use key '%.*s' (%d bytes)\n", _r->key.size, (char *)_r->key.data, _r->key.size);
#endif
};
示例13: does_uri_exist
/*
* Check if uri belongs to a local user
*/
int does_uri_exist(struct sip_msg* _msg, char* _s1, char* _s2)
{
static db_ps_t my_ps = NULL;
db_key_t keys[2];
db_val_t vals[2];
db_key_t cols[1];
db_res_t* res = NULL;
if (parse_sip_msg_uri(_msg) < 0) {
LM_ERR("Error while parsing URI\n");
return ERR_INTERNAL;
}
if (use_uri_table != 0) {
uridb_dbf.use_table(db_handle, &db_table);
keys[0] = &uridb_uriuser_col;
keys[1] = &uridb_domain_col;
cols[0] = &uridb_uriuser_col;
} else {
uridb_dbf.use_table(db_handle, &db_table);
keys[0] = &uridb_user_col;
keys[1] = &uridb_domain_col;
cols[0] = &uridb_user_col;
}
VAL_TYPE(vals) = VAL_TYPE(vals + 1) = DB_STR;
VAL_NULL(vals) = VAL_NULL(vals + 1) = 0;
VAL_STR(vals) = _msg->parsed_uri.user;
VAL_STR(vals + 1) = _msg->parsed_uri.host;
CON_PS_REFERENCE(db_handle) = &my_ps;
if (uridb_dbf.query(db_handle, keys, 0, vals, cols, (use_domain ? 2 : 1),
1, 0, &res) < 0) {
LM_ERR("Error while querying database\n");
return ERR_USERNOTFOUND;
}
if (RES_ROW_N(res) == 0) {
LM_DBG("User in request uri does not exist\n");
uridb_dbf.free_result(db_handle, res);
return ERR_DBEMTPYRES;
} else {
LM_DBG("User in request uri does exist\n");
uridb_dbf.free_result(db_handle, res);
return OK;
}
}
示例14: create_socket_info
struct socket_info * create_socket_info(db_val_t * vals, int n){
struct socket_info * sock;
str host, p;
int port, proto;
/* socket name */
p.s = (VAL_STR(vals+n)).s;
p.len = strlen(p.s);
if (VAL_NULL(vals+n) || p.s==0 || p.s[0]==0){
sock = 0;
} else {
if (parse_phostport( p.s, p.len, &host.s, &host.len,
&port, &proto)!=0) {
LM_ERR("bad socket <%.*s>\n", p.len, p.s);
return 0;
}
sock = grep_sock_info( &host, (unsigned short)port, proto);
if (sock==0) {
LM_WARN("non-local socket <%.*s>...ignoring\n", p.len, p.s);
}
}
return sock;
}
示例15: bdb_free_result
/*
* Free all memory allocated by get_result
*/
int bdb_free_result(db_con_t* _h, db_res_t* _r)
{
db_row_t* r;
db_val_t* v;
int i, j;
if (!_r) {
#ifdef BDB_EXTRA_DEBUG
LOG(L_NOTICE, "BDB:bdb_free_result: NULL pointer\n");
#endif
return 0;
}
for (i = 0; i < RES_ROW_N(_r); i++) {
r = &(RES_ROWS(_r)[i]);
for (j = 0; j < RES_COL_N(_r); j++) {
v = &(ROW_VALUES(r)[j]);
if (VAL_TYPE(v) == DB_STRING || VAL_TYPE(v) == DB_STR || VAL_TYPE(v) == DB_BLOB) {
free(VAL_STR(v).s);
}
}
free(ROW_VALUES(r));
}
free(RES_ROWS(_r));
for (i = 0; i < RES_COL_N(_r); i++) {
pkg_free((void *)RES_NAMES(_r)[i]);
}
pkg_free(RES_NAMES(_r));
pkg_free(RES_TYPES(_r));
pkg_free(_r);
return 0;
}