Skip to content

Commit

Permalink
Implemented SQLSetDescRec function
Browse files Browse the repository at this point in the history
- Fixed SQL_DESC_PRECISION field in IPDSetField & IPDGetField functions
- Added support for other fields for bookmark column in ARDSetField
  - SQL_DESC_TYPE
  - SQL_DESC_DATETIME_INTERVAL_CODE
  - SQL_DESC_OCTET_LENGTH
  - SQL_DESC_PRECISION
  - SQL_DESC_SCALE
  • Loading branch information
Hunaid2000 committed May 23, 2024
1 parent 7ec2337 commit 84f9f7b
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 10 deletions.
16 changes: 9 additions & 7 deletions odbcapi30.c
Original file line number Diff line number Diff line change
Expand Up @@ -459,9 +459,14 @@ SQLSetDescRec(SQLHDESC DescriptorHandle,
PTR Data, SQLLEN *StringLength,
SQLLEN *Indicator)
{
MYLOG(0, "Entering\n");
MYLOG(0, "Error not implemented\n");
return SQL_ERROR;
RETCODE ret;

MYLOG(0, "Entering h=%p rec=%d type=%d sub=%d len=" FORMAT_LEN " prec=%d scale=%d data=%p\n", DescriptorHandle, RecNumber, Type, SubType, Length, Precision, Scale, Data);
MYLOG(0, "str=%p ind=%p\n", StringLength, Indicator);
ret = PGAPI_SetDescRec(DescriptorHandle, RecNumber, Type,
SubType, Length, Precision, Scale, Data,
StringLength, Indicator);
return ret;
}
#endif /* UNICODE_SUPPORTXX */

