DBD-cubrid
view release on metacpan or search on metacpan
cci-src/src/cci/cci_query_execute.c view on Meta::CPAN
}
if (num_tuple < 0)
{
return 0;
}
else if (num_tuple == 0)
{
if (fetch_type == FETCH_FETCH && hm_get_broker_version (con_handle) >= CAS_PROTO_MAKE_VER (PROTOCOL_V5))
{
if (remain_size < NET_SIZE_BYTE)
{
return CCI_ER_COMMUNICATION;
}
NET_STR_TO_BYTE (req_handle->is_fetch_completed, cur_p);
remain_size -= NET_SIZE_BYTE;
cur_p += NET_SIZE_BYTE;
}
return 0;
}
tmp_tuple_value = (T_TUPLE_VALUE *) MALLOC (sizeof (T_TUPLE_VALUE) * num_tuple);
if (tmp_tuple_value == NULL)
return CCI_ER_NO_MORE_MEMORY;
memset ((char *) tmp_tuple_value, 0, sizeof (T_TUPLE_VALUE) * num_tuple);
for (i = 0; i < num_tuple; i++)
{
if (fetch_type == FETCH_FETCH)
{
if (remain_size < 4)
{
err_code = CCI_ER_COMMUNICATION;
goto fetch_info_decode_error;
}
NET_STR_TO_INT (tmp_tuple_value[i].tuple_index, cur_p);
cur_p += 4;
remain_size -= 4;
if (remain_size < NET_SIZE_OBJECT)
{
err_code = CCI_ER_COMMUNICATION;
goto fetch_info_decode_error;
}
stream_to_obj (cur_p, &(tmp_tuple_value[i].tuple_oid));
cur_p += NET_SIZE_OBJECT;
remain_size -= NET_SIZE_OBJECT;
}
tmp_tuple_value[i].column_ptr = (char **) MALLOC (sizeof (char *) * num_cols);
if (tmp_tuple_value[i].column_ptr == NULL)
{
err_code = CCI_ER_NO_MORE_MEMORY;
goto fetch_info_decode_error;
}
memset (tmp_tuple_value[i].column_ptr, '\0', sizeof (char *) * num_cols);
#if defined(WINDOWS)
tmp_tuple_value[i].decoded_ptr = (char **) MALLOC (sizeof (char *) * num_cols);
if (tmp_tuple_value[i].decoded_ptr == NULL)
{
err_code = CCI_ER_NO_MORE_MEMORY;
goto fetch_info_decode_error;
}
memset (tmp_tuple_value[i].decoded_ptr, '\0', sizeof (char *) * num_cols);
#endif
for (j = 0; j < num_cols; j++)
{
int data_size;
char *col_p;
#if defined (WINDOWS)
T_CCI_U_TYPE u_type;
#endif
col_p = cur_p;
if (remain_size < 4)
{
err_code = CCI_ER_COMMUNICATION;
goto fetch_info_decode_error;
}
NET_STR_TO_INT (data_size, cur_p);
remain_size -= 4;
cur_p += 4;
if (remain_size < data_size)
{
err_code = CCI_ER_COMMUNICATION;
goto fetch_info_decode_error;
}
#if defined (WINDOWS)
if (charset != NULL)
{
u_type = get_basic_utype (req_handle->col_info[j].ext_type);
}
if (charset != NULL
&& (u_type == CCI_U_TYPE_CHAR || u_type == CCI_U_TYPE_STRING || u_type == CCI_U_TYPE_NCHAR
|| u_type == CCI_U_TYPE_VARNCHAR || u_type == CCI_U_TYPE_ENUM))
{
err_code = decode_result_col (col_p, data_size, &(tmp_tuple_value[i].column_ptr[j]), charset);
if (err_code < 0)
{
goto fetch_info_decode_error;
}
else if (err_code == 0)
{
/* invalid character set. do not convert string */
tmp_tuple_value[i].column_ptr[j] = col_p;
}
else
{
tmp_tuple_value[i].decoded_ptr[j] = tmp_tuple_value[i].column_ptr[j];
}
}
else
{
tmp_tuple_value[i].column_ptr[j] = col_p;
}
#else
tmp_tuple_value[i].column_ptr[j] = col_p;
#endif
if (data_size > 0)
{
cur_p += data_size;
remain_size -= data_size;
}
} /* end of for j */
} /* end of for i */
if (fetch_type == FETCH_FETCH && hm_get_broker_version (con_handle) >= CAS_PROTO_MAKE_VER (PROTOCOL_V5))
{
if (remain_size < NET_SIZE_BYTE)
{
return CCI_ER_COMMUNICATION;
}
NET_STR_TO_BYTE (req_handle->is_fetch_completed, cur_p);
remain_size -= NET_SIZE_BYTE;
cur_p += NET_SIZE_BYTE;
}
*tuple_value = tmp_tuple_value;
return num_tuple;
fetch_info_decode_error:
if (tmp_tuple_value)
{
for (i = 0; i < num_tuple; i++)
{
#if defined (WINDOWS)
if (tmp_tuple_value[i].decoded_ptr)
{
for (j = 0; j < num_cols; j++)
{
FREE_MEM (tmp_tuple_value[i].decoded_ptr[j]);
}
FREE_MEM (tmp_tuple_value[i].decoded_ptr);
}
#endif
FREE_MEM (tmp_tuple_value[i].column_ptr);
}
FREE_MEM (tmp_tuple_value);
}
return err_code;
}
static void
stream_to_obj (char *buf, T_OBJECT * obj)
{
int pageid;
short volid, slotid;
NET_STR_TO_INT (pageid, buf);
NET_STR_TO_SHORT (slotid, buf + 4);
NET_STR_TO_SHORT (volid, buf + 6);
obj->pageid = pageid;
obj->slotid = slotid;
obj->volid = volid;
}
static int
get_data_set (T_CCI_U_EXT_TYPE u_ext_type, char *col_value_p, T_SET ** value, int data_size)
{
T_SET *set;
int ele_type;
int num_element;
int err_code;
if ((err_code = t_set_alloc (&set)) < 0)
{
return err_code;
}
if (!(CCI_IS_COLLECTION_TYPE (u_ext_type)))
{
return CCI_ER_TYPE_CONVERSION;
}
ele_type = *col_value_p;
col_value_p++;
data_size--;
NET_STR_TO_INT (num_element, col_value_p);
col_value_p += 4;
data_size -= 4;
set->type = ele_type;
set->num_element = num_element;
set->data_buf = MALLOC (data_size);
if (set->data_buf == NULL)
{
t_set_free (set);
return CCI_ER_NO_MORE_MEMORY;
}
memcpy (set->data_buf, col_value_p, data_size);
set->data_size = data_size;
( run in 0.919 second using v1.01-cache-2.11-cpan-39bf76dae61 )