List:Commits« Previous MessageNext Message »
From:pharvey Date:May 30 2006 11:21pm
Subject:Connector/ODBC 5 commit: r294 - MYODBCDriver/MYODBCDriverLib MYSQLPlus/MYSQLPlusLib MYSQLPlus/MYSQLPlusTest
View as plain text  
Modified:
   MYODBCDriver/MYODBCDriverLib/MYODBCDriverMain.cpp
   MYSQLPlus/MYSQLPlusLib/MDiagnostic.cpp
   MYSQLPlus/MYSQLPlusLib/MDiagnosticRecord.cpp
   MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
   MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
   MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
   MYSQLPlus/MYSQLPlusLib/MStatement.cpp
   MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp
Log:


Modified: MYODBCDriver/MYODBCDriverLib/MYODBCDriverMain.cpp
===================================================================
--- MYODBCDriver/MYODBCDriverLib/MYODBCDriverMain.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYODBCDriver/MYODBCDriverLib/MYODBCDriverMain.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -28,6 +28,7 @@
 */
 #include "MYODBCDriverInternal.h"
 
+/* _tgetenv is mapping to getenv despite UNICODE for some reason so... */
 #ifdef UNICODE
 #define tgetenv _wgetenv
 #else

Modified: MYSQLPlus/MYSQLPlusLib/MDiagnostic.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MDiagnostic.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MDiagnostic.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -246,7 +246,7 @@
     MYODBCDbgReturn( SQL_SUCCESS );
 }
 
