List:Commits« Previous MessageNext Message »
From:pharvey Date:October 3 2006 2:51pm
Subject:Connector/ODBC 5 commit: r568 - in trunk: . Driver/Driver/Library SDK/C/Library SDK/C/include SDK/MYSQLPlus/Library SDK/MYSQLPlus/include
View as plain text  
Modified:
   trunk/Driver/Driver/Library/SQLGetFunctions.cpp
   trunk/SDK/C/Library/MYODBCC.cpp
   trunk/SDK/C/include/MYODBCC.h
   trunk/SDK/MYSQLPlus/Library/MConnection.cpp
   trunk/SDK/MYSQLPlus/Library/MEnvironment.cpp
   trunk/SDK/MYSQLPlus/include/MConnection.h
   trunk/connector-odbc.vpw
Log:
FIX: Seems MS DM breaks some ODBC rules on behalf of MS Access (error code can only be
found in MS Access to ODBC compat. doc and even then only archived despite coming from DM
itself). So in this case we have to return size of numeric return values in SQLGetInfo()
even as spec. says they should be ignored.

Modified: trunk/Driver/Driver/Library/SQLGetFunctions.cpp
===================================================================
--- trunk/Driver/Driver/Library/SQLGetFunctions.cpp	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/Driver/Driver/Library/SQLGetFunctions.cpp	2006-10-03 14:51:48 UTC (rev 568)
@@ -53,6 +53,7 @@
 /*  SQL_API_SQLDATASOURCES,         DM  */
     SQL_API_SQLDESCRIBECOL,
     SQL_API_SQLDISCONNECT,
+/*  SQL_API_SQLDRIVERS,             DM  */
     SQL_API_SQLENDTRAN,
 /*  SQL_API_SQLERROR,               Dep */
     SQL_API_SQLEXECDIRECT,
@@ -78,9 +79,9 @@
 /*  SQL_API_SQLGETSTMTOPTION,       Dep */
     SQL_API_SQLGETTYPEINFO,
     SQL_API_SQLNUMRESULTCOLS,
-/*  SQL_API_SQLPARAMDATA,               */
+/*    SQL_API_SQLPARAMDATA, */
     SQL_API_SQLPREPARE,
-/*  SQL_API_SQLPUTDATA,                 */
+/*    SQL_API_SQLPUTDATA, */
     SQL_API_SQLROWCOUNT,
     SQL_API_SQLSETCONNECTATTR,
 /*  SQL_API_SQLSETCONNECTOPTION,    Dep */
@@ -88,7 +89,7 @@
     SQL_API_SQLSETDESCFIELD,
     SQL_API_SQLSETDESCREC,
     SQL_API_SQLSETENVATTR,
-/*  SQL_API_SQLSETPARAM             Dep */
+/*  SQL_API_SQLSETPARAM,            Dep */
     SQL_API_SQLSETSTMTATTR,
 /*  SQL_API_SQLSETSTMTOPTION,       Dep */
     SQL_API_SQLSPECIALCOLUMNS,