Expand Down Expand Up @@ -656,10 +661,7 @@ MYLOG(DETAIL_LOG_LEVEL, "lie=%d\n", ci->drivers.lie);
SQL_FUNC_ESET(pfExists, SQL_API_SQLGETSTMTATTR); /* 1014 */
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETCONNECTATTR); /* 1016 */
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETDESCFIELD); /* 1017 */
if (ci->drivers.lie)
{
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETDESCREC); /* 1018 not implemented yet */
}
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETDESCREC); /* 1018 */
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETENVATTR); /* 1019 */
SQL_FUNC_ESET(pfExists, SQL_API_SQLSETSTMTATTR); /* 1020 */
SQL_FUNC_ESET(pfExists, SQL_API_SQLFETCHSCROLL); /* 1021 */
Expand Down
136 changes: 133 additions & 3 deletions pgapi30.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,31 @@ ARDSetField(DescriptorClass *desc, SQLSMALLINT RecNumber,

switch (FieldIdentifier)
{
case SQL_DESC_TYPE:
bookmark->returntype = CAST_PTR(SQLSMALLINT, Value);
break;
case SQL_DESC_DATETIME_INTERVAL_CODE:
switch (bookmark->returntype)
{
case SQL_DATETIME:
case SQL_C_TYPE_DATE:
case SQL_C_TYPE_TIME:
case SQL_C_TYPE_TIMESTAMP:
switch ((LONG_PTR) Value)
{
case SQL_CODE_DATE:
bookmark->returntype = SQL_C_TYPE_DATE;
break;
case SQL_CODE_TIME:
bookmark->returntype = SQL_C_TYPE_TIME;
break;
case SQL_CODE_TIMESTAMP:
bookmark->returntype = SQL_C_TYPE_TIMESTAMP;
break;
}
break;
}
break;
case SQL_DESC_DATA_PTR:
bookmark->buffer = Value;
break;
Expand All @@ -574,6 +599,15 @@ ARDSetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
case SQL_DESC_OCTET_LENGTH_PTR:
bookmark->used = Value;
break;
case SQL_DESC_OCTET_LENGTH:
bookmark->buflen = CAST_PTR(SQLLEN, Value);
break;
case SQL_DESC_PRECISION:
bookmark->precision = CAST_PTR(SQLSMALLINT, Value);
break;
case SQL_DESC_SCALE:
bookmark->scale = CAST_PTR(SQLSMALLINT, Value);
break;
default:
DC_set_error(desc, DESC_INVALID_COLUMN_NUMBER_ERROR, "invalid column number");
ret = SQL_ERROR;
Expand Down Expand Up @@ -944,6 +978,20 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
case SQL_DESC_PARAMETER_TYPE:
ipdopts->parameters[para_idx].paramType = CAST_PTR(SQLSMALLINT, Value);
break;
case SQL_DESC_PRECISION:
switch (ipdopts->parameters[para_idx].SQLType)
{
case SQL_TYPE_DATE:
case SQL_TYPE_TIME:
case SQL_TYPE_TIMESTAMP:
case SQL_DATETIME:
ipdopts->parameters[para_idx].decimal_digits = CAST_PTR(SQLSMALLINT, Value);
break;
case SQL_NUMERIC:
ipdopts->parameters[para_idx].precision = CAST_PTR(SQLINTEGER, Value);
break;
}
break;
case SQL_DESC_SCALE:
ipdopts->parameters[para_idx].decimal_digits = CAST_PTR(SQLSMALLINT, Value);
break;
Expand All @@ -957,6 +1005,8 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
else
NULL_THE_NAME(ipdopts->parameters[para_idx].paramName);
break;
case SQL_DESC_OCTET_LENGTH:
break;
case SQL_DESC_ALLOC_TYPE: /* read-only */
case SQL_DESC_CASE_SENSITIVE: /* read-only */
case SQL_DESC_DATETIME_INTERVAL_PRECISION:
Expand All @@ -965,8 +1015,6 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
case SQL_DESC_LOCAL_TYPE_NAME: /* read-only */
case SQL_DESC_NULLABLE: /* read-only */
case SQL_DESC_NUM_PREC_RADIX:
case SQL_DESC_OCTET_LENGTH:
case SQL_DESC_PRECISION:
case SQL_DESC_ROWVER: /* read-only */
case SQL_DESC_TYPE_NAME: /* read-only */
case SQL_DESC_UNSIGNED: /* read-only */
Expand Down Expand Up @@ -1501,6 +1549,9 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
case SQL_DATETIME:
ival = ipdopts->parameters[para_idx].decimal_digits;
break;
case SQL_NUMERIC:
ival = ipdopts->parameters[para_idx].precision;
break;
}
break;
case SQL_DESC_SCALE:
Expand All @@ -1512,6 +1563,8 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
break;
}
break;
case SQL_DESC_OCTET_LENGTH:
break;
case SQL_DESC_ALLOC_TYPE: /* read-only */
rettype = SQL_IS_SMALLINT;
ival = SQL_DESC_ALLOC_AUTO;
Expand All @@ -1524,7 +1577,6 @@ MYLOG(DETAIL_LOG_LEVEL, "RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated)
case SQL_DESC_NAME:
case SQL_DESC_NULLABLE: /* read-only */
case SQL_DESC_NUM_PREC_RADIX:
case SQL_DESC_OCTET_LENGTH:
case SQL_DESC_ROWVER: /* read-only */
case SQL_DESC_TYPE_NAME: /* read-only */
case SQL_DESC_UNSIGNED: /* read-only */
Expand Down Expand Up @@ -1924,6 +1976,84 @@ PGAPI_SetDescField(SQLHDESC DescriptorHandle,
return ret;
}

/* new function */
RETCODE SQL_API
PGAPI_SetDescRec(SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber, SQLSMALLINT Type,
SQLSMALLINT SubType, SQLLEN Length,
SQLSMALLINT Precision, SQLSMALLINT Scale,
PTR Data, SQLLEN *StringLength, SQLLEN *Indicator)
{
CSTR func = "PGAPI_SetDescRec";
RETCODE ret = SQL_SUCCESS;
DescriptorClass *desc = (DescriptorClass *) DescriptorHandle;

MYLOG(0, "entering h=%p(%d) rec=" FORMAT_SMALLI " type=" FORMAT_SMALLI " sub=" FORMAT_SMALLI " len=" FORMAT_LEN " prec=" FORMAT_SMALLI " scale=" FORMAT_SMALLI " data=%p\n",
DescriptorHandle, DC_get_desc_type(desc), RecNumber, Type, SubType, Length, Precision, Scale, Data);
MYLOG(0, "str=%p ind=%p\n", StringLength, Indicator);

/* Descriptor handle must not be an IRD handle */
if (DC_get_desc_type(desc) == SQL_ATTR_IMP_ROW_DESC)
{
DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER, "Invalid descriptor identifier");
DC_log_error(func, "", desc);
return SQL_ERROR;
}

/*
Set following descriptor fields:
- SQL_DESC_TYPE
- SQL_DESC_DATETIME_INTERVAL_CODE
- SQL_DESC_OCTET_LENGTH
- SQL_DESC_PRECISION
- SQL_DESC_SCALE
- SQL_DESC_DATA_PTR
- SQL_DESC_OCTET_LENGTH_PTR
- SQL_DESC_INDICATOR_PTR
*/
ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_TYPE, &Type, 0);
if (ret != SQL_SUCCESS) return ret;

