SQLRETURN SQL_API SQLSetParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind) { #ifdef ODBCDEBUG ODBCLOG("SQLSetParam " PTRFMT " %u %s %s " ULENFMT " %d\n", PTRFMTCAST StatementHandle, (unsigned int) ParameterNumber, translateCType(ValueType), translateSQLType(ParameterType), ULENCAST LengthPrecision, (int) ParameterScale); #endif /* map this call to SQLBindParameter as described in ODBC 3.0 SDK help */ return SQLBindParameter_((ODBCStmt *) StatementHandle, ParameterNumber, SQL_PARAM_INPUT_OUTPUT, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValue, SQL_SETPARAM_VALUE_MAX, StrLen_or_Ind); }
SQLRETURN SQL_API SQLSetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT Type, SQLSMALLINT SubType, SQLLEN Length, SQLSMALLINT Precision, SQLSMALLINT Scale, SQLPOINTER DataPtr, SQLLEN *StringLengthPtr, SQLLEN *IndicatorPtr) { ODBCDesc *desc = (ODBCDesc *) DescriptorHandle; #ifdef ODBCDEBUG ODBCLOG("SQLSetDescRec " PTRFMT " %d %s %s " LENFMT " %d %d\n", PTRFMTCAST DescriptorHandle, (int) RecNumber, isAD(desc) ? translateCType(Type) : translateSQLType(Type), translateSubType(Type, SubType), LENCAST Length, (int) Precision, (int) Scale); #endif if (!isValidDesc(desc)) return SQL_INVALID_HANDLE; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_TYPE, (SQLPOINTER) (ssize_t) Type, 0) == SQL_ERROR) return SQL_ERROR; if ((Type == SQL_DATETIME || Type == SQL_INTERVAL) && SQLSetDescField_(desc, RecNumber, SQL_DESC_DATETIME_INTERVAL_CODE, (SQLPOINTER) (ssize_t) SubType, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_OCTET_LENGTH, (SQLPOINTER) (ssize_t) Length, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_PRECISION, (SQLPOINTER) (ssize_t) Precision, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_SCALE, (SQLPOINTER) (ssize_t) Scale, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_OCTET_LENGTH_PTR, (SQLPOINTER) StringLengthPtr, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_INDICATOR_PTR, (SQLPOINTER) IndicatorPtr, 0) == SQL_ERROR) return SQL_ERROR; if (SQLSetDescField_(desc, RecNumber, SQL_DESC_DATA_PTR, (SQLPOINTER) DataPtr, 0) == SQL_ERROR) return SQL_ERROR; return desc->Error ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; }
SQLRETURN SQL_API SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { ODBCStmt *stmt = (ODBCStmt *) StatementHandle; ODBCDesc *desc; /* Application Row Descriptor */ #ifdef ODBCDEBUG ODBCLOG("SQLBindCol " PTRFMT " %u %s " LENFMT "\n", PTRFMTCAST StatementHandle, (unsigned int) ColumnNumber, translateCType(TargetType), LENCAST BufferLength); #endif if (!isValidStmt(stmt)) return SQL_INVALID_HANDLE; assert(stmt->Dbc); clearStmtErrors(stmt); /* check input parameters */ /* column number 0 (Bookmark column) is not supported */ if (ColumnNumber == 0) { if (TargetType == SQL_C_BOOKMARK || TargetType == SQL_C_VARBOOKMARK) { /* Optional feature not implemented */ addStmtError(stmt, "HYC00", NULL, 0); } else { /* Restricted data type attribute violation */ addStmtError(stmt, "07006", NULL, 0); } return SQL_ERROR; } if (stmt->State >= EXECUTED1 && ColumnNumber > stmt->ImplRowDescr->sql_desc_count) { /* Invalid descriptor index */ addStmtError(stmt, "07009", NULL, 0); return SQL_ERROR; } /* For safety: limit the maximum number of columns to bind */ if (ColumnNumber > MONETDB_MAX_BIND_COLS) { /* General error */ addStmtError(stmt, "HY000", "Maximum number of bind columns (8192) exceeded", 0); return SQL_ERROR; } /* can't let SQLSetDescField below do this check since it returns the wrong error code if the type is incorrect */ switch (TargetType) { case SQL_C_CHAR: case SQL_C_WCHAR: case SQL_C_BINARY: case SQL_C_BIT: case SQL_C_STINYINT: case SQL_C_UTINYINT: case SQL_C_TINYINT: case SQL_C_SSHORT: case SQL_C_USHORT: case SQL_C_SHORT: case SQL_C_SLONG: case SQL_C_ULONG: case SQL_C_LONG: case SQL_C_SBIGINT: case SQL_C_UBIGINT: case SQL_C_NUMERIC: case SQL_C_FLOAT: case SQL_C_DOUBLE: case SQL_C_TYPE_DATE: case SQL_C_TYPE_TIME: case SQL_C_TYPE_TIMESTAMP: case SQL_C_INTERVAL_YEAR: case SQL_C_INTERVAL_MONTH: case SQL_C_INTERVAL_YEAR_TO_MONTH: case SQL_C_INTERVAL_DAY: case SQL_C_INTERVAL_HOUR: case SQL_C_INTERVAL_MINUTE: case SQL_C_INTERVAL_SECOND: case SQL_C_INTERVAL_DAY_TO_HOUR: case SQL_C_INTERVAL_DAY_TO_MINUTE: case SQL_C_INTERVAL_DAY_TO_SECOND: case SQL_C_INTERVAL_HOUR_TO_MINUTE: case SQL_C_INTERVAL_HOUR_TO_SECOND: case SQL_C_INTERVAL_MINUTE_TO_SECOND: case SQL_C_GUID: case SQL_C_DEFAULT: break; default: /* Invalid application buffer type */ addStmtError(stmt, "HY003", NULL, 0); return SQL_ERROR; } if (BufferLength < 0) { /* Invalid string or buffer length */ addStmtError(stmt, "HY090", NULL, 0); return SQL_ERROR; } desc = stmt->ApplRowDescr; if (TargetValuePtr == NULL && ColumnNumber == desc->sql_desc_count) { int i = desc->sql_desc_count - 1; while (i > 0 && desc->descRec[i].sql_desc_data_ptr == NULL) i--; setODBCDescRecCount(desc, i); } else { ODBCDescRec *rec; SQLRETURN rc; if (ColumnNumber > desc->sql_desc_count) setODBCDescRecCount(desc, ColumnNumber); rc = SQLSetDescField_(desc, ColumnNumber, SQL_DESC_CONCISE_TYPE, (SQLPOINTER) (ssize_t) TargetType, 0); if (!SQL_SUCCEEDED(rc)) return rc; rec = &desc->descRec[ColumnNumber]; rec->sql_desc_octet_length = BufferLength; rec->sql_desc_data_ptr = TargetValuePtr; rec->sql_desc_indicator_ptr = StrLen_or_Ind; rec->sql_desc_octet_length_ptr = StrLen_or_Ind; } return SQL_SUCCESS; }
SQLRETURN SQL_API SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr) { ODBCStmt *stmt = (ODBCStmt *) StatementHandle; #ifdef ODBCDEBUG ODBCLOG("SQLGetData %p %u %s %p " LENFMT " %p\n", StatementHandle, (unsigned int) Col_or_Param_Num, translateCType(TargetType), TargetValuePtr, LENCAST BufferLength, StrLen_or_IndPtr); #endif if (!isValidStmt(stmt)) return SQL_INVALID_HANDLE; assert(stmt->Dbc); assert(stmt->Dbc->mid); assert(stmt->hdl); clearStmtErrors(stmt); /* check statement cursor state, query should be executed */ if (stmt->State < EXECUTED0) { /* Function sequence error */ addStmtError(stmt, "HY010", NULL, 0); return SQL_ERROR; } if (stmt->State <= EXECUTED1) { /* Invalid cursor state */ addStmtError(stmt, "24000", NULL, 0); return SQL_ERROR; } if (stmt->rowSetSize == 0) { /* SQLFetch failed */ /* General error */ addStmtError(stmt, "HY000", NULL, 0); return SQL_ERROR; } if (stmt->rowSetSize > 1 && stmt->cursorType == SQL_CURSOR_FORWARD_ONLY) { /* Invalid cursor position */ addStmtError(stmt, "HY109", NULL, 0); return SQL_ERROR; } if (Col_or_Param_Num <= 0 || Col_or_Param_Num > stmt->ImplRowDescr->sql_desc_count) { /* Invalid descriptor index */ addStmtError(stmt, "07009", NULL, 0); return SQL_ERROR; } if (TargetValuePtr == NULL) { /* Invalid use of null pointer */ addStmtError(stmt, "HY009", NULL, 0); return SQL_ERROR; } if (Col_or_Param_Num != stmt->currentCol) stmt->retrieved = 0; stmt->currentCol = Col_or_Param_Num; if (TargetType == SQL_ARD_TYPE) { ODBCDesc *desc = stmt->ApplRowDescr; if (Col_or_Param_Num > desc->sql_desc_count) { /* Invalid descriptor index */ addStmtError(stmt, "07009", NULL, 0); return SQL_ERROR; } TargetType = desc->descRec[Col_or_Param_Num].sql_desc_concise_type; } return ODBCFetch(stmt, Col_or_Param_Num, TargetType, TargetValuePtr, BufferLength, StrLen_or_IndPtr, StrLen_or_IndPtr, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, 0); }