@@ -146,18 +147,25 @@
 {
     MYODBCDbgEnter();
 
+#if MYODBC_DBG > 1
+    MYODBCDbgInfo( QString("nFunctionID=%1=%2").arg( nFunctionID ).arg(
MYODBCC::getFunctionsString( nFunctionID ) ) );
+#endif
+
     if ( !hDbc )
         MYODBCDbgReturn( SQL_INVALID_HANDLE );
 
-    MConnection * pConnection = (MConnection*)hDbc;
+    MConnection *   pConnection = (MConnection*)hDbc;
+    SQLINTEGER      nIndex;
+    SQLINTEGER      MYODBCDrvSupportedFunctionsSize =
(sizeof(MYODBCDrvSupportedFunctions) / sizeof(MYODBCDrvSupportedFunctions[0]));
 
     pConnection->doDiagnosticClear();
 
-    SQLINTEGER nIndex;
-    SQLINTEGER MYODBCDrvSupportedFunctionsSize;
+    /*!
+        \internal ODBC RULE
 
-    MYODBCDrvSupportedFunctionsSize = (sizeof(MYODBCDrvSupportedFunctions) /
sizeof(MYODBCDrvSupportedFunctions[0]));
-
+        If FunctionId is SQL_API_ODBC3_ALL_FUNCTIONS, SupportedPtr points to a
SQLSMALLINT array with a 
+        number of elements equal to SQL_API_ODBC3_ALL_FUNCTIONS_SIZE.
+    */
     if ( nFunctionID == SQL_API_ODBC3_ALL_FUNCTIONS )
     {
         for ( nIndex = 0; nIndex < MYODBCDrvSupportedFunctionsSize; nIndex++ )
@@ -168,26 +176,53 @@
         MYODBCDbgReturn( SQL_SUCCESS );
     }
 
+    /*!
+        \internal ODBC RULE
 
+        If FunctionId is SQL_API_ALL_FUNCTIONS, SupportedPtr points to an SQLUSMALLINT
array of 100 elements. The 
+        array is indexed by #define values used by FunctionId to identify each ODBC
function; some elements of 
+        the array are unused and reserved for future use.
+    */
     if ( nFunctionID == SQL_API_ALL_FUNCTIONS )
     {
         for ( nIndex = 0; nIndex < MYODBCDrvSupportedFunctionsSize; nIndex++ )
         {
             if ( MYODBCDrvSupportedFunctions[nIndex] < 100 )
-                pnSupported[MYODBCDrvSupportedFunctions[nIndex]]= SQL_TRUE;
+                pnSupported[MYODBCDrvSupportedFunctions[nIndex]] = SQL_TRUE;
         }
         MYODBCDbgReturn( SQL_SUCCESS );
     }
 
 
-    *pnSupported = SQL_FALSE;
-    for ( nIndex = 0; nIndex < MYODBCDrvSupportedFunctionsSize; nIndex++ )
+    /*!
+        \internal ODBC RULE
+
+        If FunctionId identifies a single ODBC function, SupportedPtr points to a single
SQLUSMALLINT value that is 
+        SQL_TRUE if the specified function is supported by the driver, and SQL_FALSE if
it is not supported. 
+    */
     {
-        if ( MYODBCDrvSupportedFunctions[nIndex] == nFunctionID )
+        BOOLEAN bFound = false;
+
+        *pnSupported = SQL_FALSE;
+        for ( nIndex = 0; nIndex < MYODBCDrvSupportedFunctionsSize; nIndex++ )
         {
-            *pnSupported = SQL_TRUE;
-            break;
+            if ( MYODBCDrvSupportedFunctions[nIndex] == nFunctionID )
+            {
+                *pnSupported = SQL_TRUE;
+                bFound = true;
+                break;
+            }
         }
+
+        /*!
+            \internal ODBC RULE (DM)
+
+            An invalid FunctionId value was specified.
+        */
+        /*
+        if ( !bFound )
+            MYODBCDbgReturn( pConnection->doDiagnosticAppend( MDiagnostic::DIA_HY095 )
);
+        */
     }
 
     MYODBCDbgReturn( SQL_SUCCESS );

Modified: trunk/SDK/C/Library/MYODBCC.cpp
===================================================================
--- trunk/SDK/C/Library/MYODBCC.cpp	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/SDK/C/Library/MYODBCC.cpp	2006-10-03 14:51:48 UTC (rev 568)
@@ -150,6 +150,23 @@
     return "unknown";
 }
 
