Modified:
trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
trunk/MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp
trunk/MYSQLPlus/include/MStatement.h
Log:
- Added bImplicitPrepare flag to prevent case where SQLExecute tries to use prepare from
catalog func or SQLExecDirect.
- Changed year of date in test case from '1963' to '2005' as server was complaining it was
invalid.
- etc
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-06-16 07:50:16 UTC (rev 344)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-06-16 15:17:04 UTC (rev 345)
@@ -30,6 +30,8 @@
pDiagnostic = new MDiagnostic( this );
pAppParamDesc = pAppParamDescOrig = new MDescriptorAPD( this );
pAppRowDesc = pAppRowDescOrig = new MDescriptorARD( this );
+ pResult = NULL;
+ bImplicitPrepare = false;
nAsyncEnable = SQL_ASYNC_ENABLE_DEFAULT;
nConcurrency = SQL_CONCUR_DEFAULT;
nCursorScrollable = SQL_NONSCROLLABLE;
@@ -1801,6 +1803,7 @@
MYODBCDbgReturn( nReturn );
}
+ setImplicitPrepare( true );
this->pResult = pResult;
setState( STATE_S5 );
@@ -1843,6 +1846,8 @@
if ( !SQL_SUCCEEDED( nReturn1 ) )
MYODBCDbgReturn( nReturn1 );
+ setImplicitPrepare( true );
+
/*!
\internal
\note
@@ -1930,6 +1935,31 @@
if ( isDataNeeded() )
MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY010 ) );
+ /*!
+ \internal ODBC RULE
+
+ The prepared statement associated with the statement handle can be reexecuted by
+ calling SQLExecute until the application frees the statement with a call to
+ SQLFreeStmt with the SQL_DROP option or until the statement handle is used in a
+ call to SQLPrepare, SQLExecDirect, or one of the catalog functions (SQLColumns,
+ SQLTables, and so on).
+ */
+ /*!
+ \internal MYODBC RULE
+
+ We not want prevent the following scenarios;
+
+ 1. app calls SQLExecDirect() and then SQLExecute() (without a SQLPrepare() in
the middle)
+ 2. app calls a catalog function like SQLTables() and then SQLExecute()
(without a SQLPrepare() in the middle)
+ */
+ if ( getState() > STATE_S3 )
+ {
+ Q_ASSERT( !pResult );
+ delete pResult;
+ pResult = NULL;
+ setState( STATE_S1 );
+ }
+
Q_ASSERT( !pResult );
SQLRETURN nReturn = pResult->doExecute();
if ( !SQL_SUCCEEDED( nReturn ) )
@@ -2326,22 +2356,9 @@
if ( nLength1 <= 0 && nLength1 != SQL_NTS )
MYODBCDbgReturn( pDiagnostic->doAppend( MDiagnostic::DIA_HY090 ) );
- /*!
- \internal ODBC RULE
-
- The prepared statement associated with the statement handle can be reexecuted by
- calling SQLExecute until the application frees the statement with a call to
- SQLFreeStmt with the SQL_DROP option or until the statement handle is used in a
- call to SQLPrepare, SQLExecDirect, or one of the catalog functions (SQLColumns,
- SQLTables, and so on).
- */
+ /* we could be in; STATE_S2, STATE_S3 or STATE_S4 so rollback */
if ( getState() > STATE_S1 )
- {
- Q_ASSERT( !pResult );
- delete pResult;
- pResult = NULL;
- setState( STATE_S1 );
- }
+ doStateRollBack( STATE_S1 );
/* what flavour of resultset do we want? */
switch ( getConnection()->getStatementType() )
@@ -2744,6 +2761,7 @@
MYODBCDbgReturn( nReturn );
}
+ setImplicitPrepare( true );
this->pResult = pResult;
setState( STATE_S5 );
@@ -2779,6 +2797,15 @@
MYODBCDbgReturn3( "%d", true );
}
+void MStatement::setImplicitPrepare( BOOLEAN b )
+{
+ MYODBCDbgEnter();
+
+ bImplicitPrepare = b;
+
+ MYODBCDbgReturn2();
+}
+
SQLRETURN MStatement::setAppParamDesc( MDescriptor *pDescriptor )
{
MYODBCDbgEnter();
@@ -3377,6 +3404,14 @@
MYODBCDbgReturn3( "%p", pDiagnostic );
}
+BOOLEAN MStatement::getImplicitPrepare()
+{
+ MYODBCDbgEnter();
+
+ MYODBCDbgReturn3( "%d", bImplicitPrepare );
+}
+
+
MDescriptor *MStatement::getAppParamDescOrig()
{
MYODBCDbgEnter();
@@ -3651,6 +3686,7 @@
case STATE_S2:
case STATE_S3:
+ setImplicitPrepare( false );
Q_ASSERT( !pResult );
delete pResult;
pResult = NULL;
Modified: trunk/MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp 2006-06-16 07:50:16 UTC (rev 344)
+++ trunk/MYSQLPlus/MYSQLPlusTest/MYSQLPlusTest.cpp 2006-06-16 15:17:04 UTC (rev 345)
@@ -128,7 +128,7 @@
*/
void MYSQLPlusTest::doCreateTable()
{
- SQLWCHAR * psSQL = TEXT("CREATE TABLE tbMyODBCTest ( nUserID MEDIUMINT(8) NOT
NULL AUTO_INCREMENT, vcName VARCHAR(60) NOT NULL, dCreated TIMESTAMP, PRIMARY KEY (
nUserID ), KEY ( vcName ) )");
+ SQLWCHAR * psSQL = TEXT("CREATE TABLE tbMyODBCTest ( nUserID MEDIUMINT(8) NOT
NULL AUTO_INCREMENT, vcName VARCHAR(60) NOT NULL, dCreated TIMESTAMP NULL, PRIMARY KEY (
nUserID ), KEY ( vcName ) )");
MStatement statement( pConnection );
SQLRETURN nReturn = statement.doExecDirect( psSQL, SQL_NTS );
@@ -285,7 +285,7 @@
QCOMPARE( nReturn, (SQLRETURN)SQL_SUCCESS );
strcpy( (char*)szName, "name2" );
- sprintf( (char*)szCreated, "1963-08-17 01:45:00" );
+ sprintf( (char*)szCreated, "2005-01-15 18:30:00" );
nReturn = statement.doExecute();
if ( nReturn != SQL_SUCCESS )
@@ -352,7 +352,7 @@
{
QVERIFY( nStrLenOrInd == 0 );
QVERIFY( strcmp( (const char*)szName, "name2" ) == 0 );
- QVERIFY( strcmp( (const char*)szCreated, "1963-08-17 01:45:00" ) == 0 );
+ QVERIFY( strcmp( (const char*)szCreated, "2005-01-15 18:30:00" ) == 0 );
}
else if ( nRows == 3 )
{
Modified: trunk/MYSQLPlus/include/MStatement.h
===================================================================
--- trunk/MYSQLPlus/include/MStatement.h 2006-06-16 07:50:16 UTC (rev 344)
+++ trunk/MYSQLPlus/include/MStatement.h 2006-06-16 15:17:04 UTC (rev 345)
@@ -89,6 +89,7 @@
/* setters */
BOOLEAN setState( STATE nState );
+ void setImplicitPrepare( BOOLEAN b );
SQLRETURN setAppParamDesc( MDescriptor *pDescriptor ); /*!<
SQL_ATTR_APP_PARAM_DESC */
SQLRETURN setAppRowDesc( MDescriptor *pDescriptor ); /*!<
SQL_ATTR_APP_ROW_DESC */
@@ -124,6 +125,7 @@
/* getters */
MConnection * getConnection();
MDiagnostic * getDiagnostic();
+ BOOLEAN getImplicitPrepare();
MDescriptor* getAppParamDescOrig(); /*!< Original app param desc.
*/
MDescriptor* getAppRowDescOrig(); /*!< Original app row desc.
*/
@@ -165,33 +167,36 @@
SQLRETURN doStateRollBack( STATE nState );
private:
- STATE nState; /*!< our current state
*/
- MDiagnostic * pDiagnostic; /*!< Statements diagnostic.
*/
- MDescriptor * pAppParamDescOrig; /*!< Original app param desc.
*/
- MDescriptor * pAppRowDescOrig; /*!< Original app row desc.
*/
- MResult * pResult; /*!< our result (null if N/A)
*/
+ STATE nState; /*!< our current state
*/
+ MDiagnostic * pDiagnostic; /*!< Statements diagnostic.
*/
+ MDescriptor * pAppParamDescOrig; /*!< Original app param desc.
*/
+ MDescriptor * pAppRowDescOrig; /*!< Original app row desc.
*/
+ MResult * pResult; /*!< our result (null if N/A)
*/
+ BOOLEAN bImplicitPrepare; /*!< true if prepare done implicitly ie
doExecDirect or doTables */
+ MDescriptor * pAppParamDesc; /*!< SQL_ATTR_APP_PARAM_DESC
*/
+ MDescriptor * pAppRowDesc; /*!< SQL_ATTR_APP_ROW_DESC
*/
+ SQLUINTEGER nAsyncEnable; /*!< SQL_ATTR_ASYNC_ENABLE
*/
+ SQLUINTEGER nConcurrency; /*!< SQL_ATTR_CONCURRENCY
*/
+ SQLUINTEGER nCursorScrollable; /*!< SQL_ATTR_CURSOR_SCROLLABLE
*/
+ SQLUINTEGER nCursorSensitivity; /*!< SQL_ATTR_CURSOR_SENSITIVITY
*/
+ SQLUINTEGER nCursorType; /*!< SQL_ATTR_CURSOR_TYPE
*/
+ SQLUINTEGER nEnableAutoIPD; /*!< SQL_ATTR_ENABLE_AUTO_IPD
*/
+ SQLPOINTER pFetchBookmarkPtr; /*!< SQL_ATTR_FETCH_BOOKMARK_PTR
*/
+ MDescriptor * pImpParamDesc; /*!< SQL_ATTR_IMP_PARAM_DESC
*/
+ MDescriptor * pImpRowDesc; /*!< SQL_ATTR_IMP_ROW_DESC
*/
+ SQLUINTEGER nKeysetSize; /*!< SQL_ATTR_KEYSET_SIZE
*/
+ SQLUINTEGER nMaxLength; /*!< SQL_ATTR_MAX_LENGTH
*/
+ SQLUINTEGER nMaxRows; /*!< SQL_ATTR_MAX_ROWS
*/
+ SQLUINTEGER nMetadataID; /*!< SQL_ATTR_METADATA_ID
*/
+ SQLUINTEGER nNoscan; /*!< SQL_ATTR_NOSCAN
*/
+ SQLUINTEGER nQueryTimeout; /*!< SQL_ATTR_QUERY_TIMEOUT
*/
+ SQLUINTEGER nRetrieveData; /*!< SQL_ATTR_RETRIEVE_DATA
*/
+/* SQLUINTEGER nRowNumber; */ /*!< SQL_ATTR_ROW_NUMBER
*/
+ SQLUINTEGER nSimulateCursor; /*!< SQL_ATTR_SIMULATE_CURSOR
*/
+ SQLUINTEGER nUseBookmarks; /*!< SQL_ATTR_USE_BOOKMARKS
*/
- MDescriptor * pAppParamDesc; /*!< SQL_ATTR_APP_PARAM_DESC
*/
- MDescriptor * pAppRowDesc; /*!< SQL_ATTR_APP_ROW_DESC
*/
- SQLUINTEGER nAsyncEnable; /*!< SQL_ATTR_ASYNC_ENABLE
*/
- SQLUINTEGER nConcurrency; /*!< SQL_ATTR_CONCURRENCY
*/
- SQLUINTEGER nCursorScrollable; /*!< SQL_ATTR_CURSOR_SCROLLABLE
*/
- SQLUINTEGER nCursorSensitivity; /*!< SQL_ATTR_CURSOR_SENSITIVITY
*/
- SQLUINTEGER nCursorType; /*!< SQL_ATTR_CURSOR_TYPE
*/
- SQLUINTEGER nEnableAutoIPD; /*!< SQL_ATTR_ENABLE_AUTO_IPD
*/
- SQLPOINTER pFetchBookmarkPtr; /*!< SQL_ATTR_FETCH_BOOKMARK_PTR
*/
- MDescriptor * pImpParamDesc; /*!< SQL_ATTR_IMP_PARAM_DESC
*/
- MDescriptor * pImpRowDesc; /*!< SQL_ATTR_IMP_ROW_DESC
*/
- SQLUINTEGER nKeysetSize; /*!< SQL_ATTR_KEYSET_SIZE
*/
- SQLUINTEGER nMaxLength; /*!< SQL_ATTR_MAX_LENGTH
*/
- SQLUINTEGER nMaxRows; /*!< SQL_ATTR_MAX_ROWS
*/
- SQLUINTEGER nMetadataID; /*!< SQL_ATTR_METADATA_ID
*/
- SQLUINTEGER nNoscan; /*!< SQL_ATTR_NOSCAN
*/
- SQLUINTEGER nQueryTimeout; /*!< SQL_ATTR_QUERY_TIMEOUT
*/
- SQLUINTEGER nRetrieveData; /*!< SQL_ATTR_RETRIEVE_DATA
*/
-/* SQLUINTEGER nRowNumber; */ /*!< SQL_ATTR_ROW_NUMBER
*/
- SQLUINTEGER nSimulateCursor; /*!< SQL_ATTR_SIMULATE_CURSOR
*/
- SQLUINTEGER nUseBookmarks; /*!< SQL_ATTR_USE_BOOKMARKS
*/
+
+ BOOLEAN
};
#endif
| Thread |
|---|
| • Connector/ODBC 5 commit: r345 - in trunk/MYSQLPlus: MYSQLPlusLib MYSQLPlusTest include | pharvey | 16 Jun |