List:Commits« Previous MessageNext Message »
From:pharvey Date:May 28 2006 4:04pm
Subject:Connector/ODBC 5 commit: r281 - MYODBCDriver/MYODBCDriverLib MYODBCShell MYSQLPlus/MYSQLPlusLib
View as plain text  
Modified:
   MYODBCDriver/MYODBCDriverLib/SQLFreeHandle.cpp
   MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp
   MYODBCDriver/MYODBCDriverLib/SQLGetInfoW.cpp
   MYODBCShell/main.cpp
   MYSQLPlus/MYSQLPlusLib/MConnection.cpp
Log:


Modified: MYODBCDriver/MYODBCDriverLib/SQLFreeHandle.cpp
===================================================================
--- MYODBCDriver/MYODBCDriverLib/SQLFreeHandle.cpp	2006-05-28 04:02:32 UTC (rev 280)
+++ MYODBCDriver/MYODBCDriverLib/SQLFreeHandle.cpp	2006-05-28 16:04:54 UTC (rev 281)
@@ -38,21 +38,29 @@
                 MEnvironment *pEnvironment = (MEnvironment*)hHandle;
                 delete pEnvironment;
             }
+            break;
+
         case SQL_HANDLE_DBC:
             {
                 MConnection *pConnection = (MConnection*)hHandle;
                 delete pConnection;
             }
+            break;
+
         case SQL_HANDLE_STMT:
             {
                 MStatement *pStatement = (MStatement*)hHandle;
                 delete pStatement;
             }
+            break;
+
         case SQL_HANDLE_DESC:
             {
                 MDescriptor *pDescriptor = (MDescriptor*)hHandle;
                 delete pDescriptor;
             }
+            break;
+
         default:
             MYODBCDbgReturn( SQL_INVALID_HANDLE );
     }

