List:Commits« Previous MessageNext Message »
From:jbalint Date:February 8 2007 1:21am
Subject:Connector/ODBC 5 commit: r789 - in trunk/SDK/MYSQLPlus: Library include
View as plain text  
Modified:
   trunk/SDK/MYSQLPlus/Library/MConnection_props.cpp
   trunk/SDK/MYSQLPlus/include/MConnection.h
Log:
Updated SQLGetInfo() to get string lengths without data (mostly seen from ADO and Access).

Modified: trunk/SDK/MYSQLPlus/Library/MConnection_props.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MConnection_props.cpp	2007-02-08 00:34:35 UTC (rev 788)
+++ trunk/SDK/MYSQLPlus/Library/MConnection_props.cpp	2007-02-08 01:21:12 UTC (rev 789)
@@ -322,12 +322,10 @@
             if ( getCurrentCatalog().isNull() )
                 MYODBCDbgReturn( SQL_NO_DATA );
 
-            /* copy string */
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pValue, nBufferLength /
sizeof(SQLWCHAR), getCurrentCatalog(), pnLen );
-            /* because we have char len but we want byte len */
-            *pnLen = *pnLen * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            SQLSMALLINT smallLen;
+            MYODBCDbgReturn( getInfoFillString( (wchar_t *)pValue,
+                    nBufferLength, &smallLen, getCurrentCatalog() ) );
+            *pnLen = smallLen;
             break;
 
         case SQL_ATTR_LOGIN_TIMEOUT:
@@ -459,17 +457,26 @@
     MYODBCDbgInfo( QString( "nInfoType=%1=%2" ).arg( nInfoType).arg(
MYODBCC::getInfoTypeString( nInfoType ) ) );
 #endif
 
+    /* this is above, as it CAN be NULL */
+    SQLWCHAR *          pszSQLWCHAR     = (SQLWCHAR *)pInfoValue;
     /* cast here to make code below a little cleaner */
     SQLUSMALLINT *      pnSQLUSMALLINT  = (SQLUSMALLINT *)pInfoValue;
     SQLSMALLINT *       pnSQLSMALLINT   = (SQLSMALLINT *)pInfoValue;
     SQLUINTEGER *       pnSQLUINTEGER   = (SQLUINTEGER *)pInfoValue;
-    SQLWCHAR *          pszSQLWCHAR     = (SQLWCHAR *)pInfoValue;
     /* pnStringLengthBytes is optional so provide dummy to make code below a little
cleaner */
     SQLSMALLINT         nStringLengthBytes;
     SQLSMALLINT *       pnStringLengthBytes  = pnStringLengthBytesPtr;
-    SQLINTEGER          nStringLengthChars;
-    BOOL                bCopyOk;
 