-SQLRETURN MDiagnostic::getDiagRec( SQLSMALLINT nRecNumber, SQLWCHAR *psSqlstate,
SQLINTEGER *pnNativeErrorPtr, SQLWCHAR *pszMessageText, SQLSMALLINT nBufferLength,
SQLSMALLINT *pnTextLengthPtr )
+SQLRETURN MDiagnostic::getDiagRec( SQLSMALLINT nRecNumber, SQLWCHAR *psSqlstate,
SQLINTEGER *pnNativeErrorPtr, SQLWCHAR *pszMessageText, SQLSMALLINT nBufferLength,
SQLSMALLINT *pnTextByteLength )
 {
     MYODBCDbgEnter();
 
@@ -255,7 +255,7 @@
     if ( nRecNumber > getNumber() )
         MYODBCDbgReturn( SQL_NO_DATA );
 
-    MYODBCDbgReturn( ((MDiagnosticRecord*)(children()[nRecNumber - 1]))->getDiagRec(
psSqlstate, pnNativeErrorPtr, pszMessageText, nBufferLength, pnTextLengthPtr ) );
+    MYODBCDbgReturn( ((MDiagnosticRecord*)(children()[nRecNumber - 1]))->getDiagRec(
psSqlstate, pnNativeErrorPtr, pszMessageText, nBufferLength, pnTextByteLength ) );
 }
 
 /*!
@@ -367,11 +367,10 @@
     SQLWCHAR    sSqlstate[6];
     SQLINTEGER  nNativeError;
     SQLWCHAR    sMessageText[1024];
-    SQLSMALLINT nBufferLength;
     SQLSMALLINT nTextLength;
 
     for ( SQLSMALLINT nRecord = 1; 
-          SQL_SUCCEEDED( getDiagRec( nRecord, sSqlstate, &nNativeError, sMessageText,
1024, &nTextLength ) ); 
+          SQL_SUCCEEDED( getDiagRec( nRecord, sSqlstate, &nNativeError, sMessageText,
sizeof(sMessageText), &nTextLength ) ); 
           nRecord++ )
     {
         stringlist += QString::fromUtf16( sMessageText );

Modified: MYSQLPlus/MYSQLPlusLib/MDiagnosticRecord.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MDiagnosticRecord.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MDiagnosticRecord.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -94,15 +94,15 @@
     MYODBCDbgReturn( SQL_SUCCESS );
 }
 
-SQLRETURN MDiagnosticRecord::getDiagRec( SQLWCHAR *psSqlstate, SQLINTEGER
*pnNativeErrorPtr, SQLWCHAR *pszMessageText, SQLSMALLINT nBufferLength, SQLSMALLINT
*pnTextLengthPtr )
+SQLRETURN MDiagnosticRecord::getDiagRec( SQLWCHAR *psSqlstate, SQLINTEGER
*pnNativeErrorPtr, SQLWCHAR *pszMessageText, SQLSMALLINT nBufferCharLength, SQLSMALLINT
*pnTextByteLength )
 {
     SQLRETURN   nReturn;
     BOOLEAN     bHasInfo = false;
-    SQLSMALLINT nStringLength;
+    SQLSMALLINT nByteLength;
 
     MYODBCDbgEnter();
 
-    nReturn = getDiagField( SQL_DIAG_SQLSTATE, psSqlstate, 5, &nStringLength );
+    nReturn = getDiagField( SQL_DIAG_SQLSTATE, psSqlstate, 5, &nByteLength );
     if ( nReturn == SQL_SUCCESS_WITH_INFO )
         bHasInfo = true;
     if ( !SQL_SUCCEEDED( nReturn ) )
@@ -114,8 +114,8 @@
     if ( !SQL_SUCCEEDED( nReturn ) )
         MYODBCDbgReturn( nReturn );
 
-    nReturn = getDiagField( SQL_DIAG_MESSAGE_TEXT, pszMessageText, nBufferLength,
&nStringLength );
-    if ( pnTextLengthPtr ) *pnTextLengthPtr = nStringLength;
+    nReturn = getDiagField( SQL_DIAG_MESSAGE_TEXT, pszMessageText, nBufferCharLength,
&nByteLength );
+    if ( pnTextByteLength ) *pnTextByteLength = nByteLength;
     if ( nReturn == SQL_SUCCESS_WITH_INFO )
         bHasInfo = true;
     if ( !SQL_SUCCEEDED( nReturn ) )
@@ -128,15 +128,15 @@
     MYODBCDbgReturn( SQL_SUCCESS );
 }
 
-SQLRETURN MDiagnosticRecord::getDiagField( SQLSMALLINT nDiagIdentifier, SQLPOINTER
pDiagInfoPtr, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStringLengthPtr )
+SQLRETURN MDiagnosticRecord::getDiagField( SQLSMALLINT nDiagIdentifier, SQLPOINTER
pDiagInfoPtr, SQLSMALLINT nBufferLength /* in chars for strings */, SQLSMALLINT
*pnStringByteLength )
 {
     SQLSMALLINT nStringLength;
 
     MYODBCDbgEnter();
 
-    /* use dummy when no pnStringLengthPtr */
-    if ( !pnStringLengthPtr )
-        pnStringLengthPtr = &nStringLength;
+    /* use dummy when no pnStringByteLength */
+    if ( !pnStringByteLength )
+        pnStringByteLength = &nStringLength;
 
     /* which record field? */
     switch ( nDiagIdentifier )
@@ -147,8 +147,8 @@
                 if ( nBufferLength < 1 || stringClassOrigin.isNull() )
                     MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringClassOrigin.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringClassOrigin.utf16() ) )
+                *pnStringByteLength = stringClassOrigin.length() * sizeof(SQLWCHAR);
+                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength,
(SQLWCHAR*)stringClassOrigin.utf16() ) )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;
@@ -163,8 +163,8 @@
                 if ( nBufferLength < 1 || stringConnectionName.isNull() )
                     MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringConnectionName.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringConnectionName.utf16() ) )
+                *pnStringByteLength = stringConnectionName.length() * sizeof(SQLWCHAR);
+                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength,
(SQLWCHAR*)stringConnectionName.utf16() ) )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;
@@ -175,8 +175,8 @@
                 if ( nBufferLength < 1 || stringMessageText.isNull() )
                     MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringMessageText.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringMessageText.utf16() ) )
+                *pnStringByteLength = stringMessageText.length() * sizeof(SQLWCHAR);
+                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength,
(SQLWCHAR*)stringMessageText.utf16() ) )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;
@@ -195,8 +195,8 @@
                 if ( nBufferLength < 1 || stringServerName.isNull() )
                     MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringServerName.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringServerName.utf16() ) )
