Example #1
0
/************************************************************************
* name: odbc_alloc_desc
* arguments:
* returns/side-effects:
* description:
* NOTE:
*    con이 null이 아니면 con에 연결된 explicit desc로 간주한다.
************************************************************************/
PUBLIC RETCODE
odbc_alloc_desc (ODBC_CONNECTION * conn, ODBC_DESC ** desc_ptr)
{
  ODBC_DESC *desc_node;

  if (desc_ptr == NULL)
    {
      if (conn != NULL)
	odbc_set_diag (conn->diag, "HY090", 0, NULL);
      goto error;
    }

  desc_node = (ODBC_DESC *) UT_ALLOC (sizeof (ODBC_DESC));
  if (desc_node == NULL)
    {
      if (conn != NULL)
	odbc_set_diag (conn->diag, "HY001", 0, NULL);
      goto error;
    }

  /* init members */
  desc_node->handle_type = SQL_HANDLE_DESC;
  desc_node->diag = odbc_alloc_diag ();
  desc_node->stmt = NULL;	/* set in odbc_alloc_stmt */
  desc_node->conn = NULL;
  desc_node->records = NULL;

  desc_node->alloc_type = SQL_DESC_ALLOC_AUTO;
  desc_node->array_size = 1;
  desc_node->array_status_ptr = NULL;
  desc_node->bind_offset_ptr = NULL;
  desc_node->bind_type = SQL_BIND_BY_COLUMN;	/* equal to SQL_PARAM_BY_COLUMN */
  desc_node->max_count = 0;
  desc_node->rows_processed_ptr = NULL;

  /* for explicit */
  if (conn != NULL)
    {
      desc_node->alloc_type = SQL_DESC_ALLOC_USER;

      desc_node->next = conn->descriptors;
      conn->descriptors = desc_node;
    }

  *desc_ptr = desc_node;

  return ODBC_SUCCESS;

error:
  return ODBC_ERROR;
}
Example #2
0
/************************************************************************
* name: SQLGetDescRecW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLGetDescRecW (SQLHDESC hdesc, SQLSMALLINT record, SQLWCHAR *name,
                SQLSMALLINT name_max, SQLSMALLINT *name_len, SQLSMALLINT *type,
                SQLSMALLINT *subtype, SQLLEN *length, SQLSMALLINT *precision,
                SQLSMALLINT *scale, SQLSMALLINT *nullable)
{
  RETCODE ret = ODBC_ERROR;
  SQLCHAR *name_buffer = NULL;
  SQLSMALLINT name_buffer_len=0;
  ODBC_DESC * desc_handle = hdesc;
  OutputDebugString ("SQLDescribeColW called.\n");
  
  name_buffer = UT_ALLOC (name_max);
  if (name_buffer == NULL && name_max > 0)
    {
      odbc_set_diag (desc_handle->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }  
    memset (name_buffer, 0 , name_max);
    
  ret = SQLGetDescRec(hdesc, 
                                       record, name_buffer, name_max, 
                                       &name_buffer_len, type, subtype, 
                                       length, precision, scale, nullable);
  if (ret == ODBC_ERROR)
   {
     UT_FREE (name_buffer);
     return ret;
   }
   
  bytes_to_wide_char (name_buffer, name_buffer_len, &name, name_max, (int*)name_len, NULL);   
  UT_FREE (name_buffer);     
  return ret;
}
Example #3
0
/************************************************************************
* name: SQLGetDescFieldW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLGetDescFieldW (SQLHDESC hdesc, SQLSMALLINT record, SQLSMALLINT field,
                  SQLPOINTER value, SQLINTEGER value_max, SQLINTEGER *value_len)
{
  RETCODE ret = ODBC_ERROR;
  char* cb_value = NULL;
  int cb_value_len = 0;
  ODBC_DESC *DescriptorHandle = (ODBC_DESC*)hdesc;
  OutputDebugString ("SQLGetDescFieldW called.\n");
  
  cb_value = UT_ALLOC (value_max);
  if (cb_value == NULL && value_max > 0)
    {
      odbc_set_diag (DescriptorHandle->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }
  memset (cb_value, 0 , value_max);
    
  SQLGetDescField(hdesc, record, field, cb_value, value_max, &cb_value_len);
  if (ret == ODBC_ERROR)
   {
     UT_FREE (cb_value);
     return ret;
   }  
   
  bytes_to_wide_char (cb_value, cb_value_len, (wchar_t**)&value, value_max, (int*)value_len, NULL);
  UT_FREE (cb_value);
  return ret;
}
Example #4
0
/************************************************************************
* name: SQLGetCursorNameW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLGetCursorNameW (SQLHSTMT hstmt, SQLWCHAR *cursor, SQLSMALLINT cursor_max,
                   SQLSMALLINT *cursor_len)
{
  RETCODE ret = ODBC_ERROR;
  char* cursor_name = NULL;
  SQLSMALLINT  cursor_name_len = 0;
  ODBC_STATEMENT* stmt_handle = (ODBC_STATEMENT *) hstmt;
  
  OutputDebugString ("SQLGetCursorNameW called.\n");
  cursor_name = UT_ALLOC (cursor_max);
  if (cursor_name == NULL && cursor_max > 0)
    {
      odbc_set_diag (stmt_handle->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }
  memset (cursor_name, 0 , cursor_max);
  ret = SQLGetCursorName(hstmt, cursor_name, cursor_max, &cursor_name_len);  
  if (ret == ODBC_ERROR)
   {
     UT_FREE (cursor_name);
     return ret;
   }
                     
  bytes_to_wide_char (cursor_name, cursor_name_len, &cursor, cursor_max, (int*)cursor_len, NULL);  
  UT_FREE(cursor_name);   
  return ret;
}
Example #5
0
/************************************************************************
* name: SQLDescribeColW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLDescribeColW (SQLHSTMT hstmt, SQLUSMALLINT column,
                 SQLWCHAR *name, SQLSMALLINT name_max, SQLSMALLINT *name_len,
                 SQLSMALLINT *type, SQLULEN *size, SQLSMALLINT *scale,
                 SQLSMALLINT *nullable)
{
  RETCODE ret = ODBC_ERROR;
  SQLCHAR *name_buffer = NULL;
  SQLSMALLINT name_buffer_len=0;
  ODBC_STATEMENT* stmt_handle = (ODBC_STATEMENT *) hstmt;
  OutputDebugString ("SQLDescribeColW called.\n");
  
  name_buffer = UT_ALLOC (name_max);
  if (name_buffer == NULL && name_max > 0)
    {
      odbc_set_diag (stmt_handle->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }  
    memset (name_buffer, 0 , name_max);
    
  ret = SQLDescribeCol(hstmt, column, name_buffer, name_max, &name_buffer_len, type, size, scale, nullable);
  if (ret == ODBC_ERROR)
   {
     UT_FREE (name_buffer);
     return ret;
   }
   
  bytes_to_wide_char (name_buffer, name_buffer_len, &name, name_max, (int*)name_len, NULL);   
  UT_FREE (name_buffer);     
  return ret;
}
Example #6
0
/************************************************************************
* name: SQLNativeSqlW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLNativeSqlW (SQLHDBC hdbc, SQLWCHAR *in, SQLINTEGER in_len,
               SQLWCHAR *out, SQLINTEGER out_max, SQLINTEGER *out_len)
{
  RETCODE ret = ODBC_ERROR;
  SQLCHAR *sql_state, *sql_text_buffer = NULL;
  int sql_state_len;  
  ODBC_CONNECTION * ConnectionHandle = (ODBC_CONNECTION *) hdbc;
  
  OutputDebugString ("SQLNativeSqlW called.\n");
  ret = wide_char_to_bytes (in, in_len, &sql_state,  &sql_state_len, NULL);
  sql_text_buffer = UT_ALLOC (out_max);
  if (sql_text_buffer == NULL && out_max > 0)
    {
      odbc_set_diag (ConnectionHandle->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }
   memset (sql_text_buffer, 0 , out_max);
      
  ret = SQLNativeSql(hdbc,  sql_state,  sql_state_len,  sql_text_buffer,  out_max, out_len);
  if (ret == ODBC_ERROR)
   {
     UT_FREE (sql_text_buffer);
     return ret;
   }
  bytes_to_wide_char (sql_state, sql_state_len, &out, out_max, out_len, NULL);   
  UT_FREE (sql_text_buffer);
  return ret;
}
Example #7
0
/************************************************************************
* name:  odbc_get_env_attr
* arguments:
*		ODBC_ENV *env 
* returns/side-effects:
*		RETCODE - odbc api return code
* description:
* NOTE:
************************************************************************/
PUBLIC
odbc_get_env_attr (ODBC_ENV * env,
		   long attribute,
		   void *value_ptr,
		   long buffer_length, long *string_length_ptr)
{
  switch (attribute)
    {
    case SQL_ATTR_ODBC_VERSION:
      if (value_ptr != NULL)
	*((unsigned long *) value_ptr) = env->attr_odbc_version;

      if (string_length_ptr != NULL)
	*string_length_ptr = sizeof (long);
      break;

    case SQL_ATTR_OUTPUT_NTS:
      if (value_ptr != NULL)
	*((unsigned long *) value_ptr) = env->attr_output_nts;

      if (string_length_ptr != NULL)
	*string_length_ptr = sizeof (long);
      break;

    default:
      odbc_set_diag (env->diag, "HY092", 0, NULL);
      return ODBC_ERROR;
    }

  return ODBC_SUCCESS;
}
Example #8
0
/************************************************************************
* name: odbc_set_desc_rec
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
PUBLIC RETCODE
odbc_set_desc_rec (ODBC_DESC * desc,
		   SQLSMALLINT rec_number,
		   SQLSMALLINT type,
		   SQLSMALLINT subtype,
		   SQLLEN length,
		   SQLSMALLINT precision,
		   SQLSMALLINT scale,
		   SQLPOINTER data_ptr,
		   SQLLEN *string_length_ptr, SQLLEN *indicator_ptr)
{
  /* ODBC_RECORD *record; */
  short concise_type;
  ODBC_RECORD *record;


  record = find_record_from_desc (desc, rec_number);
  if (record == NULL)
    {
      odbc_set_diag (desc->diag, "07009", 0, NULL);
      return ODBC_NO_DATA;
    }

  odbc_set_desc_field (desc, rec_number, SQL_DESC_TYPE,
		       (void *) type, sizeof (type), 1);

  if (subtype == SQL_DATETIME || subtype == SQL_INTERVAL)
    {
      odbc_set_desc_field (desc, rec_number, SQL_DESC_DATETIME_INTERVAL_CODE,
			   (void *) subtype, sizeof (subtype), 1);
    }

  concise_type = odbc_verbose_to_concise_type (type, subtype);
  odbc_set_desc_field (desc, rec_number, SQL_DESC_CONCISE_TYPE,
		       (void *) concise_type, sizeof (concise_type), 1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_OCTET_LENGTH,
		       (void *) length, sizeof (length), 1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_PRECISION,
		       (void *) precision, sizeof (precision), 1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_SCALE,
		       (void *) scale, sizeof (scale), 1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_DATA_PTR,
		       (void *) data_ptr, sizeof (data_ptr), 1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_OCTET_LENGTH_PTR,
		       (void *) string_length_ptr, sizeof (string_length_ptr),
		       1);

  odbc_set_desc_field (desc, rec_number, SQL_DESC_INDICATOR_PTR,
		       (void *) indicator_ptr, sizeof (indicator_ptr), 1);

  return ODBC_SUCCESS;
}
Example #9
0
/************************************************************************
* name: SQLDriverConnectW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLDriverConnectW (SQLHDBC hdbc, SQLHWND hwnd,
                   SQLWCHAR *in, SQLSMALLINT in_len,
                   SQLWCHAR *out, SQLSMALLINT out_max, SQLSMALLINT *out_len,
                   SQLUSMALLINT completion)
{
  RETCODE rc = ODBC_SUCCESS;
  SQLCHAR *pt_in, *pt_out;
  int encode_len = 0, temp_out_len = 0;
  ODBC_CONNECTION* conn = (ODBC_CONNECTION*)hdbc;

  OutputDebugString ("SQLDriverConnectW called\n");
  rc = wide_char_to_bytes (in, in_len, &pt_in, &encode_len, NULL);
  if (rc != ODBC_SUCCESS)
    {
      odbc_set_diag (conn->diag, "HY001", 0, "encode failed");
      return ODBC_ERROR;
    }
  pt_out = UT_ALLOC (out_max);
  if (pt_out == NULL && out_max > 0)
    {
      odbc_set_diag (conn->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }
  memset (pt_out, 0, out_max);
  
  rc = SQLDriverConnect (
         hdbc, hwnd,
         pt_in, in_len,
         pt_out, out_max, out_len,
         completion);
  if (out)
    {
      bytes_to_wide_char (pt_out, strlen (pt_out), &out, out_max, &temp_out_len, NULL);
    }
  if (out_len)
    {
      *out_len = temp_out_len;
    }
  UT_FREE (pt_in);
  UT_FREE (pt_out);
  return rc;
}
Example #10
0
/************************************************************************
* name: odbc_get_desc_rec
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
PUBLIC RETCODE
odbc_get_desc_rec (ODBC_DESC * desc,
		   SQLSMALLINT rec_number,
		   SQLCHAR *name,
		   SQLSMALLINT buffer_length,
		   SQLSMALLINT *string_length_ptr,
		   SQLSMALLINT *type_ptr,
		   SQLSMALLINT *subtype_ptr,
		   SQLLEN *length_ptr,
		   SQLSMALLINT *precision_ptr,
		   SQLSMALLINT *scale_ptr, SQLSMALLINT *nullable_ptr)
{
  ODBC_RECORD *record = NULL;
  SQLLEN tmp_length;

  record = find_record_from_desc (desc, rec_number);
  if (record == NULL)
    {
      odbc_set_diag (desc->diag, "07009", 0, NULL);
      return ODBC_NO_DATA;
    }


  /* WARN : type converting  string_length_ptr(short*) -> (long*) */
  odbc_get_desc_field (desc, rec_number, SQL_DESC_NAME,
		       (void *) name, buffer_length,
                       &tmp_length);
  *string_length_ptr = (SQLSMALLINT) tmp_length;

  odbc_get_desc_field (desc, rec_number, SQL_DESC_TYPE,
		       (void *) type_ptr, 0, NULL);

  odbc_get_desc_field (desc, rec_number, SQL_DESC_DATETIME_INTERVAL_CODE,
		       (void *) subtype_ptr, 0, NULL);

  odbc_get_desc_field (desc, rec_number, SQL_DESC_OCTET_LENGTH,
		       (void *) length_ptr, 0, NULL);

  odbc_get_desc_field (desc, rec_number, SQL_DESC_PRECISION,
		       (void *) precision_ptr, 0, NULL);

  odbc_get_desc_field (desc, rec_number, SQL_DESC_SCALE,
		       (void *) scale_ptr, 0, NULL);

  odbc_get_desc_field (desc, rec_number, SQL_DESC_NULLABLE,
		       (void *) nullable_ptr, 0, NULL);

  return ODBC_SUCCESS;
}
Example #11
0
/************************************************************************
* name: SQLGetDiagRecW
* arguments:
* returns/side-effects:
* description:
* NOTE:
************************************************************************/
ODBC_INTERFACE RETCODE SQL_API
SQLGetDiagRecW (SQLSMALLINT HandleType,
                SQLHANDLE Handle,
                SQLSMALLINT RecNumber,
                SQLWCHAR * Sqlstate,
                SQLINTEGER * NativeError,
                SQLWCHAR * MessageText,
                SQLSMALLINT BufferLength, SQLSMALLINT * TextLength)
{
  SQLCHAR *sql_state, *message_text_buffer = NULL;
  int sql_state_len = 0;
  SQLSMALLINT message_text_buffer_len = 0;
  RETCODE ret;
  ODBC_ENV *env;

  env = (ODBC_ENV *) Handle;

  OutputDebugString ("SQLGetDiagRecW called\n");
  wide_char_to_bytes (Sqlstate, sqlwcharlen (Sqlstate), &sql_state,  &sql_state_len, NULL);
  message_text_buffer = UT_ALLOC (BufferLength);
  if (message_text_buffer == NULL && BufferLength > 0)
    {
      odbc_set_diag (env->diag, "HY001", 0, "malloc failed");
      return ODBC_ERROR;
    }
  memset (message_text_buffer, 0 , BufferLength);

  ret = SQLGetDiagRec (HandleType, Handle, RecNumber, sql_state,
                       NativeError, message_text_buffer, BufferLength, &message_text_buffer_len);
  if (ret == ODBC_ERROR)
   {
     UT_FREE (message_text_buffer);
     return ret;
   }
                     
  bytes_to_wide_char (message_text_buffer, 
               message_text_buffer_len, 
               &MessageText, 
               BufferLength, 
               (int*)TextLength,
               NULL);
  UT_FREE (message_text_buffer);
  return ret;
}
Example #12
0
PUBLIC RETCODE
odbc_free_env (ODBC_ENV * env)
{
  ODBC_ENV *e, *prev;

  if (env->conn != NULL)
    {
      /* HY010 - DM */
      odbc_set_diag (env->diag, "HY010", 0, NULL);
      return ODBC_ERROR;
    }

  /* remove from list */
  for (e = odbc_environments, prev = NULL; e != NULL && e != env; e = e->next)
    {
      prev = e;
    }

  if (e == env)
    {
      if (prev != NULL)
	{
	  prev->next = env->next;
	}
      else
	{
	  odbc_environments = env->next;
	}
    }

  odbc_free_diag (env->diag, FREE_ALL);
  env->diag = NULL;
  NC_FREE (env->program_name);
  UT_FREE (env);

  return ODBC_SUCCESS;
}
Example #13
0
/************************************************************************
* name: odbc_set_desc_field
* arguments:
* returns/side-effects:
* description:
* NOTE:
*	CHECK : consistency
*	일부 consistency check가 odbc_set_desc_rec에서 이루어진다. 참고..
************************************************************************/
PUBLIC RETCODE
odbc_set_desc_field (ODBC_DESC * desc,
		     short rec_number,
		     short field_id,
		     void *value_ptr, long buffer_length, short is_driver)
{
  ODBC_RECORD *record;
  RETCODE status = ODBC_SUCCESS;
  int i;

  if (is_driver != 1 && is_read_only_field (field_id) == _TRUE_)
    {
      odbc_set_diag (desc->diag, "HY091", 0, NULL);
      goto error;
    }

  if (is_header_field (field_id) == 1)
    {
      /* header field */
      switch (field_id)
	{
	case SQL_DESC_ALLOC_TYPE:
	  desc->alloc_type = (short) value_ptr;
	  break;
	case SQL_DESC_ARRAY_SIZE:
	  desc->array_size = (unsigned long) value_ptr;
	  break;
	case SQL_DESC_ARRAY_STATUS_PTR:
	  desc->array_status_ptr = value_ptr;
	  break;
	case SQL_DESC_BIND_OFFSET_PTR:
	  desc->bind_offset_ptr = value_ptr;
	  break;
	case SQL_DESC_BIND_TYPE:
	  desc->bind_type = (long) value_ptr;
	  break;
	case SQL_DESC_COUNT:
	  if ((short) value_ptr < desc->max_count)
	    {
	      for (i = desc->max_count; i > (short) value_ptr && i > 0; --i)
		{
		  record = find_record_from_desc (desc, i);
		  if (record != NULL)
		    {
		      odbc_free_record (record);
		    }
		}
	    }
	  desc->max_count = (short) value_ptr;
	  break;
	case SQL_DESC_ROWS_PROCESSED_PTR:
	  desc->rows_processed_ptr = value_ptr;
	  break;
	default:
	  odbc_set_diag (desc->diag, "HY091", 0, NULL);
	  goto error;
	}

    }
  else
    {
      /* record filed */
      if (rec_number < 0)
	{
	  odbc_set_diag (desc->diag, "07009", 0, NULL);
	  goto error;
	}

      record = find_record_from_desc (desc, rec_number);
      if (record == NULL)
	{
	  odbc_alloc_record (desc, &record, rec_number);
	}

      switch (field_id)
	{

	case SQL_DESC_BASE_COLUMN_NAME:
	case SQL_DESC_LABEL:
	case SQL_DESC_NAME:
	  NC_FREE (record->name);
	  record->name = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;

	case SQL_DESC_CASE_SENSITIVE:
	  record->case_sensitive = (long) value_ptr;
	  break;

	case SQL_DESC_DISPLAY_SIZE:
	  record->display_size = (long) value_ptr;
	  break;
	case SQL_DESC_FIXED_PREC_SCALE:
	  record->fixed_prec_scale = (short) value_ptr;
	  break;
	case SQL_DESC_LITERAL_PREFIX:
	  NC_FREE (record->literal_prefix);
	  record->literal_prefix = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;
	case SQL_DESC_LITERAL_SUFFIX:
	  NC_FREE (record->literal_suffix);
	  record->literal_suffix = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;
	case SQL_DESC_LOCAL_TYPE_NAME:
	  NC_FREE (record->local_type_name);
	  record->local_type_name = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;
	case SQL_DESC_NULLABLE:
	  record->nullable = (short) value_ptr;
	  break;

	case SQL_DESC_SEARCHABLE:
	  record->searchable = (short) value_ptr;
	  break;
	  /* BASE_TABLE_NAME과 TABLE_NAME과의 구분은 없다. */
	case SQL_DESC_TABLE_NAME:
	case SQL_DESC_BASE_TABLE_NAME:
	  NC_FREE (record->table_name);
	  record->table_name = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;
	case SQL_DESC_TYPE_NAME:
	  NC_FREE (record->type_name);
	  record->type_name = UT_MAKE_STRING (value_ptr, buffer_length);
	  break;
	case SQL_DESC_UNSIGNED:
	  record->unsigned_type = (short) value_ptr;
	  break;

	case SQL_DESC_CONCISE_TYPE:
	  if (!odbc_is_valid_type ((short) value_ptr))
	    {
	      odbc_set_diag (desc->diag, "HY021", 0, NULL);
	      goto error;
	    }
	  record->concise_type = (short) value_ptr;
	  break;

	case SQL_DESC_DATA_PTR:
	  if (!odbc_consistency_check (record))
	    {
	      odbc_set_diag (desc->diag, "HY021", 0, NULL);
	      goto error;
	    }
	  record->data_ptr = value_ptr;
	  break;

	case SQL_DESC_DATETIME_INTERVAL_CODE:
	  if (!odbc_is_valid_code ((short) value_ptr))
	    {
	      odbc_set_diag (desc->diag, "HY021", 0, NULL);
	      goto error;
	    }
	  record->datetime_interval_code = (short) value_ptr;
	  break;

	case SQL_DESC_DATETIME_INTERVAL_PRECISION:
	  record->datetime_interval_precision = (short) value_ptr;
	  break;

	case SQL_DESC_INDICATOR_PTR:
	  record->indicator_ptr = value_ptr;
	  break;

	case SQL_DESC_LENGTH:
	  record->length = (unsigned long) value_ptr;
	  break;

	case SQL_DESC_NUM_PREC_RADIX:
	  record->num_prec_radix = (long) value_ptr;
	  break;

	case SQL_DESC_OCTET_LENGTH:
	  record->octet_length = (long) value_ptr;
	  break;

	case SQL_DESC_OCTET_LENGTH_PTR:
	  record->octet_length_ptr = value_ptr;
	  break;

	case SQL_DESC_PARAMETER_TYPE:
	  if ((short) value_ptr == SQL_PARAM_INPUT)
	    {
	      record->parameter_type = (short) value_ptr;
	    }
	  else
	    {
	      odbc_set_diag (desc->diag, "HY091", 0, NULL);
	      goto error;
	    }
	  break;

	case SQL_DESC_PRECISION:
	  record->precision = (short) value_ptr;
	  break;

	case SQL_DESC_SCALE:
	  record->scale = (short) value_ptr;
	  break;

	case SQL_DESC_TYPE:
	  switch ((short) value_ptr)
	    {
	    case SQL_CHAR:	/* SQL_C_CHAR */
	    case SQL_VARCHAR:
	      record->type = (short) value_ptr;
	      record->length = 1;
	      record->precision = 0;
	      break;

	    case SQL_DATETIME:
	      record->type = (short) value_ptr;
	      switch (record->datetime_interval_code)
		{
		case SQL_CODE_DATE:
		case SQL_CODE_TIME:
		  record->precision = 0;
		  break;
		case SQL_CODE_TIMESTAMP:
		  record->precision = 6;
		  break;
		}
	      break;

	    case SQL_DECIMAL:
	    case SQL_NUMERIC:	/* SQL_C_NUMERIC */
	      record->type = (short) value_ptr;
	      record->precision = CUBRID_NUMERIC_PRECISION_DEFAULT;
	      record->scale = CUBRID_NUMERIC_SCALE_DEFAULT;
	      break;

	    case SQL_FLOAT:
	    case SQL_C_FLOAT:
	      record->type = (short) value_ptr;
	      /* WARN : NEED precision setting as default value */
	      break;

	    case SQL_INTERVAL:
	      odbc_set_diag (desc->diag, "HYC00", 0, NULL);
	      goto error;


	    case SQL_C_UBIGINT:
	    case SQL_C_SBIGINT:
	    case SQL_C_STINYINT:
	    case SQL_C_UTINYINT:
	    case SQL_C_TINYINT:	// for 2.x backward compatibility
	    case SQL_C_SHORT:	// for 2.x backward compatibility
	    case SQL_C_SSHORT:
	    case SQL_C_USHORT:
	    case SQL_C_LONG:
	    case SQL_C_SLONG:
	    case SQL_C_ULONG:
	    case SQL_C_GUID:
	    case SQL_BIT:
	    case SQL_BIGINT:
	    case SQL_LONGVARBINARY:
	    case SQL_VARBINARY:
	    case SQL_BINARY:
	    case SQL_LONGVARCHAR:
	    case SQL_C_DOUBLE:
	    case SQL_C_DEFAULT:
	    case SQL_TYPE_TIME:
	    case SQL_TYPE_TIMESTAMP:
	    case SQL_C_UNI_OBJECT:
	    case SQL_C_UNI_SET:
	      record->type = (short) value_ptr;
	      break;

	    default:
	      odbc_set_diag (desc->diag, "HY024", 0, NULL);
	      goto error;
	    }
	  break;

	case SQL_DESC_UNNAMED:
	  switch ((short) value_ptr)
	    {
	    case SQL_NAMED:
	    case SQL_UNNAMED:
	      record->unnamed = (short) value_ptr;
	      break;
	    default:
	      odbc_set_diag (desc->diag, "HY024", 0, NULL);
	      goto error;
	    }
	  break;

	case SQL_DESC_UPDATABLE:
	  record->updatable = (short) value_ptr;
	  break;

	case SQL_DESC_AUTO_UNIQUE_VALUE:
	case SQL_DESC_CATALOG_NAME:
	case SQL_DESC_ROWVER:
	case SQL_DESC_SCHEMA_NAME:
	  odbc_set_diag (desc->diag, "HYC00", 0, NULL);
	  goto error;

	default:
	  /* unknown field */
	  odbc_set_diag (desc->diag, "HY091", 0, NULL);
	  goto error;
	}

    }

  return status;
error:
  return ODBC_ERROR;
}
Example #14
0
/************************************************************************
* name: odbc_get_desc_field
* arguments:
* returns/side-effects:
* description:
* NOTE:
*	BASE_COLUMN_NAME, NAME, LABEL are same as SQL_DESC_NAME
************************************************************************/
PUBLIC RETCODE
odbc_get_desc_field (ODBC_DESC * desc,
		     SQLSMALLINT rec_number,
		     SQLSMALLINT field_id,
		     SQLPOINTER value_ptr,
		     SQLLEN buffer_length, SQLLEN *string_length_ptr)
{
  RETCODE status = ODBC_SUCCESS, rc;
  ODBC_RECORD *record;
  char *pt;
  char empty_str[1] = "";

  if (is_header_field (field_id) == 1)
    {
      /* header field */

      switch (field_id)
	{
	case SQL_DESC_COUNT:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = desc->max_count;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->max_count);
	  break;

	case SQL_DESC_ALLOC_TYPE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = desc->alloc_type;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->alloc_type);
	  break;

	case SQL_DESC_ARRAY_SIZE:
	  if (value_ptr != NULL)
	    *(unsigned long *) value_ptr = desc->array_size;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->array_status_ptr);
	  break;

	case SQL_DESC_ARRAY_STATUS_PTR:
	  if (value_ptr != NULL)
	    *(unsigned short **) value_ptr = desc->array_status_ptr;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->array_status_ptr);
	  break;

	case SQL_DESC_BIND_OFFSET_PTR:
	  if (value_ptr != NULL)
	    *(long **) value_ptr = desc->bind_offset_ptr;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->bind_offset_ptr);
	  break;

	case SQL_DESC_BIND_TYPE:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = desc->bind_type;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->bind_type);
	  break;

	case SQL_DESC_ROWS_PROCESSED_PTR:
	  if (value_ptr != NULL)
	    *(unsigned long **) value_ptr = desc->rows_processed_ptr;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (desc->rows_processed_ptr);
	  break;

	default:
	  /* unknown field */
	  odbc_set_diag (desc->diag, "HY091", 0, NULL);
	  goto error;
	}

    }
  else
    {
      /* record filed */

      if (rec_number < 0)
	{
	  odbc_set_diag (desc->diag, "07009", 0, NULL);
	  goto error;
	}

      record = find_record_from_desc (desc, rec_number);
      if (record == NULL)
	{
	  odbc_set_diag (desc->diag, "07009", 0, NULL);
	  goto error;
	}

      switch (field_id)
	{

	case SQL_DESC_BASE_COLUMN_NAME:
	case SQL_DESC_LABEL:
	case SQL_DESC_NAME:
	  if (record->name != NULL)
	    {
	      pt = record->name;
	    }
	  else
	    {
	      pt = empty_str;
	    }
	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;


	case SQL_DESC_CASE_SENSITIVE:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = record->case_sensitive;

	  if (string_length_ptr != NULL)
	    *string_length_ptr = sizeof (record->case_sensitive);
	  break;


	case SQL_DESC_CONCISE_TYPE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->concise_type;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->concise_type);
	    }
	  break;

	case SQL_DESC_DATA_PTR:
	  if (value_ptr != NULL)
	    *(void **) value_ptr = record->data_ptr;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->data_ptr);
	    }
	  break;

	case SQL_DESC_DATETIME_INTERVAL_CODE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->datetime_interval_code;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->datetime_interval_code);
	    }
	  break;

	case SQL_DESC_DATETIME_INTERVAL_PRECISION:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = record->datetime_interval_precision;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr =
		sizeof (record->datetime_interval_precision);
	    }
	  break;

	case SQL_DESC_DISPLAY_SIZE:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = record->display_size;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->display_size);
	    }
	  break;

	case SQL_DESC_FIXED_PREC_SCALE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->fixed_prec_scale;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->fixed_prec_scale);
	    }
	  break;

	case SQL_DESC_INDICATOR_PTR:
	  if (value_ptr != NULL)
	    *(long **) value_ptr = record->indicator_ptr;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->indicator_ptr);
	    }
	  break;


	case SQL_DESC_LENGTH:
	case SQL_COLUMN_LENGTH:	// for 2.x backward compatibility
	  if (value_ptr != NULL)
	    *(unsigned long *) value_ptr = record->length;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->length);
	    }
	  break;

	case SQL_DESC_LITERAL_PREFIX:
	  if (record->literal_prefix != NULL)
	    {
	      pt = record->literal_prefix;
	    }
	  else
	    {
	      pt = empty_str;
	    }

	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;

	case SQL_DESC_LITERAL_SUFFIX:
	  if (record->literal_suffix != NULL)
	    {
	      pt = record->literal_suffix;
	    }
	  else
	    {
	      pt = empty_str;
	    }
	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;

	case SQL_DESC_LOCAL_TYPE_NAME:
	  if (record->local_type_name != NULL)
	    {
	      pt = record->local_type_name;
	    }
	  else
	    {
	      pt = empty_str;
	    }

	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;


	case SQL_DESC_NULLABLE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->nullable;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->nullable);
	    }
	  break;

	case SQL_DESC_NUM_PREC_RADIX:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = record->num_prec_radix;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->num_prec_radix);
	    }
	  break;

	case SQL_DESC_OCTET_LENGTH:
	  if (value_ptr != NULL)
	    *(long *) value_ptr = record->octet_length;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->octet_length);
	    }
	  break;

	case SQL_DESC_OCTET_LENGTH_PTR:
	  if (value_ptr != NULL)
	    *(long **) value_ptr = record->octet_length_ptr;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->octet_length_ptr);
	    }
	  break;

	case SQL_DESC_PARAMETER_TYPE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->parameter_type;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->parameter_type);
	    }
	  break;

	case SQL_DESC_PRECISION:
	case SQL_COLUMN_PRECISION:	// for 2.x backward compatibility
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->precision;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->precision);
	    }
	  break;

	case SQL_DESC_SCALE:
	case SQL_COLUMN_SCALE:	// for 2.x backward compatibility
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->scale;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->scale);
	    }
	  break;

	case SQL_DESC_SEARCHABLE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->searchable;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->searchable);
	    }
	  break;

	case SQL_DESC_TABLE_NAME:
	case SQL_DESC_BASE_TABLE_NAME:	/* 따로 지원하지 않고 TABLE_NAME과 같이 쓴다. */
	  if (record->table_name != NULL)
	    {
	      pt = record->table_name;
	    }
	  else
	    {
	      pt = empty_str;
	    }

	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;


	case SQL_DESC_TYPE:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->type;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->type);
	    }
	  break;

	case SQL_DESC_TYPE_NAME:
	  if (record->type_name != NULL)
	    {
	      pt = record->type_name;
	    }
	  else
	    {
	      pt = empty_str;
	    }

	  rc =
	    str_value_assign (pt, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;

	case SQL_DESC_UNNAMED:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->unnamed;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->unnamed);
	    }
	  break;

	case SQL_DESC_UNSIGNED:
	  if (value_ptr != NULL)
	    *(short *) value_ptr = record->unsigned_type;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (record->unsigned_type);
	    }
	  break;

	case SQL_DESC_AUTO_UNIQUE_VALUE:
	  // there is no auto unique attribute in CUBRID
	  if (value_ptr != NULL)
	    *(long *) value_ptr = SQL_FALSE;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (long);
	    }
	  break;

	case SQL_DESC_CATALOG_NAME:
	case SQL_DESC_SCHEMA_NAME:
	  // empty string
	  rc =
	    str_value_assign (empty_str, value_ptr, buffer_length,
			      string_length_ptr);
	  if (rc == ODBC_SUCCESS_WITH_INFO)
	    {
	      odbc_set_diag (desc->diag, "01004", 0, NULL);
	    }
	  break;

	case SQL_DESC_ROWVER:
	  // there is no rowver attribute in CUBRID
	  if (value_ptr != NULL)
	    *(short *) value_ptr = SQL_FALSE;

	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (short);
	    }
	  break;


	case SQL_DESC_UPDATABLE:
	  // always READWRITE_UNKNOWN
	  if (value_ptr != NULL)
	    *(short *) value_ptr = SQL_ATTR_READWRITE_UNKNOWN;


	  if (string_length_ptr != NULL)
	    {
	      *string_length_ptr = sizeof (short);
	    }
	  break;

	default:
	  odbc_set_diag (desc->diag, "HY091", 0, NULL);
	  goto error;
	}

    }

  return status;