+    /* dummy value to use for non-strings */
+    SQLUINTEGER dummy = 0xcdcdcdcd;
+
+    if ( !pInfoValue )
+    {
+        pnSQLUSMALLINT  = (SQLUSMALLINT *)&dummy;
+        pnSQLSMALLINT   = (SQLSMALLINT *)&dummy;
+        pnSQLUINTEGER   = (SQLUINTEGER *)&dummy;
+    }
+
     /*!
         \internal ODBC RULE
 
@@ -497,14 +504,6 @@
     /*!
         \internal MYODBC RULE
 
-        We DO NOT consider pInfoValue to be optional.
-    */
-    if ( !pInfoValue )
-        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_HY000, 0,
tr("buffer, to return value, must be provided") ) );
-
-    /*!
-        \internal MYODBC RULE
-
         The following ODBC Rule makes pnStringLength optional.
     */
     /*!
@@ -562,16 +561,12 @@
     switch ( nInfoType )
     {
         case SQL_ACCESSIBLE_PROCEDURES:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoAccessibleProcedures(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoAccessibleProcedures() ) );
             break;
         case SQL_ACCESSIBLE_TABLES:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoAccessibleTables(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoAccessibleTables() ) );
             break;
         case SQL_ACTIVE_ENVIRONMENTS:
             *pnSQLUSMALLINT = getInfoActiveEnvironments();
@@ -603,37 +598,27 @@
             *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_CATALOG_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoCatalogName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoCatalogName() ) );
             break;
         case SQL_CATALOG_NAME_SEPARATOR:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoCatalogNameSeparator(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoCatalogNameSeparator() ) );
             break;
         case SQL_CATALOG_TERM:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoCatalogTerm(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoCatalogTerm() ) );
             break;
         case SQL_CATALOG_USAGE:
             *pnSQLUINTEGER  = getInfoCatalogUsage();
             break;
         case SQL_COLLATION_SEQ:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoCollationSeq(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoCollationSeq() ) );
             break;
         case SQL_COLUMN_ALIAS:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoColumnAlias(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoColumnAlias() ) );
             break;
         case SQL_CONCAT_NULL_BEHAVIOR:
             *pnSQLUSMALLINT = getInfoConcatNullBehavior();
@@ -750,37 +735,27 @@
             *pnSQLUINTEGER = getInfoCursorSensitivity();
             break;
         case SQL_DATA_SOURCE_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDataSourceName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDataSourceName() ) );
             break;
         case SQL_DATA_SOURCE_READ_ONLY:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDataSourceReadOnly(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDataSourceReadOnly() ) );
             break;
         case SQL_DATABASE_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDatabaseName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDatabaseName() ) );
             break;
         case SQL_DATETIME_LITERALS:
             *pnSQLUINTEGER = getInfoDatetimeLiterals();
             break;
         case SQL_DBMS_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDbmsName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDbmsName() ) );
             break;
         case SQL_DBMS_VER: 
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDbmsVer(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDbmsVer() ) );
             break;
         case SQL_DDL_INDEX:
             *pnSQLUINTEGER = getInfoDdlIndex();
@@ -789,16 +764,12 @@
             *pnSQLUINTEGER = getInfoDefaultTxnIsolation();
             break;
         case SQL_DESCRIBE_PARAMETER:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDescribeParameter(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDescribeParameter() ) );
             break;
         case SQL_DM_VER:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDmVer(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDmVer() ) );
             break;
         case SQL_DRIVER_HDBC:
             if ( !pInfoValue )
@@ -877,22 +848,16 @@
             */
             break;
         case SQL_DRIVER_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoDriverName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDriverName() ) );
             break;
         case SQL_DRIVER_ODBC_VER:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoDriverOdbcVer(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDriverOdbcVer() ) );
             break;
         case SQL_DRIVER_VER:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoDriverVer(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoDriverVer() ) );
             break;
         case SQL_DROP_ASSERTION:
             *pnSQLUINTEGER = getInfoDropAssertion();
@@ -925,10 +890,8 @@
             *pnSQLUINTEGER = getInfoDynamicCursorAttributes2();
             break;
         case SQL_EXPRESSIONS_IN_ORDERBY:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoExpressionsInOrderby(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoExpressionsInOrderby() ) );
             break;
         case SQL_FILE_USAGE:
             *pnSQLUSMALLINT = getInfoFileUsage();
@@ -952,10 +915,8 @@
             *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_IDENTIFIER_QUOTE_CHAR:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoIdentifierQuoteChar(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoIdentifierQuoteChar() ) );
             break;
         case SQL_INDEX_KEYWORDS:
             *pnSQLUINTEGER = getInfoIndexKeywords();
@@ -967,10 +928,8 @@
             *pnSQLUINTEGER = getInfoInsertStatement();
             break;
         case SQL_INTEGRITY:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoIntegrity(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoIntegrity() ) );
             break;
         case SQL_KEYSET_CURSOR_ATTRIBUTES1:
             *pnSQLUINTEGER = getInfoKeysetCursorAttributes1();
