DBD-cubrid

 view release on metacpan or  search on metacpan

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

	do {				\
	  PTR = MALLOC(sizeof(double));	\
	  if (PTR != NULL) {		\
	    *((double*) (PTR)) = VALUE;	\
	  }				\
	} while (0)

#define ALLOC_COPY_DATE(PTR, VALUE)		\
	do {					\
	  PTR = MALLOC(sizeof(T_CCI_DATE));	\
	  if (PTR != NULL) {			\
	    *((T_CCI_DATE*) (PTR)) = VALUE;	\
	  }					\
	} while (0)

#define ALLOC_COPY_DATE_TZ(PTR, VALUE)		\
	do {					\
	  PTR = MALLOC(sizeof(T_CCI_DATE_TZ));	\
	  if (PTR != NULL) {			\
	    *((T_CCI_DATE_TZ*) (PTR)) = VALUE;	\
	  }					\
	} while (0)

#define ALLOC_COPY_OBJECT(PTR, VALUE)		\
	do {					\
	  PTR = MALLOC(sizeof(T_OBJECT));	\
	  if (PTR != NULL) {			\
	    *((T_OBJECT*) (PTR)) = VALUE;	\
	  }					\
	} while (0)

#define ALLOC_COPY_BIT(DEST, SRC, SIZE)		\
	do {					\
	  DEST = MALLOC(SIZE);			\
	  if (DEST != NULL) {			\
	    memcpy(DEST, SRC, SIZE);		\
	  }					\
	} while (0)

#define EXECUTE_ARRAY	0
#define EXECUTE_BATCH	1
#define EXECUTE_EXEC	2

/************************************************************************
 * PRIVATE TYPE DEFINITIONS						*
 ************************************************************************/

typedef enum
{
  FETCH_FETCH,
  FETCH_OID_GET,
  FETCH_COL_GET
} T_FETCH_TYPE;

/************************************************************************
 * PRIVATE FUNCTION PROTOTYPES						*
 ************************************************************************/

static int prepare_info_decode (char *buf, int *size, T_REQ_HANDLE * req_handle);
static int out_rs_info_decode (char *buf, int *size, T_REQ_HANDLE * req_handle);
static int get_cursor_pos (T_REQ_HANDLE * req_handle, int offset, char origin);
static int fetch_info_decode (char *buf, int size, int num_cols, T_TUPLE_VALUE ** tuple_value, T_FETCH_TYPE fetch_type,
			      T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle);
static void stream_to_obj (char *buf, T_OBJECT * obj);

static int get_data_set (T_CCI_U_EXT_TYPE u_ext_type, char *col_value_p, T_SET ** value, int data_size);
#if defined (ENABLE_UNUSED_FUNCTION)
static int get_file_size (char *filename);
#endif
static int get_column_info (char *buf_p, int *remain_size, T_CCI_COL_INFO ** ret_col_info, char **next_buf_p,
			    bool is_prepare);
static int oid_get_info_decode (char *buf_p, int remain_size, T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle);
static int schema_info_decode (char *buf_p, int size, T_REQ_HANDLE * req_handle);
static int col_get_info_decode (char *buf_p, int remain_size, int *col_size, int *col_type, T_REQ_HANDLE * req_handle,
				T_CON_HANDLE * con_handle);

static int next_result_info_decode (char *buf, int size, T_REQ_HANDLE * req_handle);
static int bind_value_conversion (T_CCI_A_TYPE a_type, T_CCI_U_TYPE u_type, char flag, void *value, int length,
				  T_BIND_VALUE * bind_value);
static int bind_value_to_net_buf (T_NET_BUF * net_buf, T_CCI_U_TYPE u_type, void *value, int size, char *charset,
				  bool set_default_value);
static int execute_array_info_decode (char *buf, int size, char flag, T_CCI_QUERY_RESULT ** qr, int *res_remain_size);
static T_CCI_U_TYPE get_basic_utype (T_CCI_U_EXT_TYPE u_ext_type);
static int parameter_info_decode (char *buf, int size, int num_param, T_CCI_PARAM_INFO ** res_param);
static int decode_fetch_result (T_CON_HANDLE * con_handle, T_REQ_HANDLE * req_handle, char *result_msg_org,
				char *result_msg_start, int result_msg_size);
static int qe_close_req_handle_internal (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, bool force_close);
static int qe_send_close_handle_msg (T_CON_HANDLE * con_handle, int server_handle_id);
#if defined(WINDOWS)
static int get_windows_charset_code (char *str);
#endif
#ifdef CCI_XA
static void add_arg_xid (T_NET_BUF * net_buf, XID * xid);
static int xa_prepare_info_decode (char *buf, int buf_size, int count, XID * xid, int num_xid_buf);
static void net_str_to_xid (char *buf, XID * xid);
#endif
static int shard_info_decode (char *buf_p, int size, int num_shard, T_CCI_SHARD_INFO ** shard_info);
static bool is_set_default_value_if_null (T_CON_HANDLE * con_handle, T_CCI_CUBRID_STMT stmt_type, char bind_mode);
static T_CCI_U_EXT_TYPE get_ext_utype_from_net_bytes (T_CCI_U_TYPE basic_type, T_CCI_U_TYPE set_type);
static void confirm_schema_type_info (T_REQ_HANDLE * req_handle, int col_no, T_CCI_U_TYPE u_type, char *col_value_p,
				      int data_size);


/************************************************************************
 * INTERFACE VARIABLES							*
 ************************************************************************/

/************************************************************************
 * PUBLIC VARIABLES							*
 ************************************************************************/

/************************************************************************
 * PRIVATE VARIABLES							*
 ************************************************************************/

/************************************************************************
 * IMPLEMENTATION OF INTERFACE FUNCTIONS 				*
 ************************************************************************/

