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/MYSQLPlusLib | pharvey | 28 May |