/* If Type is SQL_DATETIME or SQL_INTERVAL, the value of SQL_DESC_DATETIME_INTERVAL_CODE is set to SubType. */
if (Type == SQL_DATETIME || Type == SQL_INTERVAL) {
ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATETIME_INTERVAL_CODE, &SubType, 0);
if (ret != SQL_SUCCESS) return ret;
}

ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_OCTET_LENGTH, &Length, 0);
if (ret != SQL_SUCCESS) return ret;

ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_PRECISION, &Precision, 0);
if (ret != SQL_SUCCESS) return ret;

ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_SCALE, &Scale, 0);
if (ret != SQL_SUCCESS) return ret;

/* SQL_DESC_DATA_PTR is only for ARD or APD */
if (DC_get_desc_type(desc) != SQL_ATTR_IMP_PARAM_DESC)
{
ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATA_PTR, &Data, 0);
if (ret != SQL_SUCCESS) return ret;
}

/* SQL_DESC_OCTET_LENGTH_PTR is only for ARD or APD */
if (DC_get_desc_type(desc) != SQL_ATTR_IMP_PARAM_DESC)
{
ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_OCTET_LENGTH_PTR, StringLength, 0);
if (ret != SQL_SUCCESS) return ret;
}

/* SQL_DESC_INDICATOR_PTR is only for ARD or APD */
if (DC_get_desc_type(desc) != SQL_ATTR_IMP_PARAM_DESC)
{
ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_INDICATOR_PTR, Indicator, 0);
if (ret != SQL_SUCCESS) return ret;
}

return SQL_SUCCESS;
}

/* SQLSet(Param/Scroll/Stmt)Option -> SQLSetStmtAttr */
RETCODE SQL_API
PGAPI_SetStmtAttr(HSTMT StatementHandle,
Expand Down
5 changes: 5 additions & 0 deletions pgapifunc.h
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,11 @@ RETCODE SQL_API PGAPI_SetDescField(SQLHDESC DescriptorHandle,
RETCODE SQL_API PGAPI_GetDescField(SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier,
PTR Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength);
RETCODE SQL_API PGAPI_SetDescRec(SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber, SQLSMALLINT Type,
SQLSMALLINT SubType, SQLLEN Length,
SQLSMALLINT Precision, SQLSMALLINT Scale,
PTR Data, SQLLEN *StringLength, SQLLEN *Indicator);
RETCODE SQL_API PGAPI_DescError(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
SQLCHAR *Sqlstate, SQLINTEGER *NativeError,
SQLCHAR *MessageText, SQLSMALLINT BufferLength,
Expand Down

0 comments on commit 84f9f7b

Please sign in to comment.