+                *pnStringByteLength = stringServerName.length() * sizeof(SQLWCHAR);
+                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength,
(SQLWCHAR*)stringServerName.utf16() ) )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;
@@ -204,11 +204,18 @@
         case SQL_DIAG_SQLSTATE:
             {
                 QString stringSQLState = getSQLState();
-                if ( nBufferLength < 1 || stringSQLState.isNull() )
-                    MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringSQLState.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringSQLState.utf16() ) )
+                /* blank out dest */
+                for ( int nChar = 0; nChar < nBufferLength && nChar < 5;
nChar++ ) ((SQLWCHAR*)pDiagInfoPtr)[nChar] = '\0'; 
+
+                /* copy not more than min( 5, nBufferLength, stringSQLState.length() )
chars */
+                int nChars = min( nBufferLength, stringSQLState.length() );
+                nChars = min( nChars, 5 );
+                for ( int nChar = 0; nChar < nChars; nChar++ )
((SQLWCHAR*)pDiagInfoPtr)[nChar] = stringSQLState.at( nChar ).unicode(); 
+
+                /* string length (in bytes) */
+                *pnStringByteLength = max( nChars, 0 );
+                if ( *pnStringByteLength < 5 )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;
@@ -219,8 +226,8 @@
                 if ( nBufferLength < 1 || stringSubClassOrigin.isNull() )
                     MYODBCDbgReturn( SQL_ERROR );
 
-                *pnStringLengthPtr = stringSubClassOrigin.length() * sizeof(SQLWCHAR);
-                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength /
sizeof(SQLWCHAR), (SQLWCHAR*)stringSubClassOrigin.utf16() ) )
+                *pnStringByteLength = stringSubClassOrigin.length() * sizeof(SQLWCHAR);
+                if ( !MYODBCC::doStringCopyOut( (SQLWCHAR*)pDiagInfoPtr, nBufferLength,
(SQLWCHAR*)stringSubClassOrigin.utf16() ) )
                     MYODBCDbgReturn( SQL_SUCCESS_WITH_INFO );
             }
             break;

Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -5,6 +5,23 @@
 {
     MYODBCDbgEnter();
 
+    /*!
+        \internal
+        \note
+
+        Indicate our className without using Q_OBJECT/className(). We can do this
+        because we do not need objectName for anything else. 
+
+        This can be passed to QObject constructor but doing it here allows this 
+        comment :) 
+
+        Avoiding className() does, however, limit our options for filtering object child
+        lists - [sigh].
+
+        \sa objectName()
+    */
+    setObjectName( "MResultPlus" );
+
     nRow = 0;
     setStatementType( STATEMENT_TYPE_PLUS );
     setState( STATE_INITIALIZED );

Modified: MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -10,6 +10,23 @@
 {
     MYODBCDbgEnter();
 
+    /*!
+        \internal
+        \note
+
+        Indicate our className without using Q_OBJECT/className(). We can do this
+        because we do not need objectName for anything else. 
+
+        This can be passed to QObject constructor but doing it here allows this 
+        comment :) 
+
+        Avoiding className() does, however, limit our options for filtering object child
+        lists - [sigh].
+
+        \sa objectName()
+    */
+    setObjectName( "MResultRes" );
+
     setState( STATE_UNINITIALIZED );
     pRes = NULL;
     nRow = 0;

Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -10,6 +10,23 @@
 {
     MYODBCDbgEnter();
 
+    /*!
+        \internal
+        \note
+
+        Indicate our className without using Q_OBJECT/className(). We can do this
+        because we do not need objectName for anything else. 
+
+        This can be passed to QObject constructor but doing it here allows this 
+        comment :) 
+
+        Avoiding className() does, however, limit our options for filtering object child
+        lists - [sigh].
+
+        \sa objectName()
+    */
+    setObjectName( "MResultStmt" );
+
     setState( STATE_UNINITIALIZED );
     pbindColumns    = NULL;
     nRow            = 0;

Modified: MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MStatement.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusLib/MStatement.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -15,6 +15,9 @@
         This can be passed to QObject constructor but doing it here allows this 
         comment :) 
 
+        Avoiding className() does, however, limit our options for filtering object child
+        lists - [sigh].
+
         \sa objectName()
     */
     setObjectName( "MStatement" );
@@ -1811,7 +1814,7 @@
     MYODBCDbgReturn( SQL_ERROR );
 }
 
-SQLRETURN MStatement::doNumResultCols( SQLSMALLINT *pnColumnCountPtr )
+SQLRETURN MStatement::doNumResultCols( SQLSMALLINT *pnColumnCount )
 {
     MYODBCDbgEnter();
 
@@ -1822,7 +1825,61 @@
     */
     pDiagnostic->doClear();
 
-    MYODBCDbgReturn( SQL_ERROR );
+    /*!
+        \internal ODBC RULE (DM)
+
+        The StatementHandle was not prepared.
+    */
+    if ( getState() < STATE_S4 )
+        MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY010 ) );
+
+    /*!
+        \internal ODBC RULE (DM)
+
+        An asynchronously executing function was called for the StatementHandle and was 
+        still executing when this function was called.
+    */
+    if ( isAsyncInProgress() )
+        MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY010 ) );
+
+    /*!
+        \internal ODBC RULE (DM)
+
+        SQLExecute, SQLExecDirect, SQLBulkOperations, or SQLSetPos was called for the
StatementHandle and 
+        returned SQL_NEED_DATA. This function was called before data was sent for all
data-at-execution 
+        parameters or columns.
+    */
+    if ( isDataNeeded() )
+        MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY010 ) );
+
+    /*!
+        \internal MYODBC RULE
+
+        Only server-side prepared statements (MResultStmt) can give us the col count 
+        before execute. We *could* silently execute the statement (if it is a read-only
request)
+        but we do NOT do that because it provides inconsistent behaviour. The app should
use 
+        server side prepared if col count needed before execute.
+    */
+    if ( getState() == STATE_S4 && pResult->objectName() != "MResultStmt" )
+        MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY010, 0, tr("column
count unknown at this time") ) );
+
+    /*!
+        \internal MYODBC RULE
+
+        pnColumnCount must not be null (otherwise - whats the point?).
+    */
+    if ( !pnColumnCount )
+        MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY000, 0,
tr("pnColumnCount was null") ) );
+
+    /*!
+        \internal ODBC RULE
+
+        The number of columns returned by SQLNumResultCols is the same value as the
SQL_DESC_COUNT field 
+        of the IRD.
+    */
+    *pnColumnCount = getImpRowDesc()->getCount();
+
+    MYODBCDbgReturn( SQL_SUCCESS );
 }
 
 SQLRETURN MStatement::doParamData( SQLPOINTER *ppValuePtrPtr )