+QString MYODBCC::getDriverCompletionString( SQLINTEGER nDriverCompletion )
+{
+    switch ( nDriverCompletion )
+    {
+        case SQL_DRIVER_NOPROMPT:
+            return "SQL_DRIVER_NOPROMPT";
+        case SQL_DRIVER_COMPLETE:
+            return "SQL_DRIVER_COMPLETE";
+        case SQL_DRIVER_PROMPT:
+            return "SQL_DRIVER_PROMPT";
+        case SQL_DRIVER_COMPLETE_REQUIRED:
+            return "SQL_DRIVER_COMPLETE_REQUIRED";
+    }
+
+    return "unknown";
+}
+
 QString MYODBCC::getDiagFieldString( SQLSMALLINT nDiagField )
 {
     switch ( nDiagField )

Modified: trunk/SDK/C/include/MYODBCC.h
===================================================================
--- trunk/SDK/C/include/MYODBCC.h	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/SDK/C/include/MYODBCC.h	2006-10-03 14:51:48 UTC (rev 568)
@@ -193,6 +193,7 @@
     /*@{*/
     static QString getConnectAttrString( SQLINTEGER nAttribute );
     static QString getConnectOptionString( SQLUSMALLINT nOption );
+    static QString getDriverCompletionString( SQLINTEGER nDriverCompletion );
     static QString getDiagFieldString( SQLSMALLINT nDiagField );
     static QString getEnvAttrString( SQLINTEGER nAttribute );
     static QString getFunctionsString( SQLUSMALLINT nFunction );

Modified: trunk/SDK/MYSQLPlus/Library/MConnection.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MConnection.cpp	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/SDK/MYSQLPlus/Library/MConnection.cpp	2006-10-03 14:51:48 UTC (rev 568)
@@ -145,7 +145,7 @@
         case SQL_ATTR_ANSI_APP:
             /*!
                 \internal ODBC RULE
-
+    
                 If the application is using ANSI APIs, SQL_ATTR_ANSI_APP will be set to
SQL_AA_TRUE, and if it is using 
                 Unicode, it will be set to a value of SQL_AA_FALSE.
                 ...
@@ -153,8 +153,19 @@
                 for this attribute. If the driver returns SQL_SUCCESS, the Driver Manager
will separate ANSI and Unicode 
                 connections when Connection Pooling is used.
             */
-            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Driver does NOT behave differently if the application is ANSI.") ) );
+            /*!
+                \internal MYODBC RULE
 
+                We only have an ANSI API - no UNICODE API. So at first blush it looks
like we should return an error 
+                here. However; 
+
+                - we may depend upon connection level settings with the server for proper
character/string handling
+                - the downside of separating the two for connection pooling (hopefully
that is all that is happening) is
+                  very minimal
+            */
+            /* MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Driver does NOT behave differently if the application is ANSI.") ) ); */
+            break;
+
         case SQL_ATTR_ASYNC_ENABLE:
             MYODBCDbgReturn( setAsyncEnable( (SQLUINTEGER)pValue ) );
 
@@ -213,7 +224,7 @@
                 /*!
                     \internal ODBC RULE (DM)
 
-                    (DM) *ValuePtr is a character string, and BufferLength was less than
zero 
+                    *ValuePtr is a character string, and BufferLength was less than zero 
                     but not equal to SQL_NTS.
                 */
                 if ( nStringLength < 0 && nStringLength != SQL_NTS )
@@ -233,7 +244,7 @@
                 /*!
                     \internal ODBC RULE (DM)
 
-                    (DM) *ValuePtr is a character string, and BufferLength was less than
zero 
+                    *ValuePtr is a character string, and BufferLength was less than zero 
                     but not equal to SQL_NTS.
                 */
                 if ( nStringLength < 0 && nStringLength != SQL_NTS )
@@ -254,6 +265,16 @@
         case SQL_ATTR_TXN_ISOLATION:
             MYODBCDbgReturn( setTxnIsolation( (qint32)pValue ) );
 
+        case 30002:
+            /*!
+                \internal MYODBC RULE
+
+                MS Access tries to get/set this unknown attribute. Most drivers,
including C/ODBC v3
+                ignore it and return SQL_SUCCESS. We do same as part of effort to resolve
some issues
+                with MS Access.
+            */
+            break;
+
         default:
             MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY092 ) );
     }
@@ -400,7 +421,7 @@
         case SQL_ATTR_QUIET_MODE:
             if ( pValue )
                 *((SQLINTEGER*)pValue) = (SQLINTEGER)getQuietMode();