Modified: MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp
===================================================================
--- MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp	2006-05-28 04:02:32 UTC (rev 280)
+++ MYODBCDriver/MYODBCDriverLib/SQLGetFunctions.cpp	2006-05-28 16:04:54 UTC (rev 281)
@@ -15,10 +15,10 @@
 */
 SQLINTEGER MYODBCDrvSupportedFunctions[]=
 {
-    SQL_API_SQLALLOCCONNECT,
-    SQL_API_SQLALLOCENV,
+/*  SQL_API_SQLALLOCCONNECT,        */
+/*  SQL_API_SQLALLOCENV,            */
     SQL_API_SQLALLOCHANDLE,
-    SQL_API_SQLALLOCSTMT,
+/*  SQL_API_SQLALLOCSTMT,           */
 /*  SQL_API_SQLBINDCOL,             */
 /*  SQL_API_SQLBINDPARAM,           */
 /*  SQL_API_SQLCANCEL,              */

Modified: MYODBCDriver/MYODBCDriverLib/SQLGetInfoW.cpp
===================================================================
--- MYODBCDriver/MYODBCDriverLib/SQLGetInfoW.cpp	2006-05-28 04:02:32 UTC (rev 280)
+++ MYODBCDriver/MYODBCDriverLib/SQLGetInfoW.cpp	2006-05-28 16:04:54 UTC (rev 281)
@@ -8,6 +8,36 @@
 */
 #include "MYODBCDriverInternal.h"
 
+/*!
+    \brief  <B>ODBC 1.0 API</B>
+            <BR>
+            Returns general information about the driver and data
+            source associated with a connection.
+
+            We try to handle all v3 info types - even those which are
+            normally handled by the driver manager - because an app
+            may link to us directly.
+
+            We do not worry about info type issues with versions prior
+            to v3 as we are a v3 driver only. So if an app links
+            directly to us it must be ready to use a v3 driver. Apps
+            which use the driver manager may rely upon the driver 
+            managers ability to map calls (but preferrably be using
+            v3 api).
+
+    \param  hDbc                Viable connection handle.
+    \param  nInfoType           Type of information.
+    \param  pInfoValuePtr       Pointer to a buffer in which to return the information.
+    \param  nBufferLength       Size of pInfoValuePtr buffer.
+    \param  pnStringLengthPtr   Number of bytes available for pInfoValuePtr.
+
+    \return SQLRETURN
+
+    \retval SQL_SUCCESS             Request processed ok.
+    \retval SQL_SUCCESS_WITH_INFO   Request was probably processed ok - check diagnostic.
+    \retval SQL_ERROR               Request failed.
+    \retval SQL_INVALID_HANDLE      Invalid handle was provided.
+*/
 SQLRETURN SQL_API SQLGetInfoW( SQLHDBC       hDbc, 
                                SQLUSMALLINT  nInfoType,
                                SQLPOINTER    pInfoValue,

Modified: MYODBCShell/main.cpp
===================================================================
--- MYODBCShell/main.cpp	2006-05-28 04:02:32 UTC (rev 280)
+++ MYODBCShell/main.cpp	2006-05-28 16:04:54 UTC (rev 281)
@@ -72,13 +72,16 @@
 int main( int argc, char *argv[] )
 {
     QCoreApplication    app( argc, argv );
-    MYODBCShell         shell;
     QStringList         stringlistArguments = app.arguments();
 
-    pShell = &shell;
+    pShell = new MYODBCShell();
 
     if ( stringlistArguments.count() < 2 )
-        return doShowSyntax( shell.pstreamStdOut );
+    {
+        doShowSyntax( pShell->pstreamStdOut );
+        delete pShell;
+        exit( 1 );
+    }
 
     // extract args from command-line
     QStringList::const_iterator i;
@@ -90,64 +93,67 @@
             switch ( i->at( 1 ).toAscii() )
             {
                 case 'r':
-                    shell.setDriverConnect();
+                    pShell->setDriverConnect();
                     break;
                 case 'b':
                     bBatch = true;
                     break;
                 case 'd':
-                    shell.setDelimiter( i->at( 2 ) );
-                    shell.setResultFormat( MYODBCShell::RESULT_FORMAT_DELIMITED );
+                    pShell->setDelimiter( i->at( 2 ) );
+                    pShell->setResultFormat( MYODBCShell::RESULT_FORMAT_DELIMITED );
                     break;
                 case 'w':
-                    shell.setResultFormat( MYODBCShell::RESULT_FORMAT_HTML );
+                    pShell->setResultFormat( MYODBCShell::RESULT_FORMAT_HTML );
                     break;
                 case 'c':
-                    shell.setLabels( false );
+                    pShell->setLabels( false );
                     break;
                 case 'm':
-                    shell.setMaxDataWidth( i->mid( 2 ).toInt() );
+                    pShell->setMaxDataWidth( i->mid( 2 ).toInt() );
                     break;
                 case 'v':
-                    shell.setVerbose( false );
+                    pShell->setVerbose( false );
                     break;
                 default:
-                    *shell.pstreamStdOut << "[ERROR] Invalid switch " <<
i->at( 1 ) << endl;
+                    *pShell->pstreamStdOut << "[ERROR] Invalid switch " <<
i->at( 1 ) << endl;
                     return 1;
             }
         }
         else
         {
-            if ( shell.getConnect().isNull() )
-                shell.setConnect( *i );
-            else if ( shell.getUID().isNull() )
-                shell.setUID( *i );
-            else if ( shell.getPWD().isNull() )
-                shell.setPWD( *i );
+            if ( pShell->getConnect().isNull() )
+                pShell->setConnect( *i );
+            else if ( pShell->getUID().isNull() )
+                pShell->setUID( *i );
+            else if ( pShell->getPWD().isNull() )
+                pShell->setPWD( *i );
             else
-                *shell.pstreamStdOut << "[ERROR] Invalid/extra arg " << *i
<< endl;
+                *pShell->pstreamStdOut << "[ERROR] Invalid/extra arg " <<
*i << endl;
         }
     }
 
     // start processing stdin
-    if ( !shell.doConnect() )
+    if ( !pShell->doConnect() )
+    {
+        delete pShell;
         exit( 1 );
+    }
 
     if ( !bBatch )
     {
-        *shell.pstreamStdOut << "+----" << endl;
-        *shell.pstreamStdOut << "| Connected!" << endl;
-        *shell.pstreamStdOut << "|" << endl;
-        *shell.pstreamStdOut << "| sql-statement" << endl;
-        *shell.pstreamStdOut << "| help [table_name]" << endl;
-        *shell.pstreamStdOut << "| SQLTables catalog|schema|table|table_type"
<< endl;
-        *shell.pstreamStdOut << "| SQLColumns catalog|schema|table|column" <<
endl;
-        *shell.pstreamStdOut << "| quit" << endl;
-        *shell.pstreamStdOut << "|" << endl;
-        *shell.pstreamStdOut << "| NOTE: Blank line causes buffered text" <<
endl;
-        *shell.pstreamStdOut << "|       to be processed." << endl;
-        *shell.pstreamStdOut << "|" << endl;
-        *shell.pstreamStdOut << "+---" << endl;
+        *pShell->pstreamStdOut << "+----" << endl;
+        *pShell->pstreamStdOut << "| Connected!" << endl;
+        *pShell->pstreamStdOut << "|" << endl;
+        *pShell->pstreamStdOut << "| sql-statement" << endl;
+        *pShell->pstreamStdOut << "| help [table_name]" << endl;
+        *pShell->pstreamStdOut << "| SQLTables catalog|schema|table|table_type"
<< endl;
+        *pShell->pstreamStdOut << "| SQLColumns catalog|schema|table|column"
<< endl;
+        *pShell->pstreamStdOut << "| quit" << endl;
+        *pShell->pstreamStdOut << "|" << endl;
+        *pShell->pstreamStdOut << "| NOTE: Blank line causes buffered text"
<< endl;
+        *pShell->pstreamStdOut << "|       to be processed." << endl;
+        *pShell->pstreamStdOut << "|" << endl;
+        *pShell->pstreamStdOut << "+---" << endl;
     }
 
     QString stringLine;
@@ -157,19 +163,19 @@
     {
         if ( !bBatch )
         {
-            *shell.pstreamStdOut << "MYODBCShell> ";
-            shell.pstreamStdOut->flush();
+            *pShell->pstreamStdOut << "MYODBCShell> ";
+            pShell->pstreamStdOut->flush();
         }
 
-        if ( bBatch && shell.pstreamStdIn->atEnd() )
+        if ( bBatch && pShell->pstreamStdIn->atEnd() )
             break;
 
-        stringLine = shell.pstreamStdIn->readLine();
+        stringLine = pShell->pstreamStdIn->readLine();
 
         if ( stringLine.isEmpty() )
         {
             if ( !stringCommand.isEmpty() )
-                shell.doCommand( stringCommand );
+                pShell->doCommand( stringCommand );
             stringCommand = QString::null;
         }
         else if ( stringLine == "quit" )
@@ -183,7 +189,8 @@
 
     } while ( 1 );
 
-    shell.doDisconnect();
+    pShell->doDisconnect();
+    delete pShell;
 
     exit( 0 );
 }

Modified: MYSQLPlus/MYSQLPlusLib/MConnection.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MConnection.cpp	2006-05-28 04:02:32 UTC (rev 280)
+++ MYSQLPlus/MYSQLPlusLib/MConnection.cpp	2006-05-28 16:04:54 UTC (rev 281)
@@ -459,7 +459,998 @@
     */
     pDiagnostic->doClear();
 
