List:Commits« Previous MessageNext Message »
From:pharvey Date:May 8 2006 10:40pm
Subject:Connector/ODBC 5 commit: r208 - MYSQLPlus/MYSQLPlusLib doc/Project
View as plain text  
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/Projectpharvey9 May