List:Commits« Previous MessageNext Message »
From:pharvey Date:June 16 2006 3:17pm
Subject:Connector/ODBC 5 commit: r345 - in trunk/MYSQLPlus: MYSQLPlusLib MYSQLPlusTest include
View as plain text  
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 includepharvey16 Jun