@@ -979,16 +938,12 @@
             *pnSQLUINTEGER = getInfoKeysetCursorAttributes2();
             break;
         case SQL_KEYWORDS:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoKeywords(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoKeywords() ) );
             break;
         case SQL_LIKE_ESCAPE_CLAUSE:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoLikeEscapeClause(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoLikeEscapeClause() ) );
             break;
         case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
             *pnSQLUINTEGER = getInfoMaxAsyncConcurrentStatements();
@@ -1054,10 +1009,8 @@
             *pnSQLUINTEGER = getInfoMaxRowSize();
             break;
         case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoMaxRowSizeIncludesLong(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoMaxRowSizeIncludesLong() ) );
             break;
         case SQL_MAX_SCHEMA_NAME_LEN:
             *pnSQLUSMALLINT = getInfoMaxSchemaNameLen();
@@ -1079,22 +1032,16 @@
             *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_MULT_RESULT_SETS:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoMultiResultSets(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoMultiResultSets() ) );
             break;
         case SQL_MULTIPLE_ACTIVE_TXN:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoMultipleActiveTxn(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoMultipleActiveTxn() ) );
             break;
         case SQL_NEED_LONG_DATA_LEN:
-            bCopyOk = MYODBCC::doStringCopyOut( (SQLWCHAR*)pInfoValue, nBufferLength,
getInfoNeedLongDataLen(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoNeedLongDataLen() ) );
             break;
         case SQL_NON_NULLABLE_COLUMNS:
             *pnSQLUSMALLINT = getInfoNonNullableColumns();
@@ -1111,19 +1058,15 @@
             *pnSQLUINTEGER = getInfoOdbcInterfaceConformance();
             break;
         case SQL_ODBC_VER:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoOdbcVer(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoOdbcVer() ) );
             break;
         case SQL_OJ_CAPABILITIES:
             *pnSQLUINTEGER = getInfoOjCapabilities();
             break;
         case SQL_ORDER_BY_COLUMNS_IN_SELECT:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoOrderByColumnsInSelect(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoOrderByColumnsInSelect() ) );
             break;
         case SQL_PARAM_ARRAY_ROW_COUNTS:
             *pnSQLUINTEGER = getInfoParamArrayRowCounts();
@@ -1132,32 +1075,24 @@
             *pnSQLUINTEGER = getInfoParamArraySelects();
             break;
         case SQL_PROCEDURE_TERM:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoProcedureTerm() , &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoProcedureTerm() ) );
             break;
         case SQL_PROCEDURES:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoProcedures(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoProcedures() ) );
             break;
         case SQL_QUOTED_IDENTIFIER_CASE:
             *pnSQLUSMALLINT = getInfoQuotedIdentifierCase();
             *pnStringLengthBytes = sizeof(SQLUSMALLINT);
             break;
         case SQL_ROW_UPDATES:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoRowUpdates(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoRowUpdates() ) );
             break;
         case SQL_SCHEMA_TERM:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoSchemaTerm(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoSchemaTerm() ) );
             break;
         case SQL_SCHEMA_USAGE:
             *pnSQLUINTEGER = getInfoSchemaUsage();
@@ -1166,22 +1101,16 @@
             *pnSQLUINTEGER = getInfoScrollOptions();
             break;
         case SQL_SEARCH_PATTERN_ESCAPE:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoSearchPatternEscape(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoSearchPatternEscape() ) );
             break;
         case SQL_SERVER_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoServerName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoServerName() ) );
             break;
         case SQL_SPECIAL_CHARACTERS:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoSpecialCharacters(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoSpecialCharacters() ) );
             break;
         case SQL_SQL_CONFORMANCE:
             *pnSQLUINTEGER = getInfoSqlConformance();
@@ -1238,10 +1167,8 @@
             *pnSQLUINTEGER = getInfoSystemFunctions();
             break;
         case SQL_TABLE_TERM:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoTableTerm(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoTableTerm() ) );
             break;
         case SQL_TIMEDATE_ADD_INTERVALS:
             *pnSQLUINTEGER = getInfoTimedateAddIntervals();
