Modified:
MYSQLPlus/MYSQLPlusLib/MStatement.cpp
doc/Project/SituationReport-20060512.ods
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-08 22:31:30 UTC (rev 207)
+++ MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-08 22:40:45 UTC (rev 208)
@@ -664,13 +664,308 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MStatement::doBindParameter( SQLUSMALLINT nParameterNumber, SQLSMALLINT
nInputOutputType, SQLSMALLINT nValueType, SQLSMALLINT nParameterType, SQLUINTEGER
nColumnSize, SQLSMALLINT nDecimalDigits, SQLPOINTER pParameterValuePtr, SQLINTEGER
nBufferLength, SQLINTEGER *pnStrLenOrIndPtr )
+SQLRETURN MStatement::doBindParameter( SQLUSMALLINT nParameterNumber, SQLSMALLINT
nInputOutputType, SQLSMALLINT nValueType, SQLSMALLINT nParameterType, SQLUINTEGER
nColumnSize, SQLSMALLINT nDecimalDigits, SQLPOINTER pParameterValuePtr, SQLINTEGER
nBufferLength, SQLINTEGER *pnStrLenOrInd )
{
MYODBCDbgEnter();
+ SQLRETURN nReturn;
+
+ /*!
+ \internal ODBC RULE
+
+ We clear diagnostic each time an ODBC API call is made (with exceptions).
+ */
pDiagnostic->doClear();
- MYODBCDbgReturn( SQL_ERROR );
+
+ /*
+ \internal ODBC Rule
+
+ If ParameterNumber in the call to SQLBindParameter is greater than the
+ value of SQL_DESC_COUNT, SQLSetDescField is called to increase the
+ value of SQL_DESC_COUNT to ParameterNumber.
+
+ The assumption here is that this rule is applied to both the APD
+ and the IPD.
+ */
+
+ /* do nothing: this is automatically done by MYODBCDrvSetDescField calls */
+
+ /*
+ \internal ODBC Rule
+
+ An application can set the ParameterValuePtr argument to a null
+ pointer, as long as *StrLen_or_IndPtr is SQL_NULL_DATA or
+ SQL_DATA_AT_EXEC. (This applies only to input or input/output
+ parameters.)
+ */
+ if ( !nParameterValuePtr && (nInputOutputType == SQL_PARAM_INPUT ||
nInputOutputType == SQL_PARAM_INPUT_OUTPUT) )
+ {
+ if ( !pnStrLenOrIndPtr || ((int)pnStrLenOrIndPtr != SQL_NULL_DATA &&
(int)pnStrLenOrIndPtr != SQL_DATA_AT_EXEC) )
+ MYODBCDbgReturn( MYODBCDiaAppend( pStm->hDia, MYODBC_DIA_HY009, 0, NULL )
);
+ }
+
+ /*!
+ \internal ODBC Rule
+
+ The InputOutputType argument specifies the type of the parameter.
+ This argument sets the SQL_DESC_PARAMETER_TYPE field of the IPD.
+ The InputOutputType argument is one of the following values:
+ SQL_PARAM_INPUT, SQL_PARAM_INPUT_OUTPUT, SQL_PARAM_OUTPUT.
+
+ MYODBCDrvSetDescField will do most validation for us.
+
+ \todo There are other rules to be checked here. See ODBC spec.
+ */
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc, nParameterNumber,
SQL_DESC_PARAMETER_TYPE, (SQLPOINTER)(SQLINTEGER)nInputOutputType, SQL_IS_SMALLINT );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+
+ /*
+ \internal ODBC Rule
+
+ This must be one of the values in the C Data Types section of
+ Appendix D: Data Types.
+
+ Calling MYODBCDrvSetDescField with SQL_DESC_CONCISE_TYPE will set
+ all 3 fields as required. However; MYODBCDrvSetDescField will allow
+ SQL and C concise types so we must ensure we are just using a C
+ concise type before making the call.
+ */
+ switch ( nValueType )
+ {
+ case SQL_C_CHAR:
+ case SQL_C_SSHORT:
+ case SQL_C_USHORT:
+ case SQL_C_SLONG:
+ case SQL_C_ULONG:
+ case SQL_C_FLOAT:
+ case SQL_C_DOUBLE:
+ case SQL_C_BIT:
+ case SQL_C_STINYINT:
+ case SQL_C_UTINYINT:
+ case SQL_C_SBIGINT:
+ case SQL_C_UBIGINT:
+ case SQL_C_BINARY:
+/* case SQL_C_VARBOOKMARK: */
+ case SQL_C_NUMERIC:
+ case SQL_C_GUID:
+ case SQL_C_DEFAULT:
+ case SQL_C_INTERVAL_YEAR:
+ case SQL_C_INTERVAL_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_YEAR_TO_MONTH:
+ 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:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc,
nParameterNumber, SQL_DESC_CONCISE_TYPE, (SQLPOINTER)(SQLINTEGER)nValueType,
SQL_IS_SMALLINT );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+ default:
+ /*! \todo add support for SQL_C_XML (currently not defined on unixODBC) */
+ MYODBCDbgReturn( MYODBCDiaAppend( pStm->hDia, MYODBC_DIA_HY003, 0, NULL )
);
+ }
+
+ /*
+ \internal ODBC Rule
+
+ This must be one of the values listed in the SQL Data Types section of
+ Appendix D: Data Types, or it must be a driver-specific value. This
+ argument sets the SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE, and
+ SQL_DESC_DATETIME_INTERVAL_CODE fields of the IPD.
+
+ Calling MYODBCDrvSetDescField with SQL_DESC_CONCISE_TYPE will set
+ all 3 fields as required. However; MYODBCDrvSetDescField will allow
+ SQL and C concise types so we must ensure we are just using a SQL
+ concise type before making the call.
+ */
+ switch ( nParameterType )
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+#ifdef UNICODE
+ case SQL_WCHAR:
+ case SQL_WVARCHAR:
+ case SQL_WLONGVARCHAR:
+#endif
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ case SQL_SMALLINT:
+ case SQL_INTEGER:
+ case SQL_REAL:
+ case SQL_FLOAT:
+ case SQL_DOUBLE:
+ case SQL_BIT:
+ case SQL_TINYINT:
+ case SQL_BIGINT:
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ case SQL_TYPE_DATE:
+ case SQL_TYPE_TIME:
+ case SQL_TYPE_TIMESTAMP:
+ case SQL_INTERVAL_MONTH:
+ case SQL_INTERVAL_YEAR:
+ case SQL_INTERVAL_YEAR_TO_MONTH:
+ case SQL_INTERVAL_DAY:
+ case SQL_INTERVAL_HOUR:
+ case SQL_INTERVAL_MINUTE:
+ case SQL_INTERVAL_SECOND:
+ case SQL_INTERVAL_DAY_TO_HOUR:
+ case SQL_INTERVAL_DAY_TO_MINUTE:
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ case SQL_INTERVAL_HOUR_TO_MINUTE:
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ case SQL_GUID:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc,
nParameterNumber, SQL_DESC_CONCISE_TYPE, (SQLPOINTER)(SQLINTEGER)nParameterType,
SQL_IS_SMALLINT );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+ default:
+ MYODBCDbgReturn( MYODBCDiaAppend( pStm->hDia, MYODBC_DIA_HY003, 0, NULL )
);
+ }
+
+ /*
+ \internal ODBC Rule
+
+ If ParameterType is SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_BINARY,
+ SQL_VARBINARY, SQL_LONGVARBINARY, or one of the concise SQL datetime or
+ interval data types, the SQL_DESC_LENGTH field of the IPD is set to the
+ value of ColumnSize.
+
+ If ParameterType is SQL_DECIMAL, SQL_NUMERIC, SQL_FLOAT, SQL_REAL, or
+ SQL_DOUBLE, the SQL_DESC_PRECISION field of the IPD is set to the value
+ of ColumnSize.
+
+ For other data types, the ColumnSize argument is ignored.
+ */
+ switch ( nParameterType )
+ {
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ case SQL_FLOAT:
+ case SQL_REAL:
+ case SQL_DOUBLE:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc,
nParameterNumber, SQL_DESC_PRECISION, (SQLPOINTER)nColumnSize, SQL_IS_UINTEGER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ case SQL_TYPE_DATE:
+ case SQL_TYPE_TIME:
+ case SQL_TYPE_TIMESTAMP:
+ case SQL_INTERVAL_MONTH:
+ case SQL_INTERVAL_YEAR:
+ case SQL_INTERVAL_YEAR_TO_MONTH:
+ case SQL_INTERVAL_DAY:
+ case SQL_INTERVAL_HOUR:
+ case SQL_INTERVAL_MINUTE:
+ case SQL_INTERVAL_SECOND:
+ case SQL_INTERVAL_DAY_TO_HOUR:
+ case SQL_INTERVAL_DAY_TO_MINUTE:
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ case SQL_INTERVAL_HOUR_TO_MINUTE:
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc,
nParameterNumber, SQL_DESC_LENGTH, (SQLPOINTER)nColumnSize, SQL_IS_UINTEGER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+ }
+
+ /*
+ \internal ODBC Rule
+
+ If ParameterType is SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, SQL_INTERVAL_SECOND,
+ SQL_INTERVAL_DAY_TO_SECOND, SQL_INTERVAL_HOUR_TO_SECOND, or
+ SQL_INTERVAL_MINUTE_TO_SECOND, the SQL_DESC_PRECISION field of the IPD is
+ set to DecimalDigits. If ParameterType is SQL_NUMERIC or SQL_DECIMAL, the
+ SQL_DESC_SCALE field of the IPD is set to DecimalDigits. For all other data
+ types, the DecimalDigits argument is ignored.
+ */
+ switch ( nParameterType )
+ {
+ case SQL_NUMERIC:
+ case SQL_DECIMAL:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc,
nParameterNumber, SQL_DESC_SCALE, (SQLPOINTER)(SQLINTEGER)nDecimalDigits, SQL_IS_SMALLINT
);
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+ case SQL_TYPE_TIME:
+ case SQL_TYPE_TIMESTAMP:
+ case SQL_INTERVAL_SECOND:
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ nReturn = MYODBCDrvSetDescField( pStm->attr_imp_param_desc,
nParameterNumber, SQL_DESC_PRECISION, (SQLPOINTER)(SQLINTEGER)nDecimalDigits,
SQL_IS_SMALLINT );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ break;
+ }
+
+ /*!
+ \internal ODBC Rule
+
+ There are many rules for this. See ODBC spec.
+
+ \todo Factor in the ODBC rules found in the spec.
+ */
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_OCTET_LENGTH, (SQLPOINTER)nBufferLen, SQL_IS_INTEGER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+
+ /*!
+ \internal ODBC Rule
+
+ There are many rules for this. See ODBC spec.
+
+ \todo Factor in the ODBC rules found in the spec.
+ */
+ if ( pnStrLenOrIndPtr && *pnStrLenOrIndPtr > 0 )
+ {
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_INDICATOR_PTR, pnStrLenOrIndPtr, SQL_IS_POINTER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_OCTET_LENGTH_PTR, NULL, SQL_IS_POINTER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ }
+ else
+ {
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_OCTET_LENGTH_PTR, pnStrLenOrIndPtr, SQL_IS_POINTER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_INDICATOR_PTR, NULL, SQL_IS_POINTER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ }
+
+ /*
+ \internal MYODBC Rule
+
+ We want to set this value last, as long as we are using MYODBCDrvSetDescField
+ to set the value, because this will cause a deeper validation.
+ */
+ nReturn = MYODBCDrvSetDescField( pStm->attr_app_param_desc, nParameterNumber,
SQL_DESC_DATA_PTR, nParameterValuePtr, SQL_IS_POINTER );
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+
+ MYODBCDbgReturn( SQL_SUCCESS );
}
SQLRETURN MStatement::doBulkOperations( SQLSMALLINT nOperation )
Modified: doc/Project/SituationReport-20060512.ods
===================================================================
(Binary files differ)
| Thread |
|---|
| • Connector/ODBC 5 commit: r208 - MYSQLPlus/MYSQLPlusLib doc/Project | pharvey | 9 May |