-    MYODBCDbgReturn( SQL_ERROR );
+    MYODBC_DRV_DBC_PTR  pDbc = (MYODBC_DRV_DBC_PTR)hDbc;
+    /* cast here to make code below a little cleaner */
+    SQLUSMALLINT *      pnSQLUSMALLINT  = (SQLUSMALLINT *)pInfoValuePtr;
+    SQLUINTEGER *       pnSQLUINTEGER   = (SQLUINTEGER *)pInfoValuePtr;
+    SQLCHAR *           pszSQLCHAR      = (SQLCHAR *)pInfoValuePtr;
+    SQLSMALLINT *       pnSQLSMALLINT   = pnStringLengthPtr;
+    /* pnStringLengthPtr is optional so provide dummy to make code below a little cleaner
*/
+    SQLSMALLINT         nStringLength;
+    SQLSMALLINT *       pnStringLength  = pnStringLengthPtr;
+
+    MYODBCDbgEnter( "SQLGetInfo" );
+#if MYODBC_DBG > 1
+    MYODBCDbgPrint2( "\thDbc=%p\n", hDbc );
+    MYODBCDbgPrint2( "\tnInfoType=%d", nInfoType );
+    MYODBCDbgPrint2( " %s\n", MYODBCDbgInfoTypeString( nInfoType ) );
+    MYODBCDbgPrint2( "\tpInfoValuePtr=%p\n", pInfoValuePtr );
+    MYODBCDbgPrint2( "\tnBufferLength=%d\n", nBufferLength );
+    MYODBCDbgPrint2( "\tpnStringLengthPtr=%p\n", pnStringLengthPtr );
+#endif
+
+#if MYODBC_DEV > 0
+    /* sanity check on args as we are an entry point */
+    if ( !hDbc )
+        MYODBCDbgReturn( SQL_INVALID_HANDLE );
+    if ( MYODBCRttiType( hDbc ) != MYODBC_RTTI_DBC )
+        MYODBCDbgReturn( SQL_INVALID_HANDLE );
+#endif
+
+    /* delete any pending messages for handle */
+    MYODBCDiaClear( pDbc->hDia );
+
+    /*!
+        \internal ODBC Rule
+
+        (DM) The value specified for argument BufferLength was less than 0. 
+    */
+    if ( nBufferLength < 0 )
+        MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HY090, 0, NULL ) );
+
+    /*!
+        \internal MYODBC Rule
+
+        We DO NOT consider pInfoValuePtr to be optional.
+    */
+    if ( !pInfoValuePtr )
+        MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HY000, 0, NULL ) );
+
+    /*!
+        \internal MYODBC Rule
+
+        The following ODBC Rule makes pnStringLengthPtr optional.
+    */
+    /*!
+        \internal ODBC Rule
+
+        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.
+    */
+    if ( !pnStringLengthPtr )
+        pnStringLength = &nStringLength;
+
+    /*!
+        \internal ODBC Rule
+
+        (DM) 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.
+    */
+    if ( pDbc->nState < MYODBC_DRV_STATE_C4 && (nInfoType != SQL_ODBC_VER
&& nInfoType != SQL_DRIVER_ODBC_VER) )
+        MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_08003, 0, NULL ) );
+
+    /*!
+        \todo
+
+        Much the values returned here are copied from the 3.51 driver with only a quick
check to
+        see that they still make sense. So this function needs to be reviewed to ensure
that it
+        is fully up-to-date. The large number of info-types to be handled has dictated
that this
+        be done in more than one pass/effort.
+    */
+    /*!
+        \todo
+
+        Some of the values in here are dependent upon the version of the server we are
using
+        and possibly the client library. This needs to be handled.
+    */
+    /*!
+        \todo
+
+        Some of the values in here are conservative in the exposure of features in the
driver as
+        some features are not complete enough to be used. Subsequently; this function
will need 
+        to be revisited as features are added/completed.
+    */
+    /* ALPHA ordered list of posssible info types */
+    switch ( nInfoType )
+    {
+        case 30002:
+            break;
+        case SQL_ACCESSIBLE_PROCEDURES:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_ACCESSIBLE_TABLES:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_ACTIVE_ENVIRONMENTS:
+            *pnSQLUSMALLINT = 0;
+            break;
+        case SQL_AGGREGATE_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_AF_ALL | 
+                               SQL_AF_AVG | 
+                               SQL_AF_COUNT | 
+                               SQL_AF_DISTINCT | 
+                               SQL_AF_MAX | 
+                               SQL_AF_MIN | 
+                               SQL_AF_SUM);
+            break;
+        case SQL_ALTER_DOMAIN:
+            *pnSQLUINTEGER  = 0;
+            break;
+        case SQL_ALTER_TABLE:
+            *pnSQLUINTEGER  = (SQL_AT_ADD_COLUMN |
+                               SQL_AT_DROP_COLUMN |
+                               SQL_AT_ADD_COLUMN_COLLATION | 
+                               SQL_AT_ADD_COLUMN_DEFAULT | 
+                               SQL_AT_ADD_CONSTRAINT |
+                               SQL_AT_ADD_TABLE_CONSTRAINT |
+                               SQL_AT_CONSTRAINT_NAME_DEFINITION |
+                               SQL_AT_SET_COLUMN_DEFAULT);
+            break;
+        case SQL_ASYNC_MODE:
+            *pnSQLUINTEGER  = SQL_AM_NONE;
+            break;
+        case SQL_BATCH_ROW_COUNT:
+            *pnSQLUINTEGER  = SQL_BRC_EXPLICIT;
+            break;
+        case SQL_BATCH_SUPPORT:
+            *pnSQLUINTEGER  = SQL_BS_ROW_COUNT_EXPLICIT;
+            break;
+        case SQL_BOOKMARK_PERSISTENCE:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CATALOG_LOCATION:
+            *pnSQLUSMALLINT = SQL_CL_START;
+            break;
+        case SQL_CATALOG_NAME:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_CATALOG_NAME_SEPARATOR:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, ".",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_CATALOG_TERM:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "database",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_CATALOG_USAGE:
+            *pnSQLUINTEGER  = (SQL_CU_DML_STATEMENTS |
+                               SQL_CU_PROCEDURE_INVOCATION |
+                               SQL_CU_TABLE_DEFINITION |
+                               SQL_CU_INDEX_DEFINITION |
+                               SQL_CU_PRIVILEGE_DEFINITION);
+            break;
+        case SQL_COLLATION_SEQ:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_COLUMN_ALIAS:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_CONCAT_NULL_BEHAVIOR:
+            *pnSQLUSMALLINT = SQL_CB_NULL;
+            break;
+        case SQL_CONVERT_BIGINT:
+            *pnSQLUINTEGER  =  (SQL_CVT_CHAR | 
+                                SQL_CVT_NUMERIC |
+                                SQL_CVT_DECIMAL | 
+                                SQL_CVT_INTEGER |
+                                SQL_CVT_SMALLINT | 
+                                SQL_CVT_FLOAT |
+                                SQL_CVT_REAL | 
+                                SQL_CVT_DOUBLE |
+                                SQL_CVT_VARCHAR | 
+                                SQL_CVT_LONGVARCHAR |
+                                SQL_CVT_BIT | 
+                                SQL_CVT_TINYINT |
+                                SQL_CVT_BIGINT | 
+                                SQL_CVT_DATE |
+                                SQL_CVT_TIME | 
+                                SQL_CVT_TIMESTAMP);
+            break;
+        case SQL_CONVERT_BINARY:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CONVERT_BIT:
+        case SQL_CONVERT_CHAR:
+            *pnSQLUINTEGER  =  (SQL_CVT_CHAR | 
+                                SQL_CVT_NUMERIC |
+                                SQL_CVT_DECIMAL | 
+                                SQL_CVT_INTEGER |
+                                SQL_CVT_SMALLINT | 
+                                SQL_CVT_FLOAT |
+                                SQL_CVT_REAL | 
+                                SQL_CVT_DOUBLE |
+                                SQL_CVT_VARCHAR | 
+                                SQL_CVT_LONGVARCHAR |
+                                SQL_CVT_BIT | 
+                                SQL_CVT_TINYINT |
+                                SQL_CVT_BIGINT | 
+                                SQL_CVT_DATE |
+                                SQL_CVT_TIME | 
+                                SQL_CVT_TIMESTAMP);
+            break;
+#ifdef SQL_CONVERT_GUID
+        case SQL_CONVERT_GUID:
+            *pnSQLUINTEGER  = 0L;
+            break;
+#endif
+        case SQL_CONVERT_DATE:
+        case SQL_CONVERT_DECIMAL:
+        case SQL_CONVERT_DOUBLE:
+        case SQL_CONVERT_FLOAT:
+        case SQL_CONVERT_INTEGER:
+            *pnSQLUINTEGER  =  (SQL_CVT_CHAR | 
+                                SQL_CVT_NUMERIC |
+                                SQL_CVT_DECIMAL | 
+                                SQL_CVT_INTEGER |
+                                SQL_CVT_SMALLINT | 
+                                SQL_CVT_FLOAT |
+                                SQL_CVT_REAL | 
+                                SQL_CVT_DOUBLE |
+                                SQL_CVT_VARCHAR | 
+                                SQL_CVT_LONGVARCHAR |
+                                SQL_CVT_BIT | 
+                                SQL_CVT_TINYINT |
+                                SQL_CVT_BIGINT | 
+                                SQL_CVT_DATE |
+                                SQL_CVT_TIME | 
+                                SQL_CVT_TIMESTAMP);
+            break;
+        case SQL_CONVERT_INTERVAL_YEAR_MONTH:
+        case SQL_CONVERT_INTERVAL_DAY_TIME:
+        case SQL_CONVERT_LONGVARBINARY:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CONVERT_LONGVARCHAR:
+        case SQL_CONVERT_NUMERIC:
+        case SQL_CONVERT_REAL:
+        case SQL_CONVERT_SMALLINT:
+        case SQL_CONVERT_TIME:
+        case SQL_CONVERT_TIMESTAMP:
+        case SQL_CONVERT_TINYINT:
+            *pnSQLUINTEGER  =  (SQL_CVT_CHAR | 
+                                SQL_CVT_NUMERIC |
+                                SQL_CVT_DECIMAL | 
+                                SQL_CVT_INTEGER |
+                                SQL_CVT_SMALLINT | 
+                                SQL_CVT_FLOAT |
+                                SQL_CVT_REAL | 
+                                SQL_CVT_DOUBLE |
+                                SQL_CVT_VARCHAR | 
+                                SQL_CVT_LONGVARCHAR |
+                                SQL_CVT_BIT | 
+                                SQL_CVT_TINYINT |
+                                SQL_CVT_BIGINT | 
+                                SQL_CVT_DATE |
+                                SQL_CVT_TIME | 
+                                SQL_CVT_TIMESTAMP);
+            break;
+        case SQL_CONVERT_VARBINARY:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CONVERT_VARCHAR:
+            *pnSQLUINTEGER  =  (SQL_CVT_CHAR | 
+                                SQL_CVT_NUMERIC |
+                                SQL_CVT_DECIMAL | 
+                                SQL_CVT_INTEGER |
+                                SQL_CVT_SMALLINT | 
+                                SQL_CVT_FLOAT |
+                                SQL_CVT_REAL | 
+                                SQL_CVT_DOUBLE |
+                                SQL_CVT_VARCHAR | 
+                                SQL_CVT_LONGVARCHAR |
+                                SQL_CVT_BIT | 
+                                SQL_CVT_TINYINT |
+                                SQL_CVT_BIGINT | 
+                                SQL_CVT_DATE |
+                                SQL_CVT_TIME | 
+                                SQL_CVT_TIMESTAMP);
+            break;
+        case SQL_CONVERT_FUNCTIONS:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CORRELATION_NAME:
+            *pnSQLUSMALLINT = SQL_CN_DIFFERENT;
+            break;
+        case SQL_CREATE_ASSERTION:
+        case SQL_CREATE_CHARACTER_SET:
+        case SQL_CREATE_COLLATION:
+        case SQL_CREATE_DOMAIN:
+        case SQL_CREATE_SCHEMA:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CREATE_TABLE:
+            *pnSQLUINTEGER  = (SQL_CT_CREATE_TABLE |
+                               SQL_CT_TABLE_CONSTRAINT |
+                               SQL_CT_CONSTRAINT_NAME_DEFINITION |
+                               SQL_CT_COMMIT_DELETE |
+                               SQL_CT_LOCAL_TEMPORARY |
+                               SQL_CT_COLUMN_CONSTRAINT |
+                               SQL_CT_COLUMN_DEFAULT |
+                               SQL_CT_COLUMN_COLLATION);
+            break;
+        case SQL_CREATE_TRANSLATION:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_CREATE_VIEW:
+            *pnSQLUINTEGER  = SQL_CV_CREATE_VIEW;
+            break;
+        case SQL_CURSOR_COMMIT_BEHAVIOR:
+        case SQL_CURSOR_ROLLBACK_BEHAVIOR:
+            *pnSQLUSMALLINT = SQL_CB_PRESERVE;
+            break;
+        case SQL_CURSOR_SENSITIVITY:
+            *pnSQLUINTEGER  = SQL_UNSPECIFIED;
+            break;
+        case SQL_DATA_SOURCE_NAME:
+            if ( pDbc->pszDataSourceName )
+            {
+                if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength,
pDbc->pszDataSourceName, (SQLINTEGER*)pnStringLength ) )
+                    MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            }
+            else
+            {
+                if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "",
(SQLINTEGER*)pnStringLength ) )
+                    MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            }
+            break;
+        case SQL_DATA_SOURCE_READ_ONLY:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "N",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DATABASE_NAME:
+            {
+                /*!
+                    \internal ODBC Rule
+
+                    A character string with the name of the current database in use, if
the data source defines 
+                    a named object called "database".
+                    ... also SQL_ATTR_CURRENT_CATALOG.
+                */
+                /*!
+                    \internal MYODBC Rule
+
+                    We account for the fact that the cached current catalog name may be
inaccurate due
+                    to the possible use of "USE DATABASE". So this may not be the value
of 'database' from
+                    a DSN.
+                */
+                /* update the cached value for the current catalog */
+                SQLRETURN nReturn = MYODBCDrvGetCatalog( pDbc );
+                if ( !SQL_SUCCEEDED(nReturn) )
+                    return nReturn;
+                /* return the current catalog */
+                if ( pDbc->attr_current_catalog )
+                {
+                    if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength,
pDbc->attr_current_catalog, (SQLINTEGER*)pnStringLength ) )
+                        MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia,
MYODBC_DIA_01004, 0, NULL ) );
+                }
+                else
+                {
+                    if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "",
(SQLINTEGER*)pnStringLength ) )
+                        MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia,
MYODBC_DIA_01004, 0, NULL ) );
+                }
+            }
+            break;
+        case SQL_DATETIME_LITERALS:
+            *pnSQLUINTEGER  = (SQL_DL_SQL92_DATE |
+                               SQL_DL_SQL92_TIME |
+                               SQL_DL_SQL92_TIMESTAMP);
+            break;
+        case SQL_DBMS_NAME:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "MySQL",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DBMS_VER:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength,
pDbc->pMySQL->server_version, (SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DDL_INDEX:
+            *pnSQLUINTEGER  = (SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX);
+            break;
+        case SQL_DEFAULT_TXN_ISOLATION:
+            *pnSQLUINTEGER  = SQL_TXN_READ_COMMITTED;
+            break;
+        case SQL_DESCRIBE_PARAMETER:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "N",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DM_VER:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly. I suppose that someone could even use us as a replacement
for 
+                a DM (say on a lean machine). So lets fake it. Applications mileage may
vary.
+            */
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, (SQL_SPEC_STRING
".0000.0000"), (SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DRIVER_HDBC:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            *pnSQLUINTEGER  = (SQLUINTEGER)pDbc;
+            break;
+        case SQL_DRIVER_HENV:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            *pnSQLUINTEGER  = (SQLUINTEGER)pDbc->pEnv;
+            break;
+        case SQL_DRIVER_HDESC:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            /*!
+                \internal ODBC Rule
+
+                (DM) The InfoType argument was SQL_DRIVER_HDESC, and the value pointed to
by 
+                InfoValuePtr was not a valid descriptor handle.
+            */
+            if ( !pInfoValuePtr || MYODBCRttiType( pInfoValuePtr ) != MYODBC_RTTI_DES )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HY024, 0,
NULL ) );
+            *pnSQLUINTEGER  = (SQLUINTEGER)pInfoValuePtr;
+            break;
+        case SQL_DRIVER_HLIB:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            /*!
+                \todo
+
+                We can get this (see dll.c in 3.51 driver).
+            */
+            MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HYC00, 0, NULL )
);
+            break;
+        case SQL_DRIVER_HSTMT:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            /*!
+                \internal ODBC Rule
+
+                (DM) The InfoType argument was SQL_DRIVER_HSTMT, and the value pointed to
by 
+                InfoValuePtr was not a valid statement handle.
+            */
+            if ( !pInfoValuePtr || MYODBCRttiType( pInfoValuePtr ) != MYODBC_RTTI_STM )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HY024, 0,
NULL ) );
+            *pnSQLUINTEGER  = (SQLUINTEGER)pInfoValuePtr;
+            break;
+        case SQL_DRIVER_NAME:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, MYODBC_DRIVER_NAME,
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DRIVER_ODBC_VER:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength,
MYODBC_DRIVER_ODBC_VER, (SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DRIVER_VER:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, MYODBC_DRIVER_VER,
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_DROP_ASSERTION:
+        case SQL_DROP_CHARACTER_SET:
+        case SQL_DROP_COLLATION:
+        case SQL_DROP_DOMAIN:
+        case SQL_DROP_SCHEMA:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_DROP_TABLE:
+            *pnSQLUINTEGER  = (SQL_DT_DROP_TABLE |
+                               SQL_DT_CASCADE |
+                               SQL_DT_RESTRICT);
+            break;
+        case SQL_DROP_TRANSLATION:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_DROP_VIEW:
+            *pnSQLUINTEGER  = SQL_DT_DROP_TABLE;
+            break;
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
+            *pnSQLUINTEGER  = (SQL_CA1_NEXT |
+                               SQL_CA1_ABSOLUTE |
+                               SQL_CA1_RELATIVE |
+                               SQL_CA1_LOCK_NO_CHANGE |
+                               SQL_CA1_POS_POSITION |
+                               SQL_CA1_POS_UPDATE |
+                               SQL_CA1_POS_DELETE |
+                               SQL_CA1_POS_REFRESH |
+                               SQL_CA1_POSITIONED_UPDATE |
+                               SQL_CA1_POSITIONED_DELETE |
+                               SQL_CA1_BULK_ADD);
+            break;
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
+            *pnSQLUINTEGER  =	(SQL_CA2_SENSITIVITY_ADDITIONS |
+                                 SQL_CA2_SENSITIVITY_DELETIONS |
+                                 SQL_CA2_SENSITIVITY_UPDATES |
+                                 SQL_CA2_MAX_ROWS_SELECT |
+                                 SQL_CA2_MAX_ROWS_INSERT |
+                                 SQL_CA2_MAX_ROWS_DELETE |
+                                 SQL_CA2_MAX_ROWS_UPDATE |
+                                 SQL_CA2_CRC_EXACT |
+                                 SQL_CA2_SIMULATE_TRY_UNIQUE);
+            break;
+        case SQL_EXPRESSIONS_IN_ORDERBY:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "Y",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_FETCH_DIRECTION: /* for compat. with 2.x */
+            *pnSQLUINTEGER = (SQL_FD_FETCH_NEXT | 
+                              SQL_FD_FETCH_FIRST |
+                              SQL_FD_FETCH_LAST | 
+                              SQL_FD_FETCH_PRIOR |
+                              SQL_FD_FETCH_ABSOLUTE | 
+                              SQL_FD_FETCH_RELATIVE);
+            break;
+        case SQL_FILE_USAGE:
+            *pnSQLUSMALLINT = SQL_FILE_NOT_SUPPORTED;
+            break;
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
+            *pnSQLUINTEGER  = (SQL_CA1_NEXT |
+                               SQL_CA1_ABSOLUTE |
+                               SQL_CA1_RELATIVE |
+                               SQL_CA1_LOCK_NO_CHANGE |
+                               SQL_CA1_POS_POSITION |
+                               SQL_CA1_POS_UPDATE |
+                               SQL_CA1_POS_DELETE |
+                               SQL_CA1_POS_REFRESH |
+                               SQL_CA1_POSITIONED_UPDATE |
+                               SQL_CA1_POSITIONED_DELETE |
+                               SQL_CA1_BULK_ADD);
+            break;
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
+            *pnSQLUINTEGER  =  (SQL_CA2_MAX_ROWS_SELECT |
+                                SQL_CA2_MAX_ROWS_INSERT |
+                                SQL_CA2_MAX_ROWS_DELETE |
+                                SQL_CA2_MAX_ROWS_UPDATE |
+                                SQL_CA2_CRC_EXACT);
+            break;
+        case SQL_GETDATA_EXTENSIONS:
+            *pnSQLUINTEGER  = (SQL_GD_ANY_COLUMN |
+                               SQL_GD_ANY_ORDER |
+                               SQL_GD_BOUND);
+            break;
+        case SQL_GROUP_BY:
+            *pnSQLUSMALLINT = SQL_GB_NO_RELATION;
+            break;
+        case SQL_IDENTIFIER_CASE:
+            *pnSQLUSMALLINT = SQL_IC_MIXED;
+            break;
+        case SQL_IDENTIFIER_QUOTE_CHAR:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "`",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_INDEX_KEYWORDS:
+            *pnSQLUINTEGER  = SQL_IK_NONE;
+            break;
+        case SQL_INFO_SCHEMA_VIEWS:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_INSERT_STATEMENT:
+            *pnSQLUINTEGER  = (SQL_IS_INSERT_LITERALS |
+                               SQL_IS_INSERT_SEARCHED |
+                               SQL_IS_SELECT_INTO);
+            break;
+        case SQL_INTEGRITY:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "N",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_KEYSET_CURSOR_ATTRIBUTES1:
+        case SQL_KEYSET_CURSOR_ATTRIBUTES2:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_KEYWORDS:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, MYODBC_DRV_KEYWORDS,
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_LIKE_ESCAPE_CLAUSE:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "Y",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_LOCK_TYPES: /* for compat with 2.x */
+        case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
+        case SQL_MAX_BINARY_LITERAL_LEN:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_MAX_CATALOG_NAME_LEN:
+            *pnSQLUSMALLINT  = NAME_LEN;
+            break;
+        case SQL_MAX_CHAR_LITERAL_LEN:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_MAX_COLUMN_NAME_LEN:
+            *pnSQLUSMALLINT = NAME_LEN;
+            break;
+        case SQL_MAX_COLUMNS_IN_GROUP_BY:
+            *pnSQLUSMALLINT = 0L;
+            break;
+        case SQL_MAX_COLUMNS_IN_INDEX:
+            *pnSQLUSMALLINT = 32;
+            break;
+        case SQL_MAX_COLUMNS_IN_ORDER_BY:
+        case SQL_MAX_COLUMNS_IN_SELECT:
+        case SQL_MAX_COLUMNS_IN_TABLE:
+        case SQL_MAX_CONCURRENT_ACTIVITIES:
+        case SQL_MAX_CURSOR_NAME_LEN:
+            *pnSQLUSMALLINT = 0L;
+            break;
+        case SQL_MAX_DRIVER_CONNECTIONS:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_MAX_IDENTIFIER_LEN:
+            *pnSQLUSMALLINT = NAME_LEN;
+            break;
+        case SQL_MAX_INDEX_SIZE:
+            *pnSQLUINTEGER  = 500;
+            break;
+        case SQL_MAX_PROCEDURE_NAME_LEN:
+            *pnSQLUSMALLINT = NAME_LEN;
+            break;
+        case SQL_MAX_ROW_SIZE:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "Y",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_MAX_SCHEMA_NAME_LEN:
+            *pnSQLUSMALLINT = NAME_LEN;
+            break;
+        case SQL_MAX_STATEMENT_LEN:
+            *pnSQLUINTEGER  = net_buffer_length;
+            break;
+        case SQL_MAX_TABLE_NAME_LEN:
+            *pnSQLUSMALLINT = NAME_LEN;
+            break;
+        case SQL_MAX_TABLES_IN_SELECT:
+            *pnSQLUSMALLINT = 31;
+            break;
+        case SQL_MAX_USER_NAME_LEN:
+            *pnSQLUSMALLINT = 16;
+            break;
+        case SQL_MULT_RESULT_SETS:
+        case SQL_MULTIPLE_ACTIVE_TXN:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "Y",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_NEED_LONG_DATA_LEN:
+            if ( !MYODBCCStrCopyOut( pInfoValuePtr, nBufferLength, "N",
(SQLINTEGER*)pnStringLengthPtr ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_NON_NULLABLE_COLUMNS:
+            *pnSQLUSMALLINT = SQL_NNC_NON_NULL;
+            break;
+        case SQL_NULL_COLLATION:
+            *pnSQLUSMALLINT = SQL_NC_START;
+            break;
+        case SQL_NUMERIC_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_FN_NUM_ABS | 
+                               SQL_FN_NUM_ACOS | 
+                               SQL_FN_NUM_ASIN | 
+                               SQL_FN_NUM_ATAN |
+                               SQL_FN_NUM_ATAN2 | 
+                               SQL_FN_NUM_CEILING | 
+                               SQL_FN_NUM_COS |
+                               SQL_FN_NUM_COT | 
+                               SQL_FN_NUM_EXP | 
+                               SQL_FN_NUM_FLOOR | 
+                               SQL_FN_NUM_LOG |
+                               SQL_FN_NUM_MOD | 
+                               SQL_FN_NUM_SIGN | 
+                               SQL_FN_NUM_SIN | 
+                               SQL_FN_NUM_SQRT |
+                               SQL_FN_NUM_TAN | 
+                               SQL_FN_NUM_PI | 
+                               SQL_FN_NUM_RAND |
+                               SQL_FN_NUM_DEGREES | 
+                               SQL_FN_NUM_LOG10 | 
+                               SQL_FN_NUM_POWER |
+                               SQL_FN_NUM_RADIANS | 
+                               SQL_FN_NUM_ROUND | 
+                               SQL_FN_NUM_TRUNCATE);
+            break;
+        case SQL_ODBC_API_CONFORMANCE: /* for compat with 2.x */
+            *pnSQLUSMALLINT  = SQL_OAC_LEVEL1;
+            break;
+        case SQL_ODBC_INTERFACE_CONFORMANCE:
+            *pnSQLUINTEGER  = SQL_OIC_LEVEL1;
+            break;
+        case SQL_ODBC_SQL_CONFORMANCE: /* for compat with 2.x */
+            *pnSQLSMALLINT  = SQL_OSC_CORE;
+            break;
+        case SQL_ODBC_VER:
+            /*!
+                \internal MYODBC Rule
+
+                We are not, of course, a Driver Manager. However; applications may link
to
+                us directly so lets handle this.
+            */
+            /*!
+                \internal ODBC Rule
+
+                A character string with the version of ODBC to which the Driver Manager 
+                conforms. The version is of the form ##.##.0000, where the first two
digits 
+                are the major version and the next two digits are the minor version. This

+                is implemented solely in the Driver Manager.            
+            */
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, (SQL_SPEC_STRING
".0000"), (SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_OJ_CAPABILITIES:
+            *pnSQLUINTEGER  = (SQL_OJ_LEFT | 
+                               SQL_OJ_NESTED |
+                               SQL_OJ_NOT_ORDERED |
+                               SQL_OJ_INNER | 
+                               SQL_OJ_ALL_COMPARISON_OPS |
+                               SQL_OJ_RIGHT);
+            break;
+        case SQL_ORDER_BY_COLUMNS_IN_SELECT:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_PARAM_ARRAY_ROW_COUNTS:
+            *pnSQLUINTEGER  = SQL_PARC_NO_BATCH;
+            break;
+        case SQL_PARAM_ARRAY_SELECTS:
+            *pnSQLUINTEGER  = SQL_PAS_NO_SELECT;
+            break;
+        case SQL_PROCEDURE_TERM:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "procedure",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_PROCEDURES:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "Y",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_POS_OPERATIONS:
+            *pnSQLUINTEGER   = (SQL_POS_POSITION |
+                               SQL_POS_UPDATE  |
+                               SQL_POS_DELETE |
+                               SQL_POS_ADD |
+                               SQL_POS_REFRESH);
+            break;
+        case SQL_POSITIONED_STATEMENTS: /* for compat with 2.x */
+            *pnSQLUINTEGER  = (SQL_PS_POSITIONED_DELETE |
+                               SQL_PS_POSITIONED_UPDATE);
+            break;
+        case SQL_QUOTED_IDENTIFIER_CASE:
+            *pnSQLUSMALLINT = SQL_IC_SENSITIVE;
+            break;
+        case SQL_ROW_UPDATES:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "N",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_SCHEMA_TERM:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "schema",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_SCHEMA_USAGE:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_SCROLL_CONCURRENCY: /* for compat with 2.x */
+            *pnSQLUINTEGER  = (SQL_SS_ADDITIONS |
+                               SQL_SS_DELETIONS |
+                               SQL_SS_UPDATES);
+            break;
+        case SQL_SCROLL_OPTIONS:
+            *pnSQLUINTEGER  = (SQL_SO_FORWARD_ONLY | 
+                               SQL_SO_STATIC |
+                               SQL_SO_DYNAMIC);
+            break;
+        case SQL_SEARCH_PATTERN_ESCAPE:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "\\",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_SERVER_NAME:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength,
pDbc->pMySQL->host_info, (SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_SPECIAL_CHARACTERS:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, MYODBC_DRV_VALID_CHARS,
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_SQL_CONFORMANCE:
+            *pnSQLUINTEGER  = SQL_SC_SQL92_INTERMEDIATE;
+            break;
+        case SQL_SQL92_DATETIME_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_SDF_CURRENT_DATE |
+                               SQL_SDF_CURRENT_TIME |
+                               SQL_SDF_CURRENT_TIMESTAMP);
+            break;
+        case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
+        case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_SQL92_GRANT:
+            *pnSQLUINTEGER  = (SQL_SG_DELETE_TABLE |
+                               SQL_SG_INSERT_COLUMN |
+                               SQL_SG_INSERT_TABLE |
+                               SQL_SG_REFERENCES_TABLE |
+                               SQL_SG_REFERENCES_COLUMN |
+                               SQL_SG_SELECT_TABLE |
+                               SQL_SG_UPDATE_COLUMN |
+                               SQL_SG_UPDATE_TABLE);
+            break;
+        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
+        case SQL_SQL92_PREDICATES:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
+            *pnSQLUINTEGER  = (SQL_SRJO_CROSS_JOIN |
+                               SQL_SRJO_INNER_JOIN  |
+                               SQL_SRJO_LEFT_OUTER_JOIN |
+                               SQL_SRJO_NATURAL_JOIN |
+                               SQL_SRJO_RIGHT_OUTER_JOIN);
+            break;
+        case SQL_SQL92_REVOKE:
+            *pnSQLUINTEGER  = (SQL_SR_DELETE_TABLE |
+                               SQL_SR_INSERT_COLUMN |
+                               SQL_SR_INSERT_TABLE |
+                               SQL_SR_REFERENCES_TABLE |
+                               SQL_SR_REFERENCES_COLUMN |
+                               SQL_SR_SELECT_TABLE |
+                               SQL_SR_UPDATE_COLUMN |
+                               SQL_SR_UPDATE_TABLE);
+            break;
+        case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
+            *pnSQLUINTEGER  = (SQL_SRVC_VALUE_EXPRESSION |
+                               SQL_SRVC_NULL |
+                               SQL_SRVC_DEFAULT);
+            break;
+        case SQL_SQL92_STRING_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_SSF_CONVERT |
+                               SQL_SSF_LOWER |
+                               SQL_SSF_UPPER |
+                               SQL_SSF_SUBSTRING |
+                               SQL_SSF_TRANSLATE |
+                               SQL_SSF_TRIM_BOTH |
+                               SQL_SSF_TRIM_LEADING |
+                               SQL_SSF_TRIM_TRAILING);
+            break;
+        case SQL_SQL92_VALUE_EXPRESSIONS:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_STANDARD_CLI_CONFORMANCE:
+            *pnSQLUINTEGER  = SQL_SCC_ISO92_CLI;
+            break;
+        case SQL_STATIC_CURSOR_ATTRIBUTES1:
+            *pnSQLUINTEGER  = (SQL_CA1_NEXT |
+                               SQL_CA1_ABSOLUTE |
+                               SQL_CA1_RELATIVE |
+                               SQL_CA1_LOCK_NO_CHANGE |
+                               SQL_CA1_POS_POSITION |
+                               SQL_CA1_POS_UPDATE |
+                               SQL_CA1_POS_DELETE |
+                               SQL_CA1_POS_REFRESH |
+                               SQL_CA1_POSITIONED_UPDATE |
+                               SQL_CA1_POSITIONED_DELETE |
+                               SQL_CA1_BULK_ADD);
+            break;
+        case SQL_STATIC_CURSOR_ATTRIBUTES2:
+            *pnSQLUINTEGER  =  (SQL_CA2_MAX_ROWS_SELECT |
+                                SQL_CA2_MAX_ROWS_INSERT |
+                                SQL_CA2_MAX_ROWS_DELETE |
+                                SQL_CA2_MAX_ROWS_UPDATE |
+                                SQL_CA2_CRC_EXACT);
+            break;
+        case SQL_STATIC_SENSITIVITY: /* for compat with 2.x */
+            *pnSQLUINTEGER  = (SQL_SS_ADDITIONS |
+                               SQL_SS_DELETIONS |
+                               SQL_SS_UPDATES);
+            break;
+        case SQL_STRING_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_FN_STR_CONCAT | 
+                               SQL_FN_STR_INSERT |
+                               SQL_FN_STR_LEFT | 
+                               SQL_FN_STR_LTRIM | 
+                               SQL_FN_STR_LENGTH |
+                               SQL_FN_STR_LOCATE | 
+                               SQL_FN_STR_LCASE | 
+                               SQL_FN_STR_REPEAT |
+                               SQL_FN_STR_REPLACE | 
+                               SQL_FN_STR_RIGHT | 
+                               SQL_FN_STR_RTRIM |
+                               SQL_FN_STR_SUBSTRING | 
+                               SQL_FN_STR_UCASE | 
+                               SQL_FN_STR_ASCII |
+                               SQL_FN_STR_CHAR | 
+                               SQL_FN_STR_LOCATE_2 | 
+                               SQL_FN_STR_SOUNDEX |
+                               SQL_FN_STR_SPACE);
+            break;
+        case SQL_SUBQUERIES:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_SYSTEM_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_FN_SYS_DBNAME |
+                               SQL_FN_SYS_IFNULL |
+                               SQL_FN_SYS_USERNAME);
+            break;
+        case SQL_TABLE_TERM:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "table",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        case SQL_TIMEDATE_ADD_INTERVALS:
+        case SQL_TIMEDATE_DIFF_INTERVALS:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_TIMEDATE_FUNCTIONS:
+            *pnSQLUINTEGER  = (SQL_FN_TD_NOW | 
+                               SQL_FN_TD_CURDATE | 
+                               SQL_FN_TD_DAYOFMONTH |
+                               SQL_FN_TD_DAYOFWEEK | 
+                               SQL_FN_TD_DAYOFYEAR | 
+                               SQL_FN_TD_MONTH |
+                               SQL_FN_TD_QUARTER | 
+                               SQL_FN_TD_WEEK | 
+                               SQL_FN_TD_YEAR |
+                               SQL_FN_TD_CURTIME | 
+                               SQL_FN_TD_HOUR | 
+                               SQL_FN_TD_MINUTE |
+                               SQL_FN_TD_SECOND | 
+                               SQL_FN_TD_DAYNAME | 
+                               SQL_FN_TD_MONTHNAME);
+            break;
+        case SQL_TXN_CAPABLE:
+            if ( MYODBCDrvSupportTransactions( pDbc ) && !(pDbc->nFlag &
MYODBC_FLAG_NO_TRANSACTIONS) )
+                *pnSQLUSMALLINT = SQL_TC_ALL;
+            else
+                *pnSQLUSMALLINT = SQL_TC_NONE;
+            break;
+        case SQL_TXN_ISOLATION_OPTION:
+            if ( !MYODBCDrvSupportTransactions( pDbc ) || (pDbc->nFlag &
MYODBC_FLAG_NO_TRANSACTIONS) )
+              *pnSQLUINTEGER    = SQL_TXN_READ_COMMITTED;
+            else
+              *pnSQLUINTEGER    = (SQL_TXN_READ_COMMITTED |
+                                   SQL_TXN_READ_UNCOMMITTED |
+                                   SQL_TXN_REPEATABLE_READ |
+                                   SQL_TXN_SERIALIZABLE);
+            break;
+        case SQL_UNION:
+            *pnSQLUINTEGER  = 0L;
+            break;
+        case SQL_USER_NAME:
+            if ( pDbc->pszUser )
+            {
+                if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, pDbc->pszUser,
(SQLINTEGER*)pnStringLength ) )
+                    MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            }
+            else
+            {
+                if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "",
(SQLINTEGER*)pnStringLength ) )
+                    MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            }
+            break;
+        case SQL_XOPEN_CLI_YEAR:
+            if ( !MYODBCCStrCopyOut( pszSQLCHAR, nBufferLength, "1992",
(SQLINTEGER*)pnStringLength ) )
+                MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_01004, 0,
NULL ) );
+            break;
+        default:
+            MYODBCDbgReturn( MYODBCDiaAppend( pDbc->hDia, MYODBC_DIA_HYC00, 0, NULL )
);
+    }
+
+    MYODBCDbgReturn( SQL_SUCCESS );
 }
 
 MConnection::STATE MConnection::getState()

Thread
Connector/ODBC 5 commit: r281 - MYODBCDriver/MYODBCDriverLib MYODBCShell MYSQLPlus/MYSQLPlusLibpharvey28 May