error:
  return ODBC_ERROR;
}
Example #15
0
/************************************************************************
* name: odbc_set_env_attr
* arguments:
*		ODBC_ENV *env - environment handle
*		attribute - attribute type
*		valueptr - generic value pointer
*		stringlength - SQL_IS_INTEGER(-6) or string length
* returns/side-effects:
*		RETCODE
* description:
*		
* NOTE:
*		diagnostic에 대해서 아직 structure가 설정이 되지 않아서 SQLSTATE를 
*		설정하지 못한다.  structure에 반영한 후 각 state 값을 설정하도록 
*		한다.
************************************************************************/
PUBLIC RETCODE
odbc_set_env_attr (ODBC_ENV * env,
		   long attribute, void *valueptr, long stringlength)
{

  if (valueptr == NULL)
    {
      odbc_set_diag (env->diag, "HY009", 0, NULL);
      return ODBC_ERROR;
    }

  /* valueptr will be a 32-bit integer value or 
   * point to a null-terminated character string 
   */
  switch (attribute)
    {

    case SQL_ATTR_CONNECTION_POOLING:
      odbc_set_diag (env->diag, "HYC00", 0, NULL);
      return ODBC_ERROR;
      break;

    case SQL_ATTR_CP_MATCH:
      odbc_set_diag (env->diag, "HYC00", 0, NULL);
      return ODBC_ERROR;
      break;

    case SQL_ATTR_ODBC_VERSION:
      switch ((long) valueptr)
	{
	case SQL_OV_ODBC3:
	case SQL_OV_ODBC2:
	  env->attr_odbc_version = (long) valueptr;
	  break;
	default:
	  odbc_set_diag (env->diag, "HY024", 0, NULL);
	  return ODBC_ERROR;
	  break;
	}

      break;

    case SQL_ATTR_OUTPUT_NTS:
      switch ((long) valueptr)
	{
	case SQL_TRUE:
	  env->attr_output_nts = (unsigned long) valueptr;
	  break;

	case SQL_FALSE:
	  odbc_set_diag (env->diag, "HYC00", 0, NULL);
	  return ODBC_ERROR;
	  break;

	default:
	  odbc_set_diag (env->diag, "HY024", 0, NULL);
	  return ODBC_ERROR;
	  break;
	}
      break;

    default:
      odbc_set_diag (env->diag, "HY092", 0, NULL);
      return ODBC_ERROR;
      break;
    }

  return ODBC_SUCCESS;
}