-            *pnLen = SQL_IS_INTEGER ;
+            *pnLen = SQL_IS_INTEGER;
             break;
 
         case SQL_ATTR_TRACE:
@@ -463,6 +484,16 @@
             *pnLen = SQL_IS_INTEGER ;
             break;
 
+        case 30002:
+            /*!
+                \internal MYODBC RULE
+
+                MS Access tries to get/set this unknown attribute. Most drivers,
including C/ODBC v3
+                ignore it and return SQL_SUCCESS. We do same as part of effort to resolve
some issues
+                with MS Access.
+            */
+            break;
+
         default:
             MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY092 ) );
     }
@@ -494,7 +525,7 @@
     SQLUSMALLINT *      pnSQLUSMALLINT  = (SQLUSMALLINT *)pInfoValue;
     SQLUINTEGER *       pnSQLUINTEGER   = (SQLUINTEGER *)pInfoValue;
     SQLWCHAR *          pszSQLWCHAR     = (SQLWCHAR *)pInfoValue;
-    SQLSMALLINT *       pnSQLSMALLINT   = (SQLSMALLINT *)pInfoValue;
+    /* SQLSMALLINT *       pnSQLSMALLINT   = (SQLSMALLINT *)pInfoValue; */
     /* pnStringLengthBytes is optional so provide dummy to make code below a little
cleaner */
     SQLSMALLINT         nStringLengthBytes;
     SQLSMALLINT *       pnStringLengthBytes  = pnStringLengthBytesPtr;
@@ -548,9 +579,16 @@
         For all other types (other than string) of data, the value of BufferLength is
ignored 
         and the driver assumes the size of *InfoValuePtr is SQLUSMALLINT or SQLUINTEGER,
depending 
         on the InfoType.
+
+        \note   
+
+        The above rule is true for ODBC v3 and v2. However; testing for MS Access exposed
that the 
+        DM on XP really does care. The numeric sizes must be returned as well otherwise
pInfoValue 
+        is ignored.
     */
     if ( !pnStringLengthBytesPtr )
         pnStringLengthBytes = &nStringLengthBytes;
+    *pnStringLengthBytes = sizeof(SQLUINTEGER);
 
     /*!
         \internal ODBC RULE (DM)
@@ -558,13 +596,9 @@
         The type of information requested in InfoType requires an open connection. Of the

         information types reserved by ODBC, only SQL_ODBC_VER can be returned without an
open 
         connection.
-
-        \todo
-
-        Commented out for testing with MS Access. Need to revisit this.
     */
-//    if ( getState() < STATE_C4 && (nInfoType != SQL_ODBC_VER &&
nInfoType != SQL_DRIVER_ODBC_VER) )
-//        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_08003 ) );
+    if ( getState() < STATE_C4 && (nInfoType != SQL_ODBC_VER &&
nInfoType != SQL_DRIVER_ODBC_VER) )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_08003 ) );
 
     /*!
         \internal
@@ -607,6 +641,7 @@
             break;
         case SQL_ACTIVE_ENVIRONMENTS:
             *pnSQLUSMALLINT = getInfoActiveEnvironments();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_AGGREGATE_FUNCTIONS:
             *pnSQLUINTEGER  = getInfoAggregateFunctions();
@@ -631,6 +666,7 @@
             break;
         case SQL_CATALOG_LOCATION:
             *pnSQLUSMALLINT = getInfoCatalogLocation();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CATALOG_NAME:
             bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)getInfoCatalogName().utf16(), &nStringLengthChars );
@@ -667,6 +703,7 @@
             break;
         case SQL_CONCAT_NULL_BEHAVIOR:
             *pnSQLUSMALLINT = getInfoConcatNullBehavior();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CONVERT_BIGINT:
             *pnSQLUINTEGER  = getInfoConvertBigint();
@@ -741,6 +778,7 @@
             break;
         case SQL_CORRELATION_NAME:
             *pnSQLUSMALLINT = getInfoCorrelationName();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CREATE_ASSERTION:
             *pnSQLUINTEGER = getInfoCreateAssertion();
@@ -768,9 +806,11 @@
             break;
         case SQL_CURSOR_COMMIT_BEHAVIOR:
             *pnSQLUSMALLINT = getInfoCursorCommitBehavior();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CURSOR_ROLLBACK_BEHAVIOR:
             *pnSQLUSMALLINT = getInfoCursorRollbackBehavior();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CURSOR_SENSITIVITY:
             *pnSQLUINTEGER = getInfoCursorSensitivity();
@@ -956,11 +996,9 @@
             if ( !bCopyOk )
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 )
);
             break;
-        case SQL_FETCH_DIRECTION: /* for compat. with 2.x */
-            *pnSQLUINTEGER = getInfoFetchDirection();
-            break;
         case SQL_FILE_USAGE:
             *pnSQLUSMALLINT = getInfoFileUsage();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
             *pnSQLUINTEGER = getInfoForwardOnlyCursorAttributes1();