/************************************************************************
 * IMPLEMENTATION OF PUBLIC FUNCTIONS	 				*

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

  ADD_ARG_BYTES (&net_buf, &flag, 1);

  autocommit_flag = (char) con_handle->autocommit_mode;
  ADD_ARG_BYTES (&net_buf, &autocommit_flag, 1);

  while (con_handle->deferred_close_handle_count > 0)
    {
      ADD_ARG_INT (&net_buf, con_handle->deferred_close_handle_list[--con_handle->deferred_close_handle_count]);
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  if (TIMEOUT_IS_SET (con_handle))
    {
      remaining_time = con_handle->current_timeout;
      remaining_time -= get_elapsed_time (&con_handle->start_time);
      if (remaining_time <= 0)
	{
	  net_buf_clear (&net_buf);
	  return CCI_ER_QUERY_TIMEOUT;
	}
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  result_code = net_recv_msg_timeout (con_handle, &result_msg, &result_msg_size, err_buf, remaining_time);
  if (result_code < 0)
    {
      return result_code;
    }

  result_msg_size -= 4;
  err_code = prepare_info_decode (result_msg + 4, &result_msg_size, req_handle);
  if (err_code < 0)
    {
      FREE_MEM (result_msg);
      return err_code;
    }

  FREE_MEM (result_msg);

  req_handle->handle_type = HANDLE_PREPARE;
  req_handle->handle_sub_type = 0;
  req_handle->server_handle_id = result_code;
  req_handle->cur_fetch_tuple_index = -1;
  if ((flag & CCI_PREPARE_UPDATABLE) != 0)
    {
      flag |= CCI_PREPARE_INCLUDE_OID;
    }
  req_handle->prepare_flag = flag;
  req_handle->cursor_pos = 0;
  req_handle->is_closed = 0;
  req_handle->valid = 1;
  req_handle->is_from_current_transaction = 1;

  if (!reuse)
    {
      if (req_handle->num_bind > 0)
	{
	  req_handle->bind_value = (T_BIND_VALUE *) MALLOC (sizeof (T_BIND_VALUE) * req_handle->num_bind);

	  if (req_handle->bind_value == NULL)
	    {
	      return CCI_ER_NO_MORE_MEMORY;
	    }

	  memset (req_handle->bind_value, 0, sizeof (T_BIND_VALUE) * req_handle->num_bind);

	  req_handle->bind_mode = (char *) MALLOC (req_handle->num_bind);
	  if (req_handle->bind_mode == NULL)
	    {
	      return CCI_ER_NO_MORE_MEMORY;
	    }

	  memset (req_handle->bind_mode, CCI_PARAM_MODE_UNKNOWN, req_handle->num_bind);
	}
    }

  return CCI_ER_NO_ERROR;
}

int
qe_bind_param (T_REQ_HANDLE * req_handle, int index, T_CCI_A_TYPE a_type, void *value, int length, T_CCI_U_TYPE u_type,
	       char flag)
{
  int err_code;

  assert (u_type >= CCI_U_TYPE_FIRST && u_type <= CCI_U_TYPE_LAST);

  index--;

  if (index < 0 || index >= req_handle->num_bind)
    {
      return CCI_ER_BIND_INDEX;
    }

  if (req_handle->bind_value[index].flag == BIND_PTR_DYNAMIC)
    {
      FREE_MEM (req_handle->bind_value[index].value);
      memset (&(req_handle->bind_value[index]), 0, sizeof (T_BIND_VALUE));
    }

  req_handle->bind_mode[index] = CCI_PARAM_MODE_IN;

  if (value == NULL || u_type == CCI_U_TYPE_NULL)
    {
      req_handle->bind_value[index].u_type = CCI_U_TYPE_NULL;
      return 0;
    }

  err_code = bind_value_conversion (a_type, u_type, flag, value, length, &(req_handle->bind_value[index]));

  return err_code;
}

int
qe_execute (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, char flag, int max_col_size, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_EXECUTE;
  char autocommit_flag;
  int i;
  int err_code = 0;
  int res_count;
  char *result_msg = NULL, *msg;
  int result_msg_size;
  T_CCI_QUERY_RESULT *qr = NULL;
  char fetch_flag;
  char forward_only_cursor;
  char include_column_info;
  int remain_msg_size = 0;
  int remaining_time = 0;
  bool use_server_query_cancel = false;
  int shard_id;
  T_BROKER_VERSION broker_ver;

  req_handle->is_fetch_completed = 0;
  QUERY_RESULT_FREE (req_handle);

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);
  ADD_ARG_BYTES (&net_buf, &flag, 1);
  ADD_ARG_INT (&net_buf, max_col_size);
  ADD_ARG_INT (&net_buf, req_handle->max_row);
  if (req_handle->first_stmt_type == CUBRID_STMT_CALL_SP)
    {
      ADD_ARG_BYTES (&net_buf, req_handle->bind_mode, req_handle->num_bind);
    }
  else
    {
      ADD_ARG_BYTES (&net_buf, NULL, 0);
    }

  if (req_handle->first_stmt_type == CUBRID_STMT_SELECT)
    {
      fetch_flag = 1;
    }
  else
    {
      fetch_flag = 0;
    }
  ADD_ARG_BYTES (&net_buf, &fetch_flag, 1);

  if (con_handle->autocommit_mode == CCI_AUTOCOMMIT_TRUE)
    {
      forward_only_cursor = true;
    }
  else
    {
      forward_only_cursor = false;
    }
  autocommit_flag = (char) con_handle->autocommit_mode;
  ADD_ARG_BYTES (&net_buf, &autocommit_flag, 1);
  ADD_ARG_BYTES (&net_buf, &forward_only_cursor, 1);

  ADD_ARG_CACHE_TIME (&net_buf, 0, 0);

  if (TIMEOUT_IS_SET (con_handle))
    {
      remaining_time = con_handle->current_timeout;
      remaining_time -= get_elapsed_time (&con_handle->start_time);
      if (remaining_time <= 0)
	{
	  err_code = CCI_ER_QUERY_TIMEOUT;
	  goto execute_error;
	}
    }

  broker_ver = hm_get_broker_version (con_handle);
  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V2))
    {
      /* In PROTOCOL_V2, cci driver use server query timeout feature, when disconnect_on_query_timeout is false. */
      if (TIMEOUT_IS_SET (con_handle) && con_handle->disconnect_on_query_timeout == false)
	{
	  use_server_query_cancel = true;
	}
      ADD_ARG_INT (&net_buf, remaining_time);
    }
  else if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V1))
    {
      /* cci does not use server query timeout in PROTOCOL_V1 */
      ADD_ARG_INT (&net_buf, 0);
    }

  for (i = 0; i < req_handle->num_bind; i++)
    {
      bind_value_to_net_buf (&net_buf, req_handle->bind_value[i].u_type, req_handle->bind_value[i].value,
			     req_handle->bind_value[i].size, con_handle->charset,
			     is_set_default_value_if_null (con_handle, req_handle->stmt_type,
							   req_handle->bind_mode[i]));
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      goto execute_error;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  if (err_code < 0)
    {
      goto execute_error;
    }

  net_buf_clear (&net_buf);

  res_count =
    net_recv_msg_timeout (con_handle, &result_msg, &result_msg_size, err_buf,
			  ((use_server_query_cancel) ? 0 : remaining_time));

  if (res_count < 0)
    {
      return res_count;
    }

  err_code = execute_array_info_decode (result_msg + 4, result_msg_size - 4, EXECUTE_EXEC, &qr, &remain_msg_size);
  if (err_code < 0 || remain_msg_size < 0)
    {
      FREE_MEM (result_msg);
      if (err_code == CCI_ER_NO_ERROR)
	{
	  return CCI_ER_COMMUNICATION;
	}

      return err_code;
    }

  if (qr == NULL)
    {
      req_handle->num_query_res = 0;
      req_handle->qr = NULL;
    }
  else
    {
      req_handle->num_query_res = err_code;
      req_handle->qr = qr;
    }

  if (req_handle->first_stmt_type == CUBRID_STMT_SELECT || req_handle->first_stmt_type == CUBRID_STMT_GET_STATS
      || req_handle->first_stmt_type == CUBRID_STMT_CALL || req_handle->first_stmt_type == CUBRID_STMT_EVALUATE)
    {
      req_handle->num_tuple = res_count;
    }
  else if (req_handle->first_stmt_type == CUBRID_STMT_CALL_SP)
    {
      req_handle->num_tuple = res_count;
    }
  else
    {
      req_handle->num_tuple = -1;
    }

  req_handle->execute_flag = flag;

  hm_req_handle_fetch_buf_free (req_handle);
  req_handle->cursor_pos = 0;

  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V2))
    {
      msg = result_msg + (result_msg_size - remain_msg_size);

      NET_STR_TO_BYTE (include_column_info, msg);
      remain_msg_size -= NET_SIZE_BYTE;
      msg += NET_SIZE_BYTE;

      if (include_column_info == 1)
	{
	  err_code = prepare_info_decode (msg, &remain_msg_size, req_handle);
	  if (err_code < 0)
	    {
	      FREE_MEM (result_msg);
	      return err_code;
	    }
	}
    }

  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V5))
    {
      msg = result_msg + (result_msg_size - remain_msg_size);

      NET_STR_TO_INT (shard_id, msg);
      remain_msg_size -= NET_SIZE_INT;
      msg += NET_SIZE_INT;

      con_handle->shard_id = shard_id;
      req_handle->shard_id = shard_id;
    }

  /* If fetch_flag is 1, executing query and fetching data is processed together. So, fetching results are included in
   * result_msg. */
  if (req_handle->first_stmt_type == CUBRID_STMT_SELECT)
    {
      int num_tuple;

      req_handle->cursor_pos = 1;
      num_tuple =
	decode_fetch_result (con_handle, req_handle, result_msg, result_msg + (result_msg_size - remain_msg_size) + 4,
			     remain_msg_size - 4);
      req_handle->cursor_pos = 0;
      if (num_tuple < 0)
	{
	  FREE_MEM (result_msg);
	  return num_tuple;
	}
    }
  else
    {
      FREE_MEM (result_msg);
    }

  req_handle->is_closed = 0;
  req_handle->is_from_current_transaction = 1;

  return res_count;