@@ -1263,16 +1190,12 @@
             *pnSQLUINTEGER = getInfoUnion();
             break;
         case SQL_USER_NAME:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoUserName(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoUserName() ) );
             break;
         case SQL_XOPEN_CLI_YEAR:
-            bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR, nBufferLength /
sizeof(SQLWCHAR), getInfoXopenCliYear(), &nStringLengthChars );
-            *pnStringLengthBytes = nStringLengthChars * sizeof(SQLWCHAR);
-            if ( !bCopyOk )
-                MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_01004 )
);
+            MYODBCDbgReturn( getInfoFillString( pszSQLWCHAR, nBufferLength,
+                    pnStringLengthBytes, getInfoXopenCliYear() ) );
             break;
         default:
             if ( getEnvironment()->getODBCVersion() == SQL_OV_ODBC2 )
@@ -1321,9 +1244,41 @@
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::STATE_HYC00 )
);
     }
 
+    /*!
+        \internal MYODBC RULE
+
+        If we actually used the dummy value, it's invalid.
+    */
+    if ( dummy != 0xcdcdcdcd )
+        MYODBCDbgReturn( getDiagnostic()->doAppend(
+                    MDiagnostic::STATE_HY000, 0,
+                    tr("buffer, to return value, must be provided") ) );
+
     MYODBCDbgReturn( SQL_SUCCESS );
 }
 
+SQLRETURN MConnection::getInfoFillString( wchar_t *pszSQLWCHAR,
+        SQLSMALLINT nBufferLength, SQLSMALLINT *pnStringLengthBytes,
+        QString val)
+{
+    MYODBCDbgEnter();
+
+    SQLINTEGER nStringLengthChars;
+
+    if ( pszSQLWCHAR )
+    {
+        BOOL bCopyOk = MYODBCC::doStringCopyOut( pszSQLWCHAR,
+                nBufferLength / sizeof(SQLWCHAR),
+                val, &nStringLengthChars );
+        if ( !bCopyOk )
+            MYODBCDbgReturn( getDiagnostic()->
+                    doAppend( MDiagnostic::STATE_01004 ) );
+    }
+    *pnStringLengthBytes = val.size() * sizeof(SQLWCHAR);
+
+    MYODBCDbgReturn( SQL_SUCCESS );
+}
+
 MConnection::STATEMENT_TYPE MConnection::getStatementType()
 {
     MYODBCDbgEnter();

Modified: trunk/SDK/MYSQLPlus/include/MConnection.h
===================================================================
--- trunk/SDK/MYSQLPlus/include/MConnection.h	2007-02-08 00:34:35 UTC (rev 788)
+++ trunk/SDK/MYSQLPlus/include/MConnection.h	2007-02-08 01:21:12 UTC (rev 789)
@@ -61,6 +61,9 @@
     SQLRETURN getDiagField( SQLSMALLINT nRecNumber, SQLSMALLINT nDiagIdentifier,
SQLPOINTER pDiagInfoPtr, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStringLengthPtr );
     SQLRETURN getDiagRec( SQLSMALLINT nRecNumber, SQLWCHAR *psSQLState, SQLINTEGER
*pnNativeErrorPtr, SQLWCHAR *psMessageText, SQLSMALLINT nBufferLength, SQLSMALLINT
*pnTextLengthPtr );
     SQLRETURN getInfo( SQLUSMALLINT nInfoType, SQLPOINTER pInfoValue, SQLSMALLINT
nBufferLength, SQLSMALLINT *pnStringLength );
+    SQLRETURN getInfoFillString( wchar_t *pszSQLWCHAR,
+            SQLSMALLINT nBufferLength,
+            SQLSMALLINT *pnStringLengthBytes, QString val );
 
     STATE           getState();
     STATEMENT_TYPE  getStatementType();

Thread
Connector/ODBC 5 commit: r789 - in trunk/SDK/MYSQLPlus: Library includejbalint8 Feb