@@ -973,9 +1011,11 @@
             break;
         case SQL_GROUP_BY:
             *pnSQLUSMALLINT = getInfoGroupBy();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_IDENTIFIER_CASE:
             *pnSQLUSMALLINT = getInfoIdentifierCase();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_IDENTIFIER_QUOTE_CHAR:
             bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
(SQLWCHAR*)getInfoIdentifierQuoteChar().utf16(), &nStringLengthChars );
@@ -1016,9 +1056,6 @@
             if ( !bCopyOk )
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 )
);
             break;
-        case SQL_LOCK_TYPES: /* for compat with 2.x */
-            *pnSQLUINTEGER = getInfoLockTypes();
-            break;
         case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
             *pnSQLUINTEGER = getInfoMaxAsyncConcurrentStatements();
             break;
@@ -1027,45 +1064,56 @@
             break;
         case SQL_MAX_CATALOG_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxCatalogNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_CHAR_LITERAL_LEN:
             *pnSQLUINTEGER = getInfoMaxCharLiteralLen();
             break;
         case SQL_MAX_COLUMN_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxColumnNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_COLUMNS_IN_GROUP_BY:
             *pnSQLUSMALLINT = getInfoMaxColumnsInGroupBy();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_COLUMNS_IN_INDEX:
             *pnSQLUSMALLINT = getInfoMaxColumnsInIndex();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_COLUMNS_IN_ORDER_BY:
             *pnSQLUSMALLINT = getInfoMaxColumnsInOrderBy();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_COLUMNS_IN_SELECT:
             *pnSQLUSMALLINT = getInfoMaxColumnsInSelect();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_COLUMNS_IN_TABLE:
             *pnSQLUSMALLINT = getInfoMaxColumnsInTable();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_CONCURRENT_ACTIVITIES:
             *pnSQLUSMALLINT = getInfoMaxConcurrentActivities();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_CURSOR_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxCursorNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_DRIVER_CONNECTIONS:
             *pnSQLUINTEGER = getInfoMaxDriverConnections();
             break;
         case SQL_MAX_IDENTIFIER_LEN:
             *pnSQLUSMALLINT = getInfoMaxIdentifierLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_INDEX_SIZE:
             *pnSQLUINTEGER = getInfoMaxIndexSize();
             break;
         case SQL_MAX_PROCEDURE_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxProcedureNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_ROW_SIZE:
             *pnSQLUINTEGER = getInfoMaxRowSize();
@@ -1078,18 +1126,22 @@
             break;
         case SQL_MAX_SCHEMA_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxSchemaNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_STATEMENT_LEN:
             *pnSQLUINTEGER = getInfoMaxStatementLen();
             break;
         case SQL_MAX_TABLE_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxTableNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_TABLES_IN_SELECT:
             *pnSQLUSMALLINT = getInfoMaxTablesInSelect();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MAX_USER_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxUserNameLen();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MULT_RESULT_SETS:
             bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