execute_error:
  net_buf_clear (&net_buf);
  return err_code;
}

int
qe_prepare_and_execute (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, char *sql_stmt, int max_col_size,
			T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_PREPARE_AND_EXECUTE;
  char autocommit_flag;
  int sql_stmt_size;
  int err_code;
  int result_code;
  int execute_res_count;
  char *result_msg = NULL;
  char *msg;
  char *result_msg_org;
  int result_msg_size;
  T_CCI_QUERY_RESULT *qr = NULL;
  char fetch_flag;
  char include_column_info;
  int remain_msg_size = 0;
  int remaining_time = 0;
  int num_tuple = 0;
  char prepare_flag = 0;
  char execute_flag = CCI_EXEC_QUERY_ALL;
  int prepare_argc_count = 3;
  bool use_server_query_cancel = false;
  int shard_id;
  T_BROKER_VERSION broker_ver;

  QUERY_RESULT_FREE (req_handle);

  ALLOC_COPY (req_handle->sql_text, sql_stmt);

  if (req_handle->sql_text == NULL)
    {
      return CCI_ER_NO_MORE_MEMORY;
    }

  sql_stmt_size = strlen (req_handle->sql_text) + 1;

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

      /* In PROTOCOL_V2, cci driver use server query timeout feature, when disconnect_on_query_timeout is false. */
      if (TIMEOUT_IS_SET (con_handle) && con_handle->disconnect_on_query_timeout == false)
	{
	  use_server_query_cancel = true;
	}
      ADD_ARG_INT (&net_buf, remaining_time);
    }
  else if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V1))
    {
      /* cci does not use server query timeout in PROTOCOL_V1 */
      ADD_ARG_INT (&net_buf, 0);
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      goto prepare_and_execute_error;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  if (err_code < 0)
    {
      goto prepare_and_execute_error;
    }

  net_buf_clear (&net_buf);


  /* prepare result */
  result_code =
    net_recv_msg_timeout (con_handle, &result_msg, &result_msg_size, err_buf,
			  ((use_server_query_cancel) ? 0 : remaining_time));

  if (result_code < 0)
    {
      return result_code;
    }

  result_msg_org = result_msg;
  result_msg += 4;
  result_msg_size -= 4;
  remain_msg_size = result_msg_size;

  err_code = prepare_info_decode (result_msg, &result_msg_size, req_handle);

  if (err_code < 0)
    {
      FREE_MEM (result_msg_org);
      return err_code;
    }

  req_handle->handle_type = HANDLE_PREPARE;
  req_handle->handle_sub_type = 0;
  req_handle->server_handle_id = result_code;
  req_handle->cur_fetch_tuple_index = -1;
  if ((prepare_flag & CCI_PREPARE_UPDATABLE) != 0)
    {
      prepare_flag |= CCI_PREPARE_INCLUDE_OID;
    }
  req_handle->prepare_flag = prepare_flag;
  req_handle->cursor_pos = 0;
  req_handle->is_closed = 0;
  req_handle->valid = 1;
  req_handle->is_from_current_transaction = 1;

  if (req_handle->stmt_type == CUBRID_STMT_SELECT)
    {
      fetch_flag = 1;
    }
  else
    {
      fetch_flag = 0;
    }

  /* execute result */
  result_msg += (remain_msg_size - result_msg_size);

  memcpy ((char *) &execute_res_count, result_msg + CAS_PROTOCOL_ERR_INDICATOR_INDEX, CAS_PROTOCOL_ERR_INDICATOR_SIZE);
  execute_res_count = ntohl (execute_res_count);

  result_msg += 4;
  result_msg_size -= 4;

  err_code = execute_array_info_decode (result_msg, result_msg_size, EXECUTE_EXEC, &qr, &remain_msg_size);
  if (err_code < 0 || remain_msg_size < 0)
    {
      FREE_MEM (result_msg_org);
      if (err_code == CCI_ER_NO_ERROR)
	{
	  return CCI_ER_COMMUNICATION;
	}

      return err_code;
    }

  if (qr == NULL)
    {
      req_handle->num_query_res = 0;
      req_handle->qr = NULL;
    }
  else
    {
      req_handle->num_query_res = err_code;
      req_handle->qr = qr;
    }

  if (req_handle->stmt_type == CUBRID_STMT_SELECT || req_handle->stmt_type == CUBRID_STMT_GET_STATS
      || req_handle->stmt_type == CUBRID_STMT_CALL || req_handle->stmt_type == CUBRID_STMT_EVALUATE)
    {
      req_handle->num_tuple = execute_res_count;
    }
  else if (req_handle->stmt_type == CUBRID_STMT_CALL_SP)
    {
      req_handle->num_tuple = execute_res_count;
    }
  else
    {
      req_handle->num_tuple = -1;
    }

  req_handle->execute_flag = execute_flag;

  hm_req_handle_fetch_buf_free (req_handle);
  req_handle->cursor_pos = 0;

  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V2))
    {
      msg = result_msg + (result_msg_size - remain_msg_size);

      NET_STR_TO_BYTE (include_column_info, msg);
      remain_msg_size -= NET_SIZE_BYTE;
      msg += NET_SIZE_BYTE;

      if (include_column_info == 1)
	{
	  err_code = prepare_info_decode (msg, &remain_msg_size, req_handle);
	  if (err_code < 0)
	    {
	      FREE_MEM (result_msg_org);
	      return err_code;
	    }
	}
    }

  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V5))
    {
      msg = result_msg + (result_msg_size - remain_msg_size);

      NET_STR_TO_INT (shard_id, msg);
      remain_msg_size -= NET_SIZE_INT;
      msg += NET_SIZE_INT;

      con_handle->shard_id = shard_id;
      req_handle->shard_id = shard_id;
    }

  /* If fetch_flag is 1, executing query and fetching data is processed together. So, fetching results are included in
   * result_msg. */
  if (fetch_flag)
    {
      req_handle->cursor_pos = 1;
      num_tuple =
	decode_fetch_result (con_handle, req_handle, result_msg_org,
			     result_msg + (result_msg_size - remain_msg_size) + 4, remain_msg_size - 4);
      req_handle->cursor_pos = 0;
      if (num_tuple < 0)
	{
	  FREE_MEM (result_msg_org);
	  return num_tuple;
	}
    }
  else
    {
      FREE_MEM (result_msg_org);
    }

  return execute_res_count;

