in src/odbc/rsodbc/rsresult.cpp [966:1216]
SQLRETURN SQL_API RS_STMT_INFO::RS_SQLColAttribute(SQLHSTMT phstmt,
SQLUSMALLINT hCol,
SQLUSMALLINT hFieldIdentifier,
SQLPOINTER pcValue,
SQLSMALLINT cbLen,
SQLSMALLINT *pcbLen,
SQLLEN *plValue)
{
SQLRETURN rc = SQL_SUCCESS;
RS_STMT_INFO *pStmt = (RS_STMT_INFO *)phstmt;
RS_RESULT_INFO *pResult;
int isCharIdentifier;
RS_DESC_REC *pDescRecHead = NULL;
// Check stmt handle
if(!VALID_HSTMT(phstmt))
{
rc = SQL_INVALID_HANDLE;
goto error;
}
// Clear error list
pStmt->pErrorList = clearErrorList(pStmt->pErrorList);
// Check whether field identifier is char or integer type
isCharIdentifier = isStrFieldIdentifier(hFieldIdentifier);
// Is buffer valid?
if((isCharIdentifier
&& ((pcValue == NULL && pcbLen == NULL) || (cbLen < 0 && cbLen != SQL_NTS)))
|| (!isCharIdentifier && plValue == NULL))
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY090", "Invalid string or buffer length", 0, NULL);
goto error;
}
pResult = pStmt->pResultHead;
if(!pResult)
{
if(pStmt->pPrepareHead && pStmt->pPrepareHead->pResultForDescribeCol && pStmt->iStatus == RS_PREPARE_STMT)
{
pResult = pStmt->pPrepareHead->pResultForDescribeCol;
if(pResult)
pDescRecHead = pResult->pIRDRecs;
}
}
else
pDescRecHead = pStmt->pIRD->pDescRecHead;
if(pResult)
{
if(hFieldIdentifier == SQL_DESC_COUNT)
{
*plValue = 0;
*plValue = pResult->iNumberOfCols;
}
else
{
if(pResult->iNumberOfCols && pDescRecHead)
{
if(hCol > 0 && hCol <= pResult->iNumberOfCols)
{
RS_DESC_REC *pDescRec = &pDescRecHead[hCol - 1];
switch(hFieldIdentifier)
{
case SQL_DESC_AUTO_UNIQUE_VALUE:
{
*plValue = pDescRec->cAutoInc;
break;
}
case SQL_DESC_BASE_COLUMN_NAME:
case SQL_DESC_LABEL:
case SQL_DESC_NAME:
{
rc = copyStrDataSmallLen(pDescRec->szName, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_BASE_TABLE_NAME:
case SQL_DESC_TABLE_NAME:
{
rc = copyStrDataSmallLen(pDescRec->szTableName, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_CASE_SENSITIVE:
{
*plValue = pDescRec->cCaseSensitive;
break;
}
case SQL_DESC_CATALOG_NAME:
{
rc = copyStrDataSmallLen(pDescRec->szCatalogName, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_CONCISE_TYPE:
{
*plValue = getConciseType(pDescRec->hConciseType, pDescRec->hType);
break;
}
case SQL_DESC_TYPE:
{
*plValue = pDescRec->hType;
// Convert to ODBC2 type, if needed
CONVERT_TO_ODBC2_SQL_DATE_TYPES(pStmt, plValue);
break;
}
case SQL_DESC_DISPLAY_SIZE:
{
*plValue = pDescRec->iDisplaySize;
break;
}
case SQL_DESC_FIXED_PREC_SCALE:
{
*plValue = pDescRec->cFixedPrecScale;
break;
}
case SQL_DESC_LENGTH:
case SQL_COLUMN_LENGTH:
{
*plValue = getSize(pDescRec->hType, pDescRec->iSize);
break;
}
case SQL_DESC_LITERAL_PREFIX:
{
rc = copyStrDataSmallLen(pDescRec->szLiteralPrefix, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_LITERAL_SUFFIX:
{
rc = copyStrDataSmallLen(pDescRec->szLiteralSuffix, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_LOCAL_TYPE_NAME:
case SQL_DESC_TYPE_NAME:
{
rc = copyStrDataSmallLen(pDescRec->szTypeName, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_NULLABLE:
{
*plValue = pDescRec->hNullable;
break;
}
case SQL_DESC_NUM_PREC_RADIX:
{
*plValue = pDescRec->iNumPrecRadix;
break;
}
case SQL_DESC_OCTET_LENGTH:
{
*plValue = pDescRec->iOctetLen;
break;
}
case SQL_DESC_PRECISION:
case SQL_COLUMN_PRECISION:
{
*plValue = pDescRec->iPrecision;
break;
}
case SQL_DESC_SCALE:
case SQL_COLUMN_SCALE:
{
*plValue = getScale(pDescRec->hType, pDescRec->hScale);
break;
}
case SQL_DESC_SCHEMA_NAME:
{
rc = copyStrDataSmallLen(pDescRec->szSchemaName, SQL_NTS, (char *)pcValue, cbLen, pcbLen);
break;
}
case SQL_DESC_SEARCHABLE:
{
*plValue = pDescRec->iSearchable;
break;
}
case SQL_DESC_UNNAMED:
{
*plValue = pDescRec->iUnNamed;
break;
}
case SQL_DESC_UNSIGNED:
{
*plValue = pDescRec->cUnsigned;
break;
}
case SQL_DESC_UPDATABLE:
{
*plValue = pDescRec->iUpdatable;
break;
}
default:
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY091", "Invalid descriptor field identifier", 0, NULL);
goto error;
}
} // Switch
}
else
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY000", "SQLColAttribute: Invalid column number", 0, NULL);
goto error;
}
}
else
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"07005", "No columns found", 0, NULL);
goto error;
}
} // SQL_DESC_COUNT
}
else
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY000", "No result found", 0, NULL);
goto error;
}
error:
return rc;
}