(SQLWCHAR*)getInfoMultiResultSets().utf16(), &nStringLengthChars );
@@ -1111,22 +1163,18 @@
             break;
         case SQL_NON_NULLABLE_COLUMNS:
             *pnSQLUSMALLINT = getInfoNonNullableColumns();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_NULL_COLLATION:
             *pnSQLUSMALLINT = getInfoNullCollation();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_NUMERIC_FUNCTIONS:
             *pnSQLUINTEGER = getInfoNumericFunctions();
             break;
-        case SQL_ODBC_API_CONFORMANCE: /* for compat with 2.x */
-            *pnSQLUSMALLINT = getInfoOdbcApiConformance();
-            break;
         case SQL_ODBC_INTERFACE_CONFORMANCE:
             *pnSQLUINTEGER = getInfoOdbcInterfaceConformance();
             break;
-        case SQL_ODBC_SQL_CONFORMANCE: /* for compat with 2.x */
-            *pnSQLSMALLINT = getInfoOdbcSqlConformance();
-            break;
         case SQL_ODBC_VER:
             bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)getInfoOdbcVer().utf16(), &nStringLengthChars );
             *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
@@ -1160,14 +1208,9 @@
             if ( !bCopyOk )
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 )
);
             break;
-        case SQL_POS_OPERATIONS:
-            *pnSQLUINTEGER = getInfoPosOperations();
-            break;
-        case SQL_POSITIONED_STATEMENTS: /* for compat with 2.x */
-            *pnSQLUINTEGER = getInfoPositionedStatements();
-            break;
         case SQL_QUOTED_IDENTIFIER_CASE:
             *pnSQLUSMALLINT = getInfoQuotedIdentifierCase();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_ROW_UPDATES:
             bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)getInfoRowUpdates().utf16(), &nStringLengthChars );
@@ -1184,9 +1227,6 @@
         case SQL_SCHEMA_USAGE:
             *pnSQLUINTEGER = getInfoSchemaUsage();
             break;
-        case SQL_SCROLL_CONCURRENCY: /* for compat with 2.x */
-            *pnSQLUINTEGER = getInfoScrollConcurrency();
-            break;
         case SQL_SCROLL_OPTIONS:
             *pnSQLUINTEGER = getInfoScrollOptions();
             break;
@@ -1253,9 +1293,6 @@
         case SQL_STATIC_CURSOR_ATTRIBUTES2:
             *pnSQLUINTEGER = getInfoStaticCursorAttributes2();
             break;
-        case SQL_STATIC_SENSITIVITY: /* for compat with 2.x */
-            *pnSQLUINTEGER = getInfoStaticSensitivity();
-            break;
         case SQL_STRING_FUNCTIONS:
             *pnSQLUINTEGER = getInfoStringFunctions();
             break;
@@ -1282,6 +1319,7 @@
             break;
         case SQL_TXN_CAPABLE:
             *pnSQLUSMALLINT = getInfoTxnCapable();
+            *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_TXN_ISOLATION_OPTION:
             *pnSQLUINTEGER = getInfoTxnIsolationOption();
@@ -1302,7 +1340,50 @@
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 )
);
             break;
         default:
-            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HYC00 ) );
+            if ( getEnvironment()->getODBCVersion() == SQL_OV_ODBC2 )
+            {
+                /*!
+                    \internal
+                    \note
+
+                    ODBC v3 spec. says that this func only returns; strings, SQLUINTEGER
or SQLUSMALLINT. However; these come from
+                    the ODBC v2 spec. and there it says (for example)
SQL_ODBC_SQL_CONFORMANCE is a 16 bit numeric - SQLSMALLINT
+                    in old MS code. We choose to obey ODBC v3 spec. by upsizing the
numerics. 
+                */
+                switch ( nInfoType )
+                {
+                    case SQL_FETCH_DIRECTION:
+                        *pnSQLUINTEGER = getInfoFetchDirection();
+                        break;
+                    case SQL_LOCK_TYPES:
+                        *pnSQLUINTEGER = getInfoLockTypes();
+                        break;
+                    case SQL_ODBC_API_CONFORMANCE:
+                        *pnSQLUSMALLINT = getInfoOdbcApiConformance();
+                        *pnStringLengthBytes = sizeof(SQLUSMALLINT);
+                        break;
+                    case SQL_ODBC_SQL_CONFORMANCE:
+                        *pnSQLUSMALLINT = getInfoOdbcSqlConformance();
+                        *pnStringLengthBytes = sizeof(SQLUSMALLINT);
+                        break;
+                    case SQL_POS_OPERATIONS:
+                        *pnSQLUINTEGER = getInfoPosOperations();
+                        break;
+                    case SQL_POSITIONED_STATEMENTS:
+                        *pnSQLUINTEGER = getInfoPositionedStatements();
+                        break;
+                    case SQL_SCROLL_CONCURRENCY:
+                        *pnSQLUINTEGER = getInfoScrollConcurrency();
+                        break;
+                    case SQL_STATIC_SENSITIVITY:
+                        *pnSQLUINTEGER = getInfoStaticSensitivity();
+                        break;
+                    default:
+                        MYODBCDbgReturn( getDiagnostic()->doAppend(
MDiagnostic::DIA_HYC00 ) );
+                }
+            }
+            else
+                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HYC00 )
);
     }
 
     MYODBCDbgReturn( SQL_SUCCESS );
@@ -1920,6 +2001,10 @@
     BOOLEAN                 bPrompt     = false;
     MYODBC_C_DLL            hModule     = NULL;
 