prepare_and_execute_error:
  net_buf_clear (&net_buf);
  return err_code;
}


void
qe_bind_value_free (T_REQ_HANDLE * req_handle)
{
  int i;

  if (req_handle->bind_value == NULL)
    {
      return;
    }

  for (i = 0; i < req_handle->num_bind; i++)
    {
      if (req_handle->bind_value[i].flag == BIND_PTR_DYNAMIC)
	{
	  FREE_MEM (req_handle->bind_value[i].value);
	  req_handle->bind_value[i].flag = BIND_PTR_STATIC;
	}
    }
}

int
qe_get_db_parameter (T_CON_HANDLE * con_handle, T_CCI_DB_PARAM param_name, void *ret_val, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_GET_DB_PARAMETER;
  char *result_msg = NULL;
  int result_msg_size;
  int err_code = CCI_ER_NO_ERROR;
  int val;
  T_BROKER_VERSION broker_ver;

  if (ret_val == NULL)
    {
      return CCI_ER_NO_ERROR;
    }

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_INT (&net_buf, param_name);

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

  return err_code;
}

void
qe_close_req_handle_all (T_CON_HANDLE * con_handle)
{
  int i;
  T_REQ_HANDLE *req_handle;

  /* close handle in req handle table */
  for (i = 0; i < con_handle->max_req_handle; i++)
    {
      if (con_handle->req_handle_table[i] == NULL)
	{
	  continue;
	}
      req_handle = con_handle->req_handle_table[i];

      map_close_ots (req_handle->mapped_stmt_id);
      req_handle->mapped_stmt_id = -1;
      qe_close_req_handle_internal (req_handle, con_handle, false);
    }
  hm_req_handle_free_all (con_handle);
}

static int
qe_send_close_handle_msg (T_CON_HANDLE * con_handle, int server_handle_id)
{
  int err_code = 0;
  T_NET_BUF net_buf;
  char func_code = CAS_FC_CLOSE_REQ_HANDLE;
  char autocommit_flag;

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);
  ADD_ARG_INT (&net_buf, server_handle_id);
  autocommit_flag = (char) con_handle->autocommit_mode;
  ADD_ARG_BYTES (&net_buf, &autocommit_flag, 1);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  err_code = net_recv_msg (con_handle, NULL, NULL, NULL);

  return err_code;
}

int
qe_cursor (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, int offset, char origin, T_CCI_ERROR * err_buf)
{
  char func_code = CAS_FC_CURSOR;
  int err_code;
  char *result_msg = NULL;
  int result_msg_size;
  T_NET_BUF net_buf;
  char *cur_p;
  int tuple_num;
  int cursor_pos;

  if (req_handle->is_closed)
    {
      return CCI_ER_RESULT_SET_CLOSED;
    }

  if (req_handle->handle_type == HANDLE_PREPARE)
    {
      if (req_handle->stmt_type == CUBRID_STMT_SELECT || req_handle->stmt_type == CUBRID_STMT_GET_STATS
	  || req_handle->stmt_type == CUBRID_STMT_CALL || req_handle->stmt_type == CUBRID_STMT_CALL_SP
	  || req_handle->stmt_type == CUBRID_STMT_EVALUATE)
	{
	  if (req_handle->num_tuple >= 0)
	    {
	      cursor_pos = get_cursor_pos (req_handle, offset, origin);
	      if (cursor_pos <= 0)
		{
		  req_handle->cursor_pos = 0;
		  return CCI_ER_NO_MORE_DATA;
		}
	      else if (cursor_pos > req_handle->num_tuple)
		{
		  req_handle->cursor_pos = req_handle->num_tuple + 1;
		  return CCI_ER_NO_MORE_DATA;
		}

	      if (is_connected_to_oracle (con_handle) && cursor_pos > req_handle->fetched_tuple_end
		  && req_handle->is_fetch_completed)
		{
		  return CCI_ER_NO_MORE_DATA;
		}

	      req_handle->cursor_pos = cursor_pos;
	      return 0;
	    }
	  else
	    {			/* async query */
	      if (origin != CCI_CURSOR_LAST)
		{
		  cursor_pos = get_cursor_pos (req_handle, offset, origin);
		  req_handle->cursor_pos = cursor_pos;
		  if (req_handle->fetched_tuple_begin > 0 && cursor_pos >= req_handle->fetched_tuple_begin
		      && cursor_pos <= req_handle->fetched_tuple_end)
		    {
		      return 0;
		    }
		  if (cursor_pos <= 0)
		    {
		      req_handle->cursor_pos = 0;
		      return CCI_ER_NO_MORE_DATA;
		    }
		}
	    }
	}
      else
	{
	  return CCI_ER_NO_MORE_DATA;
	}
    }
  else if (req_handle->handle_type == HANDLE_SCHEMA_INFO || req_handle->handle_type == HANDLE_COL_GET)
    {
      cursor_pos = get_cursor_pos (req_handle, offset, origin);
      if (cursor_pos <= 0 || cursor_pos > req_handle->num_tuple)
	{
	  if (cursor_pos <= 0)
	    req_handle->cursor_pos = 0;
	  else if (cursor_pos > req_handle->num_tuple)
	    req_handle->cursor_pos = req_handle->num_tuple + 1;

	  return CCI_ER_NO_MORE_DATA;
	}
      req_handle->cursor_pos = cursor_pos;
      return 0;
    }
  else if (req_handle->handle_type == HANDLE_OID_GET)
    return 0;

  if (origin == CCI_CURSOR_FIRST || origin == CCI_CURSOR_LAST)
    {
      cursor_pos = offset;
    }
  else if (origin == CCI_CURSOR_CURRENT)
    {
      cursor_pos = req_handle->cursor_pos;
      origin = CCI_CURSOR_FIRST;
    }
  else
    return CCI_ER_INVALID_CURSOR_POS;

  net_buf_init (&net_buf);
  net_buf_cp_str (&net_buf, &func_code, 1);
  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);
  ADD_ARG_INT (&net_buf, cursor_pos);
  ADD_ARG_BYTES (&net_buf, &origin, 1);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      goto cursor_error;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  if (err_code < 0)
    {
      goto cursor_error;
    }
  net_buf_clear (&net_buf);

  err_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (err_code < 0)
    {
      return err_code;
    }
  if (result_msg == NULL)
    {
      return CCI_ER_COMMUNICATION;
    }

  cur_p = result_msg + NET_SIZE_INT;
  result_msg_size -= NET_SIZE_INT;

  if (result_msg_size < NET_SIZE_INT)
    {
      FREE_MEM (result_msg);
      return CCI_ER_COMMUNICATION;
    }
  NET_STR_TO_INT (tuple_num, cur_p);
  req_handle->num_tuple = tuple_num;
  FREE_MEM (result_msg);

  if (origin == CCI_CURSOR_FIRST)
    {
      if (req_handle->num_tuple >= 0 && req_handle->cursor_pos > req_handle->num_tuple)
	{
	  req_handle->cursor_pos = req_handle->num_tuple + 1;
	  return CCI_ER_NO_MORE_DATA;
	}
      req_handle->cursor_pos = cursor_pos;
    }
  else
    {
      if (req_handle->num_tuple <= 0 || req_handle->num_tuple - cursor_pos + 1 <= 0)
	{
	  req_handle->cursor_pos = 0;
	  return CCI_ER_NO_MORE_DATA;
	}
      req_handle->cursor_pos = req_handle->num_tuple - cursor_pos + 1;
    }

  return 0;