Modified: MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp	2006-05-30 19:03:20 UTC (rev 293)
+++ MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp	2006-05-30 23:21:07 UTC (rev 294)
@@ -134,6 +134,7 @@
     MStatement  statement( pConnection );
     SQLRETURN   nReturn;
     SQLINTEGER  nRows   = 0;
+    SQLSMALLINT nCols   = 0;
     SQLINTEGER  nUserID = 0;
     SQLCHAR     pszName[100];
     SQLWCHAR    pszNameWide[100];
@@ -144,6 +145,12 @@
         std::cout << endl << endl << statement.getDiagnostics().join(
"\n" ).toAscii().data() << endl << endl;
     QCOMPARE( nReturn, (SQLRETURN)SQL_SUCCESS );
 
+    nReturn = statement.doNumResultCols( &nCols );
+    if ( nReturn != SQL_SUCCESS )
+        std::cout << endl << endl << statement.getDiagnostics().join(
"\n" ).toAscii().data() << endl << endl;
+    QCOMPARE( nReturn, (SQLRETURN)SQL_SUCCESS );
+    QCOMPARE( nCols, (SQLSMALLINT)2 );
+
     nReturn = statement.doRowCount( &nRows );
     if ( nReturn != SQL_SUCCESS )
         std::cout << endl << endl << statement.getDiagnostics().join(
"\n" ).toAscii().data() << endl << endl;

Thread
Connector/ODBC 5 commit: r294 - MYODBCDriver/MYODBCDriverLib MYSQLPlus/MYSQLPlusLib MYSQLPlus/MYSQLPlusTestpharvey31 May