+#if MYODBC_DBG > 1
+    MYODBCDbgInfo( QString("nDriverCompletion=%1=%2").arg( nDriverCompletion ).arg(
MYODBCC::getDriverCompletionString( nDriverCompletion ) ) );
+#endif
+
     /*!
         \internal ODBC RULE
 

Modified: trunk/SDK/MYSQLPlus/Library/MEnvironment.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MEnvironment.cpp	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/SDK/MYSQLPlus/Library/MEnvironment.cpp	2006-10-03 14:51:48 UTC (rev 568)
@@ -435,6 +435,11 @@
 
             This attribute corresponds to the SQL_ATTR_ODBC_VERSION field.
 
+            This must be set after allocating an environment and before allocating a 
+            connection since we are an ODBC v3 driver. ODBC v2 (or less) applications
+            do not have to set this. The DM will compensate for this by setting this on
+            behalf of the application.
+
             This exists, in large part, so we can manage access to the underlying
variable.
 
     \param  nODBCVersion
@@ -461,8 +466,11 @@
     /*!
         \internal MYODBC RULE
 
-        We strictly support ODBC v3 at the moment - no backward support. The DM 
-        should compensate for this with function and data mapping.
+        We strictly support ODBC v3 at the moment. The DM should compensate for this with

+        function and data mapping.
+
+        The ODBC v3 spec. does say we have to support some deprecated things from ODBC v2
so 
+        our behaviour will change a bit depending upon whether we have here.
     */
     switch ( nODBCVersion )
     {

Modified: trunk/SDK/MYSQLPlus/include/MConnection.h
===================================================================
--- trunk/SDK/MYSQLPlus/include/MConnection.h	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/SDK/MYSQLPlus/include/MConnection.h	2006-10-03 14:51:48 UTC (rev 568)
@@ -117,8 +117,8 @@
     /*@}*/
 
     /* getters */
+    MDiagnostic *   getDiagnostic();
     MEnvironment *  getEnvironment();
-    MDiagnostic *   getDiagnostic();
     ulong           getClientFlag( ulong nOptions, const QString &stringSTMT );
     int             getServerAliveSanityCheckInterval();
     QString         getDataSourceName();

Modified: trunk/connector-odbc.vpw
===================================================================
--- trunk/connector-odbc.vpw	2006-10-02 01:38:06 UTC (rev 567)
+++ trunk/connector-odbc.vpw	2006-10-03 14:51:48 UTC (rev 568)
@@ -1,30 +1,31 @@
 <!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
 <Workspace Version="10.0" VendorName="SlickEdit">
 	<Projects>
-		<Project File="SDK/C/C.vpj" />
-		<Project File="SDK/C/Library/CLibrary.vpj" />
-		<Project File="connector-odbc.vpj" />
-		<Project File="SDK/C/Tests/CTests.vpj" />
-		<Project File="SDK/Dbg/Dbg.vpj" />
-		<Project File="SDK/Dbg/Library/DbgLibrary.vpj" />
-		<Project File="SDK/Dbg/Tests/DbgTests.vpj" />
-		<Project File="Tools/dltest/dltest.vpj" />
-		<Project File="Driver/Driver/Driver.vpj" />
-		<Project File="Driver/Driver/Library/DriverLibrary.vpj" />
-		<Project File="Driver/Driver/Tests/DriverTests.vpj" />
-		<Project File="SDK/Installer/Ins.vpj" />
-		<Project File="SDK/Installer/Library/InsLibrary.vpj" />
-		<Project File="Tools/Installer/Installer.vpj" />
-		<Project File="SDK/Installer/Tests/InsTests.vpj" />
-		<Project File="../../mysql-include.vpj" />
-		<Project File="SDK/MYSQLPlus/MYSQLPlus.vpj" />
-		<Project File="SDK/MYSQLPlus/Library/MYSQLPlusLibrary.vpj" />
-		<Project File="SDK/MYSQLPlus/Tests/MYSQLPlusTests.vpj" />
-		<Project File="Driver/Setup/Setup.vpj" />
-		<Project File="Driver/Setup/Library/SetupLibrary.vpj" />
-		<Project File="Driver/Setup/Tests/SetupTests.vpj" />
-		<Project File="Tools/Shell/Shell.vpj" />
-		<Project File="SDK/Tst/Tst.vpj" />
-		<Project File="SDK/Tst/Library/TstLibrary.vpj" />
+		<Project File="SDK/C/C.vpj"/>
+		<Project File="SDK/C/Library/CLibrary.vpj"/>
+		<Project File="connector-odbc.vpj"/>
+		<Project File="SDK/C/Tests/CTests.vpj"/>
+		<Project File="SDK/Dbg/Dbg.vpj"/>
+		<Project File="SDK/Dbg/Library/DbgLibrary.vpj"/>
+		<Project File="SDK/Dbg/Tests/DbgTests.vpj"/>
+		<Project File="Tools/dltest/dltest.vpj"/>
+		<Project File="Driver/Driver/Driver.vpj"/>
+		<Project File="Driver/Driver/Library/DriverLibrary.vpj"/>
+		<Project File="Driver/Driver/Tests/DriverTests.vpj"/>
+		<Project File="SDK/Installer/Ins.vpj"/>
+		<Project File="SDK/Installer/Library/InsLibrary.vpj"/>
+		<Project File="Tools/Installer/Installer.vpj"/>
+		<Project File="SDK/Installer/Tests/InsTests.vpj"/>
+		<Project File="../../connector-odbc3/myodbc3/myodbc3.vpj"/>
+		<Project File="../../mysql-include.vpj"/>
+		<Project File="SDK/MYSQLPlus/MYSQLPlus.vpj"/>
+		<Project File="SDK/MYSQLPlus/Library/MYSQLPlusLibrary.vpj"/>
+		<Project File="SDK/MYSQLPlus/Tests/MYSQLPlusTests.vpj"/>
+		<Project File="Driver/Setup/Setup.vpj"/>
+		<Project File="Driver/Setup/Library/SetupLibrary.vpj"/>
+		<Project File="Driver/Setup/Tests/SetupTests.vpj"/>
+		<Project File="Tools/Shell/Shell.vpj"/>
+		<Project File="SDK/Tst/Tst.vpj"/>
+		<Project File="SDK/Tst/Library/TstLibrary.vpj"/>
 	</Projects>
 </Workspace>

Thread
Connector/ODBC 5 commit: r568 - in trunk: . Driver/Driver/Library SDK/C/Library SDK/C/include SDK/MYSQLPlus/Library SDK/MYSQLPlus/includepharvey3 Oct