rt_size = sqlvar->sqllen;
}
/* 1. 为存放TEXT或BYTE列数据申请空间 */
loc = (loc_t*)calloc(1, alloc_size);
if(NULL == loc)
{
return -1;
}
sqlvar->sqldata = (char *)loc;
/* 2. 初试化loc_t结构 */
byfill(loc, alloc_size, 0);
for(idx=0; idx {
loc->loc_loctype = LOCMEMORY;
loc->loc_bufsize = DB_IFX_BLOB_SIZE;
loc->loc_buffer = (char *)calloc(1, DB_IFX_BLOB_SIZE);
if(NULL == loc->loc_buffer)
{
return -1;
}
loc->loc_oflags = 0;
loc++;
}
return 0;
}
代码说明:
1. 由申请的空间大小的值,可以发现当取多行数据时,同一列的结果值在内存空间是并排存放的。其内存结构图:
图2 结果集存储结构图
图2说明:
1. 图上每个格子代表一列数据
2. 行列关系:
A:处在第一个sqlvar_struct中的结果集sqldata中第一列代表第一行第一列,第二列代表第二行第一列,第三列代表第三行第一列,....,以此类推;
B:处在第二个sqlvar_struct中的结果集sqldata中第一列代表第一行第二列,第二列代表第二行第二列,第三列代表第三行第二列, ...,以此类推;
C:依照AB的规律可推出其他的行列关系
3. 获取数据
在执行FETCH后,结果集就会存放在sqlda之中,应用程序如何通过行号-列号 或 行号-列名获取对应列的取值呢?可通过如下方式:
代码段六:
[cpp]
/* 根据行号+列号从结果集中取数据 */
char *db_ifx_get_data_by_idx(int row, int col, void *cntx)
{
ifx_sqlda_t *current = NULL;
struct sqlvar_struct *sqlvar = NULL;
db_ifx_cntx_t *context = (db_ifx_cntx_t *)cntx;
if(NULL == context->result
|| NULL == context->result->sqlvar
|| col <= 0
|| col > context->result->sqld
|| row <= 0
|| row > context->rows)
{
return NULL;
}
/* 1. 定位列 */
sqlvar = context->result->sqlvar+col-1;
/* 2. 返回结果 */
return db_ifx_get_value(sqlvar, context, rowno);
}
代码段七:
[cpp] view plaincopy
/* 通过行号+列明从结果集中取数据 */
char *db_ifx_get_data_by_name(int rowno, const char *name, db_ifx_cntx_t *context)
{
int idx = 0;
struct sqlvar_struct *sqlvar = NULL;
if(NULL == context->result
|| NULL == context->result->sqlvar
|| rowno <= 0
|| rowno > context->rows)
{
return NULL;
}
/* 1. 定位列 */
sqlvar = context->result->sqlvar;
for(idx=0; idxresult->sqld; idx++)
{
if(0 == strcasecmp(name, sqlvar->sqlname))
{
break;
}
sqlvar++;
}
if(idx == context->result->sqld)
{
return NULL;
}
/* 3. 返回结果 */
return db_ifx_get_value(sqlvar, context, rowno);
}
代码段八:
[cpp] view plaincopy
/* 转换并以字符串形式返回结果集数据 */
char *db_ifx_get_value(struct sqlvar_struct *sqlvar, db_ifx_cntx_t *cntx, int rowno)
{
int ret = 0;
loc_t *loc = NULL;
char *data = sqlvar->sqldata + (rowno-1)*sqlvar->sqllen,
*convert = cntx->convert,
*pconvert = NULL;
memset(convert, 0, cntx->convert_size);
switch (sqlvar->sqltype)
{
case CBOOLTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((unsigned char*)data));
return convert;
}
case CSHORTTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((short*)data));
return convert;
}
case CINTTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((int*)data));
return convert;
}
case CLONGTYPE:
{
snprintf(convert, cntx->convert_size, "%l", *((long*)data));