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/MYSQLPlusTest | pharvey | 31 May |