cursor_error:
  net_buf_clear (&net_buf);
  return err_code;
}

int
qe_fetch (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, char flag, int result_set_index, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  int err_code;
  char func_code = CAS_FC_FETCH;
  char *result_msg = NULL;
  int result_msg_size;
  int num_tuple;

  if (req_handle->cursor_pos <= 0)
    {
      return CCI_ER_NO_MORE_DATA;
    }

  if (req_handle->is_closed)
    {
      return CCI_ER_RESULT_SET_CLOSED;
    }

  if (req_handle->fetched_tuple_begin > 0 && req_handle->cursor_pos >= req_handle->fetched_tuple_begin
      && req_handle->cursor_pos <= req_handle->fetched_tuple_end)
    {
      req_handle->cur_fetch_tuple_index = req_handle->cursor_pos - req_handle->fetched_tuple_begin;
      if (flag)
	{
	  if (ut_is_deleted_oid (&(req_handle->tuple_value[req_handle->cur_fetch_tuple_index].tuple_oid)))
	    {
	      return CCI_ER_DELETED_TUPLE;
	    }
	}
      return 0;
    }

  hm_req_handle_fetch_buf_free (req_handle);

  net_buf_init (&net_buf);
  net_buf_cp_str (&net_buf, &func_code, 1);
  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);
  ADD_ARG_INT (&net_buf, req_handle->cursor_pos);
  ADD_ARG_INT (&net_buf, req_handle->fetch_size);
  ADD_ARG_BYTES (&net_buf, &flag, 1);
  ADD_ARG_INT (&net_buf, result_set_index);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  err_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  num_tuple = decode_fetch_result (con_handle, req_handle, result_msg, result_msg + 4, result_msg_size - 4);
  if (num_tuple < 0)
    {
      FREE_MEM (result_msg);
      return num_tuple;
    }

  if (num_tuple != 0)
    {
      if (flag)
	{
	  if (ut_is_deleted_oid (&(req_handle->tuple_value[0].tuple_oid)))
	    {
	      return CCI_ER_DELETED_TUPLE;
	    }
	}
    }
  else
    {
      if (is_connected_to_oracle (con_handle) && req_handle->cursor_pos > req_handle->fetched_tuple_end
	  && req_handle->is_fetch_completed)
	{
	  return CCI_ER_NO_MORE_DATA;
	}
    }

  return 0;
}

int
qe_get_data (T_CON_HANDLE * con_handle, T_REQ_HANDLE * req_handle, int col_no, int a_type, void *value, int *indicator)
{
  char *col_value_p;
  T_CCI_U_EXT_TYPE u_ext_type;
  T_CCI_U_TYPE u_type;
  int data_size;
  int err_code;
  int num_cols;

  if (req_handle->is_closed)
    {
      return CCI_ER_RESULT_SET_CLOSED;
    }

  if (req_handle->stmt_type == CUBRID_STMT_CALL_SP)
    {
      num_cols = req_handle->num_bind + 1;
      col_no++;
    }
  else
    {
      num_cols = req_handle->num_col_info;
    }

  if (col_no <= 0 || col_no > num_cols)
    {
      return CCI_ER_COLUMN_INDEX;
    }

  if (req_handle->cur_fetch_tuple_index < 0)
    {
      return CCI_ER_INVALID_CURSOR_POS;
    }

  col_value_p = req_handle->tuple_value[req_handle->cur_fetch_tuple_index].column_ptr[col_no - 1];

  if (req_handle->stmt_type == CUBRID_STMT_CALL_SP)
    {
      u_ext_type = CCI_U_TYPE_NULL;
    }
  else
    {
      u_ext_type = CCI_GET_RESULT_INFO_TYPE (req_handle->col_info, col_no);
    }

  NET_STR_TO_INT (data_size, col_value_p);
  if (data_size <= 0)
    {
      *indicator = -1;
      if (a_type == CCI_A_TYPE_STR || a_type == CCI_A_TYPE_SET || a_type == CCI_A_TYPE_BLOB

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

  return 0;
}

int
qe_schema_info (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, int type, char *arg1, char *arg2, char flag,
		int shard_id, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_SCHEMA_INFO;
  int err_code;
  int result_code;
  char *result_msg;
  int result_msg_size;
  T_BROKER_VERSION broker_ver;

  net_buf_init (&net_buf);
  net_buf_cp_str (&net_buf, &func_code, 1);
  ADD_ARG_INT (&net_buf, type);

  if (arg1 == NULL)
    ADD_ARG_BYTES (&net_buf, NULL, 0);
  else
    ADD_ARG_STR (&net_buf, arg1, strlen (arg1) + 1, con_handle->charset);
  if (arg2 == NULL)
    ADD_ARG_BYTES (&net_buf, NULL, 0);
  else
    ADD_ARG_STR (&net_buf, arg2, strlen (arg2) + 1, con_handle->charset);
  ADD_ARG_BYTES (&net_buf, &flag, 1);

  broker_ver = hm_get_broker_version (con_handle);
  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V5))
    {
      ADD_ARG_INT (&net_buf, shard_id);
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  result_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (result_code < 0)
    return result_code;

  err_code = schema_info_decode (result_msg + 4, result_msg_size - 4, req_handle);
  FREE_MEM (result_msg);
  if (err_code < 0)
    return err_code;

  req_handle->handle_type = HANDLE_SCHEMA_INFO;
  req_handle->handle_sub_type = type;
  req_handle->server_handle_id = result_code;
  req_handle->cur_fetch_tuple_index = -1;
  req_handle->cursor_pos = 0;
  req_handle->valid = 1;

  return 0;
}

int
qe_oid_get (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, char *oid_str, char **attr_name,
	    T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_OID_GET;
  int err_code;
  char *result_msg = NULL;
  int result_msg_size;
  int result_code;
  int i;
  T_OBJECT oid;

  if (ut_str_to_oid (oid_str, &oid) < 0)
    return CCI_ER_OBJECT;

  net_buf_init (&net_buf);
  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_OBJECT (&net_buf, &oid);
  if (attr_name)
    {
      for (i = 0; attr_name[i] != NULL; i++)
	{
	  ADD_ARG_STR (&net_buf, attr_name[i], strlen (attr_name[i]) + 1, con_handle->charset);
	}
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  result_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (result_code < 0)
    return result_code;

  err_code = oid_get_info_decode (result_msg + 4, result_msg_size - 4, req_handle, con_handle);
  if (err_code < 0)
    {
      FREE_MEM (result_msg);
      return err_code;
    }

  req_handle->handle_type = HANDLE_OID_GET;
  req_handle->handle_sub_type = 0;
  req_handle->msg_buf = result_msg;
  return 0;

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN


  return err_code;
}

int
qe_col_get (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, char *oid_str, const char *col_attr, int *col_size,
	    int *col_type, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_COLLECTION;
  char col_cmd = CCI_COL_GET;
  int err_code;
  T_OBJECT oid;
  char *result_msg = NULL;
  int result_msg_size;

  if (ut_str_to_oid (oid_str, &oid) < 0)
    {
      return CCI_ER_OBJECT;
    }

  if (col_attr == NULL)
    {
      col_attr = "";
    }

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_BYTES (&net_buf, &col_cmd, 1);
  ADD_ARG_OBJECT (&net_buf, &oid);
  ADD_ARG_STR (&net_buf, col_attr, strlen (col_attr) + 1, con_handle->charset);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  err_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (err_code < 0)
    return err_code;

  err_code = col_get_info_decode (result_msg + 4, result_msg_size - 4, col_size, col_type, req_handle, con_handle);
  if (err_code < 0)
    {
      FREE_MEM (result_msg);
      return err_code;
    }

  req_handle->handle_type = HANDLE_COL_GET;
  req_handle->handle_sub_type = 0;
  req_handle->msg_buf = result_msg;
  req_handle->cursor_pos = 0;

  return 0;
}

int
qe_get_row_count (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, int *row_count, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_GET_ROW_COUNT;
  int err_code;
  char *result_msg = NULL;
  int result_msg_size;
  int tmp;
  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  err_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (err_code < 0)
    return err_code;

  if (result_msg_size < 4)
    {
      FREE_MEM (result_msg);
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_INT (tmp, result_msg + 4);

  if (row_count)
    {
      *row_count = tmp;
    }

  return 0;
}

int
qe_get_last_insert_id (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, void *value, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_GET_LAST_INSERT_ID;
  int err_code;
  char *result_msg = NULL;
  int result_msg_size;
  int valsize = 0;
  unsigned char type = 0;
  char *ptr = NULL;

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    return err_code;

  err_code = net_recv_msg (con_handle, NULL, NULL, err_buf);
  return err_code;
}

int
qe_next_result (T_REQ_HANDLE * req_handle, char flag, T_CON_HANDLE * con_handle, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_NEXT_RESULT;
  int err_code;
  char *result_msg = NULL;
  int result_msg_size;

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);
  ADD_ARG_BYTES (&net_buf, &flag, 1);

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  err_code = net_recv_msg (con_handle, &result_msg, &result_msg_size, err_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  hm_req_handle_fetch_buf_free (req_handle);

  err_code = next_result_info_decode (result_msg + 4, result_msg_size - 4, req_handle);

  FREE_MEM (result_msg);

  req_handle->cursor_pos = 0;

  return err_code;
}

int
qe_execute_array (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, T_CCI_QUERY_RESULT ** qr, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_EXECUTE_ARRAY;
  char autocommit_flag;
  int err_code = 0;
  T_BIND_VALUE cur_cell;
  int row, idx;
  char *result_msg = NULL;
  char *msg;
  int result_msg_size;
  int remain_size;
  int remaining_time = 0;
  int shard_id;
  T_BROKER_VERSION broker_ver;

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);

  broker_ver = hm_get_broker_version (con_handle);
  if (hm_broker_understand_the_protocol (broker_ver, PROTOCOL_V4))
    {
      if (TIMEOUT_IS_SET (con_handle))
	{
	  remaining_time = con_handle->current_timeout;
	  remaining_time -= get_elapsed_time (&con_handle->start_time);
	  if (remaining_time <= 0)
	    {
	      net_buf_clear (&net_buf);
	      return CCI_ER_QUERY_TIMEOUT;
	    }
	}
      ADD_ARG_INT (&net_buf, remaining_time);
    }

  autocommit_flag = (char) con_handle->autocommit_mode;
  ADD_ARG_BYTES (&net_buf, &autocommit_flag, 1);

  for (row = 0; row < req_handle->bind_array_size; row++)
    {
      for (idx = 0; idx < req_handle->num_bind; idx++)
	{
	  cur_cell.flag = BIND_PTR_STATIC;
	  cur_cell.value = NULL;
	  cur_cell.size = 0;

	  if (req_handle->bind_value[idx].value == NULL)
	    {
	      cur_cell.u_type = CCI_U_TYPE_NULL;
	    }
	  else if (req_handle->bind_value[idx].null_ind[row])
	    {

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

      NET_STR_TO_INT (shard_id, msg);
      remain_size -= NET_SIZE_INT;
      msg += NET_SIZE_INT;

      con_handle->shard_id = shard_id;
      req_handle->shard_id = shard_id;
    }

  FREE_MEM (result_msg);
  return err_code;
}

void
qe_query_result_free (int num_q, T_CCI_QUERY_RESULT * qr)
{
  int i;

  if (qr)
    {
      for (i = 0; i < num_q; i++)
	FREE_MEM (qr[i].err_msg);
      FREE_MEM (qr);
    }
}

int
qe_query_result_copy (T_REQ_HANDLE * req_handle, T_CCI_QUERY_RESULT ** res_qr)
{
  T_CCI_QUERY_RESULT *qr = NULL;
  int num_query = req_handle->num_query_res;
  int i;

  *res_qr = NULL;

  if (req_handle->qr == NULL || num_query == 0)
    {
      return 0;
    }

  qr = (T_CCI_QUERY_RESULT *) MALLOC (sizeof (T_CCI_QUERY_RESULT) * num_query);
  if (qr == NULL)
    {
      return CCI_ER_NO_MORE_MEMORY;
    }

  for (i = 0; i < num_query; i++)
    {
      qr[i].result_count = req_handle->qr[i].result_count;
      qr[i].stmt_type = req_handle->qr[i].stmt_type;
      qr[i].err_no = req_handle->qr[i].err_no;
      ALLOC_COPY (qr[i].err_msg, req_handle->qr[i].err_msg);
      strcpy (qr[i].oid, req_handle->qr[i].oid);
    }

  *res_qr = qr;

  return num_query;
}

int
qe_cursor_update (T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle, int cursor_pos, int index, T_CCI_A_TYPE a_type,
		  void *value, T_CCI_ERROR * err_buf)
{
  T_NET_BUF net_buf;
  char func_code = CAS_FC_CURSOR_UPDATE;
  int err_code;
  T_BIND_VALUE bind_value;
  char u_type;

  net_buf_init (&net_buf);

  net_buf_cp_str (&net_buf, &func_code, 1);

  ADD_ARG_INT (&net_buf, req_handle->server_handle_id);
  ADD_ARG_INT (&net_buf, cursor_pos);
  ADD_ARG_INT (&net_buf, index);

  if (value == NULL)
    {
      bind_value.flag = BIND_PTR_STATIC;
      bind_value.value = NULL;
      bind_value.size = 0;
      bind_value.u_type = CCI_U_TYPE_NULL;
    }
  else
    {
      if (req_handle->col_info == NULL)
	{
	  net_buf_clear (&net_buf);
	  return CCI_ER_TYPE_CONVERSION;
	}

      u_type = get_basic_utype (req_handle->col_info[index - 1].ext_type);
      if (u_type <= CCI_U_TYPE_FIRST || u_type > CCI_U_TYPE_LAST)
	{
	  net_buf_clear (&net_buf);
	  return CCI_ER_TYPE_CONVERSION;
	}

      bind_value.flag = BIND_PTR_STATIC;
      bind_value.value = NULL;

      err_code =
	bind_value_conversion (a_type, (T_CCI_U_TYPE) u_type, CCI_BIND_PTR, value, UNMEASURED_LENGTH, &bind_value);
      if (err_code < 0)
	{
	  net_buf_clear (&net_buf);
	  return err_code;
	}
    }

  bind_value_to_net_buf (&net_buf, bind_value.u_type, bind_value.value, bind_value.size, con_handle->charset, false);
  if (bind_value.flag == BIND_PTR_DYNAMIC)
    {
      FREE_MEM (bind_value.value);
    }

  if (net_buf.err_code < 0)
    {
      err_code = net_buf.err_code;
      net_buf_clear (&net_buf);
      return err_code;
    }

  err_code = net_send_msg (con_handle, net_buf.data, net_buf.data_size);
  net_buf_clear (&net_buf);
  if (err_code < 0)
    {
      return err_code;
    }

  err_code = net_recv_msg (con_handle, NULL, NULL, err_buf);

  return err_code;
}

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

{
  char *cur_p = buf;
  int remain_size = *size;
  int out_srv_handle_id;
  char stmt_type;
  int max_row;
  char updatable_flag;
  int num_col_info;
  T_CCI_COL_INFO *col_info = NULL;

  if (remain_size < NET_SIZE_INT)
    {
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_INT (out_srv_handle_id, cur_p);
  remain_size -= NET_SIZE_INT;
  cur_p += NET_SIZE_INT;
  if (remain_size < NET_SIZE_BYTE)
    {
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_BYTE (stmt_type, cur_p);
  remain_size -= NET_SIZE_BYTE;
  cur_p += NET_SIZE_BYTE;
  if (remain_size < NET_SIZE_INT)
    {
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_INT (max_row, cur_p);
  remain_size -= NET_SIZE_INT;
  cur_p += NET_SIZE_INT;
  if (remain_size < NET_SIZE_BYTE)
    {
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_BYTE (updatable_flag, cur_p);
  remain_size -= NET_SIZE_BYTE;
  cur_p += NET_SIZE_BYTE;

  num_col_info = get_column_info (cur_p, &remain_size, &col_info, NULL, true);
  if (num_col_info < 0)
    {
      return num_col_info;
    }

  req_handle_col_info_free (req_handle);

  req_handle->server_handle_id = out_srv_handle_id;
  req_handle->handle_type = HANDLE_PREPARE;
  req_handle->handle_sub_type = 0;
  req_handle->num_tuple = max_row;
  req_handle->num_col_info = num_col_info;
  req_handle->col_info = col_info;
  req_handle->stmt_type = (T_CCI_CUBRID_STMT) stmt_type;
  req_handle->first_stmt_type = req_handle->stmt_type;
  req_handle->updatable_flag = updatable_flag;
  req_handle->cursor_pos = 0;
  /**
   * dummy. actually we don't need below information.
   * if we don't make this, cci_close_query_result() will raise error.
   */
  req_handle->num_query_res = 1;
  req_handle->qr = (T_CCI_QUERY_RESULT *) MALLOC (sizeof (T_CCI_QUERY_RESULT));
  if (req_handle->qr == NULL)
    {
      return CCI_ER_NO_MORE_MEMORY;
    }

  req_handle->qr[0].result_count = 1;
  req_handle->qr[0].stmt_type = stmt_type;
  req_handle->qr[0].err_no = 0;
  req_handle->qr[0].err_msg = NULL;

  return 0;
}

static int
get_cursor_pos (T_REQ_HANDLE * req_handle, int offset, char origin)
{
  if (origin == CCI_CURSOR_FIRST)
    {
      return offset;
    }
  else if (origin == CCI_CURSOR_LAST)
    {
      return (req_handle->num_tuple - offset + 1);
    }
  return (req_handle->cursor_pos + offset);
}

static int
fetch_info_decode (char *buf, int size, int num_cols, T_TUPLE_VALUE ** tuple_value, T_FETCH_TYPE fetch_type,
		   T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle)
{
  int remain_size = size;
  char *cur_p = buf;
  int err_code = 0;
  int num_tuple, i, j;
  T_TUPLE_VALUE *tmp_tuple_value = NULL;
  char *charset = con_handle->charset;

  if (fetch_type == FETCH_FETCH || fetch_type == FETCH_COL_GET)
    {
      if (remain_size < 4)
	{
	  return CCI_ER_COMMUNICATION;
	}

      NET_STR_TO_INT (num_tuple, cur_p);
      remain_size -= 4;
      cur_p += 4;
    }
  else
    {
      num_tuple = 1;
    }

  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)

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN

	  FREE_MEM (col_info[i].real_attr);
	  FREE_MEM (col_info[i].class_name);
	  FREE_MEM (col_info[i].default_value);
	}
      FREE_MEM (col_info);
    }

  return CCI_ER_COMMUNICATION;
}

static int
oid_get_info_decode (char *buf_p, int remain_size, T_REQ_HANDLE * req_handle, T_CON_HANDLE * con_handle)
{
  int num_col_info;
  int class_name_size;
  int err_code;
  char *class_name;
  char *cur_p = buf_p;
  int size;
  char *next_buf_p;
  T_CCI_COL_INFO *col_info = NULL;

  if (remain_size < NET_SIZE_INT)
    return CCI_ER_COMMUNICATION;
  NET_STR_TO_INT (class_name_size, cur_p);
  remain_size -= NET_SIZE_INT;
  cur_p += NET_SIZE_INT;

  if (remain_size < class_name_size || class_name_size <= 0)
    {
      return CCI_ER_COMMUNICATION;
    }

  class_name = cur_p;
  remain_size -= class_name_size;
  cur_p += class_name_size;

  size = remain_size;

  num_col_info = get_column_info (cur_p, &size, &col_info, &next_buf_p, false);
  if (num_col_info < 0)
    {
      assert (col_info == NULL);
      return num_col_info;
    }

  req_handle->col_info = col_info;
  req_handle->num_col_info = num_col_info;

  remain_size -= CAST_STRLEN (next_buf_p - cur_p);
  err_code =
    fetch_info_decode (next_buf_p, remain_size, num_col_info, &(req_handle->tuple_value), FETCH_OID_GET, req_handle,
		       con_handle);
  if (err_code < 0)
    {
      return err_code;
    }

  req_handle->fetched_tuple_end = req_handle->fetched_tuple_begin = 1;
  req_handle->cur_fetch_tuple_index = 0;
  req_handle->cursor_pos = 1;
  return 0;
}

static int
schema_info_decode (char *buf_p, int size, T_REQ_HANDLE * req_handle)
{
  T_CCI_COL_INFO *col_info = NULL;
  int remain_size = size;
  char *cur_p = buf_p;
  int num_tuple;
  int num_col_info;

  if (remain_size < 4)
    {
      return CCI_ER_COMMUNICATION;
    }

  NET_STR_TO_INT (num_tuple, cur_p);
  remain_size -= 4;
  cur_p += 4;

  size = remain_size;
  num_col_info = get_column_info (cur_p, &size, &col_info, NULL, false);
  if (num_col_info < 0)
    {
      assert (col_info == NULL);
      return num_col_info;
    }

  req_handle->num_col_info = num_col_info;
  req_handle->col_info = col_info;
  req_handle->num_tuple = num_tuple;

  return 0;
}

static int
col_get_info_decode (char *buf_p, int remain_size, int *col_size, int *col_type, T_REQ_HANDLE * req_handle,
		     T_CON_HANDLE * con_handle)
{
  int num_col_info;
  char *cur_p = buf_p;
  char *next_buf_p;
  T_CCI_COL_INFO *col_info = NULL;
  int num_tuple;
  int size;

  if (remain_size < 1)
    return CCI_ER_COMMUNICATION;
  if (col_type)
    {
      *col_type = *cur_p;
    }
  remain_size -= 1;
  cur_p += 1;

  size = remain_size;
  num_col_info = get_column_info (cur_p, &size, &col_info, &next_buf_p, false);
  if (num_col_info < 0)
    {

cci-src/src/cci/cci_query_execute.c  view on Meta::CPAN


      if (size < 2)
	{
	  goto param_decode_error;
	}
      NET_STR_TO_SHORT (param[i].scale, buf);
      size -= 2;
      buf += 2;

      if (size < 4)
	{
	  goto param_decode_error;
	}
      NET_STR_TO_INT (param[i].precision, buf);
      size -= 4;
      buf += 4;
    }

  *res_param = param;

  return 0;

param_decode_error:
  qe_param_info_free (param);
  return CCI_ER_COMMUNICATION;
}

static int
decode_fetch_result (T_CON_HANDLE * con_handle, T_REQ_HANDLE * req_handle, char *result_msg_org, char *result_msg_start,
		     int result_msg_size)
{
  int num_cols;
  int num_tuple;

  if (req_handle->stmt_type == CUBRID_STMT_CALL_SP)
    {
      num_cols = req_handle->num_bind + 1;
    }
  else
    {
      num_cols = req_handle->num_col_info;
    }

  num_tuple =
    fetch_info_decode (result_msg_start, result_msg_size, num_cols, &(req_handle->tuple_value), FETCH_FETCH, req_handle,
		       con_handle);
  if (num_tuple < 0)
    {
      return num_tuple;
    }

  if (num_tuple == 0)
    {
      req_handle->fetched_tuple_begin = 0;
      req_handle->fetched_tuple_end = 0;
      req_handle->msg_buf = result_msg_org;
      req_handle->cur_fetch_tuple_index = -1;
    }
  else
    {
      req_handle->fetched_tuple_begin = req_handle->cursor_pos;
      req_handle->fetched_tuple_end = req_handle->cursor_pos + num_tuple - 1;
      req_handle->msg_buf = result_msg_org;
      req_handle->cur_fetch_tuple_index = 0;
    }

  return num_tuple;
}

#ifdef CCI_XA
static void
add_arg_xid (T_NET_BUF * net_buf, XID * xid)
{
  net_buf_cp_int (net_buf, 12 + xid->gtrid_length + xid->bqual_length);
  net_buf_cp_int (net_buf, xid->formatID);
  net_buf_cp_int (net_buf, xid->gtrid_length);
  net_buf_cp_int (net_buf, xid->bqual_length);
  net_buf_cp_str (net_buf, xid->data, xid->gtrid_length + xid->bqual_length);
}

static int
xa_prepare_info_decode (char *buf, int buf_size, int count, XID * xid, int num_xid_buf)
{
  int xid_data_size;
  int i;

  if (count > num_xid_buf)
    count = num_xid_buf;

  for (i = 0; i < count; i++)
    {
      if (buf_size < 4)
	return CCI_ER_COMMUNICATION;
      NET_STR_TO_INT (xid_data_size, buf);
      buf += 4;
      buf_size -= 4;
      if (buf_size < xid_data_size)
	return CCI_ER_COMMUNICATION;
      net_str_to_xid (buf, &(xid[i]));
      buf += xid_data_size;
      buf_size -= xid_data_size;
    }

  return count;
}

static void
net_str_to_xid (char *buf, XID * xid)
{
  memset (xid, 0, sizeof (XID));
  NET_STR_TO_INT (xid->formatID, buf);
  buf += 4;
  NET_STR_TO_INT (xid->gtrid_length, buf);
  buf += 4;
  NET_STR_TO_INT (xid->bqual_length, buf);
  buf += 4;
  memcpy (xid->data, buf, xid->gtrid_length + xid->bqual_length);
}
#endif

static int
shard_info_decode (char *buf_p, int size, int num_shard, T_CCI_SHARD_INFO ** res_shard_info)



( run in 1.678 second using v1.01-cache-2.11-cpan-437f7b0c052 )