List:Commits« Previous MessageNext Message »
From:pharvey Date:August 17 2006 6:02am
Subject:Connector/ODBC 5 commit: r491 - in trunk: MYODBCDriver/MYODBCDriverLib MYSQLPlus/MYSQLPlusLib MYSQLPlus/include
View as plain text  
Removed:
   trunk/MYODBCDriver/MYODBCDriverLib/SQLExtendedFetch.cpp
Modified:
   trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.pro
   trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.vpj
   trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResult.h
   trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
   trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h
   trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
   trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.h
   trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
   trunk/MYSQLPlus/include/MStatement.h
Log:
- started implementing block cursors to support SQLSetPos, SQLFetch, SQLFetchScroll etc
- removed SQLExtendedFetch as deprecated functions/features not a concern at this time


Modified: trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.pro
===================================================================
--- trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.pro	2006-08-15 19:18:05 UTC (rev
490)
+++ trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.pro	2006-08-17 06:02:08 UTC (rev
491)
@@ -83,7 +83,6 @@
 		SQLEndTran.cpp \
 		SQLExecDirectW.cpp \
 		SQLExecute.cpp \
-		SQLExtendedFetch.cpp \
 		SQLFetch.cpp \
 		SQLFetchScroll.cpp \
 		SQLForeignKeysW.cpp \

Modified: trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.vpj
===================================================================
--- trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.vpj	2006-08-15 19:18:05 UTC (rev
490)
+++ trunk/MYODBCDriver/MYODBCDriverLib/MYODBCDriverLib.vpj	2006-08-17 06:02:08 UTC (rev
491)
@@ -205,7 +205,6 @@
 			<F N="SQLEndTran.cpp"/>
 			<F N="SQLExecDirectW.cpp"/>
 			<F N="SQLExecute.cpp"/>
-			<F N="SQLExtendedFetch.cpp"/>
 			<F N="SQLFetch.cpp"/>
 			<F N="SQLFetchScroll.cpp"/>
 			<F N="SQLForeignKeysW.cpp"/>

Deleted: trunk/MYODBCDriver/MYODBCDriverLib/SQLExtendedFetch.cpp
===================================================================
--- trunk/MYODBCDriver/MYODBCDriverLib/SQLExtendedFetch.cpp	2006-08-15 19:18:05 UTC (rev
490)
+++ trunk/MYODBCDriver/MYODBCDriverLib/SQLExtendedFetch.cpp	2006-08-17 06:02:08 UTC (rev
491)
@@ -1,55 +0,0 @@
-/*! 
-    \file     SQLExtendedFetch.c
-    \author   Peter Harvey <pharvey@stripped>
-              Copyright MySQL AB 2004-2006 Released under GPL.
-    \version  Connector/ODBC v5
-    \date     2006
-    \brief    Contains the SQLExtendedFetch entry point and shadow function.
-*/
-#include "MYODBCDriverInternal.h"
-
-/*!
-    \brief  <B>ODBC 1.0 API</B>
-            <BR>
-            Fetches the specified rowset of data from the result set and
-            returns data for all bound columns. Rowsets can be specified
-            at an absolute or relative position.
-
-    \param  hStm                Viable statement handle.
-    \param  nFetchOrientation   Type of fetch.
-    \param  nFetchOffset        Number of the row to fetch.
-    \param  pnRowCountPtr       Pointer to a buffer in which to return the number of rows
actually fetched.
-    \param  pnRowStatusArray    Pointer to an array in which to return the status of each
row.
-
-    \retval SQL_SUCCESS             Request processed ok.
-    \retval SQL_SUCCESS_WITH_INFO   Request was probably processed ok - check diagnostic.
-    \retval SQL_STILL_EXECUTING     Still executing from a previous call.     
-    \retval SQL_ERROR               Request failed.
-    \retval SQL_NO_DATA             No data affected.
-    \retval SQL_INVALID_HANDLE      Invalid handle was provided.
-
-    \sa     SQLBindCol
-            SQLBulkOperations
-            SQLCancel
-            SQLDescribeCol
-            SQLExecDirect
-            SQLExecute
-            SQLNumResultCols
-            SQLSetPos
-            SQLSetStmtAttr
-*/
-SQLRETURN SQL_API SQLExtendedFetch( SQLHSTMT        hStm,
-                                    SQLUSMALLINT    nFetchOrientation,
-                                    SQLINTEGER      nFetchOffset,
-                                    SQLUINTEGER *   pnRowCount,
-                                    SQLUSMALLINT *  pnRowStatusArray )
-{
-    MYODBCDbgEnter();
-
-    if ( !hStm )
-        MYODBCDbgReturn( SQL_INVALID_HANDLE );
-
-    MYODBCDbgReturn( ((MStatement*)hStm)->doExtendedFetch( nFetchOrientation,
nFetchOffset, pnRowCount, pnRowStatusArray ) );
-}
-
-

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResult.cpp	2006-08-17 06:02:08 UTC (rev 491)
@@ -113,6 +113,8 @@
 
     nState          = STATE_UNINITIALIZED;
     bBuffered       = true;
+    nRow            = 0;
+    nPos            = 1;
     nRowsAffected   = 0;
     /*!
         \internal
@@ -136,6 +138,38 @@
     MYODBCDbgReturn2();
 }
 
+/*! 
+    \brief  Sets the cursor position in a rowset (a subset of the resultset).
+
+            Allows an application to refresh data in the rowset or to update or 
+            delete data in the resultset.
+            
+    \param  nRowNumber  1-based position in rowset to perform operation. 0 = all rows in
rowset.
+    \param  nOperation  Operation;
+                            - SQL_POSITION
+                            - SQL_REFRESH
+                            - SQL_UPDATE
+                            - SQL_DELETE
+    \param  nLockType   How to lock the row(s) after operation;
+                            - SQL_LOCK_NO_CHANGE
+                            - SQL_LOCK_EXCLUSIVE
+                            - SQL_LOCK_UNLOCK 
+    \return SQLRETURN
+
+    \retval SQL_SUCCESS
+    \retval SQL_SUCCESS_WITH_INFO
+    \retval SQL_ERROR  
+
+    \sa     doFetch
+            doFetchScroll
+            doBulkOperations
+*/
+SQLRETURN MResult::setPos( SQLUSMALLINT nRowNumber, SQLUSMALLINT nOperation, SQLUSMALLINT
nLockType )
+{
+    MYODBCDbgEnter();
+    MYODBCDbgReturn( SQL_ERROR );
+}
+
 MResult::STATE MResult::getState()
 {
     MYODBCDbgEnter();
@@ -398,6 +432,103 @@
     MYODBCDbgReturn3( "%d", bBuffered );
 }
 
+/*!
+    \brief  Fetchs the next row/rowset from the resultset.
+
+*/
+SQLRETURN MResult::doFetch()
+{
+    MYODBCDbgEnter();
+
+    MYODBCDbgReturn( doFetchScroll( SQL_FETCH_NEXT, 0 ) );
+}
+
+/*!
+    \brief  Fetchs the desired row/rowset from the resultset.
+
+*/
+SQLRETURN MResult::doFetchScroll( SQLSMALLINT nFetchOrientation, SQLINTEGER nFetchOffset
)
+{
+    MYODBCDbgEnter();
+
+    switch ( nFetchOrientation )
+    {
+        case SQL_FETCH_NEXT:
+            /*!
+                \internal ODBC RULE
+
+                Return the next rowset. This is equivalent to calling SQLFetch.
SQLFetchScroll ignores the value 
+                of FetchOffset.
+            */
+            MYODBCDbgReturn( getResult()->doNext() );
+
+        case SQL_FETCH_PRIOR:
+            /*!
+                \internal ODBC RULE
+
+                Return the prior rowset. SQLFetchScroll ignores the value of FetchOffset.
+            */
+            MYODBCDbgReturn( getResult()->doPrev() );
+
+        case SQL_FETCH_RELATIVE:
+            /*!
+                \internal ODBC RULE
+
+                Return the rowset FetchOffset from the start of the current rowset.
+            */
+            {
+            }
+            break;
+
+        case SQL_FETCH_ABSOLUTE:
+            /*!
+                \internal ODBC RULE
+
+                Return the rowset starting at row FetchOffset.
+            */
+            {
+            }
+            break;
+
+        case SQL_FETCH_FIRST:
+            /*!
+                \internal ODBC RULE
+
+                Return the first rowset in the result set. SQLFetchScroll ignores the
value of FetchOffset.
+            */
+            MYODBCDbgReturn( getResult()->doFirst() );
+
+        case SQL_FETCH_LAST:
+            /*!
+                \internal ODBC RULE
+
+                Return the last complete rowset in the result set. SQLFetchScroll ignores
the value of FetchOffset.
+            */
+            MYODBCDbgReturn( getResult()->doLast() );
+
+        case SQL_FETCH_BOOKMARK:
+            /*!
+                \internal ODBC RULE
+
+                Return the rowset FetchOffset rows from the bookmark specified by the
SQL_ATTR_FETCH_BOOKMARK_PTR 
+                statement attribute.
+            */
+            {
+            }
+            break;
+
+        default:
+            /*!
+                \internal ODBC RULE (DM)
+
+                The value specified for the argument FetchOrientation was invalid.
+            */
+            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY106 ) );
+    }
+
+    MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0, tr(
QString( "Control reached unexpected place %1:%2" ).arg( __FILE__ ).arg( __LINE__ ) ) )
);
+}
+
 BOOLEAN MResult::isValidColumn( uint nColumn )
 {
     BOOLEAN b;

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResult.h	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResult.h	2006-08-17 06:02:08 UTC (rev 491)
@@ -107,6 +107,7 @@
     virtual ~MResult();
 
     /* setters */
+    virtual SQLRETURN setPos( SQLUSMALLINT nRowNumber, SQLUSMALLINT nOperation,
SQLUSMALLINT nLockType );
     virtual SQLRETURN setData( uint nColumn, const QVariant &variantData ) = 0;
     virtual SQLRETURN setRow( qulonglong nRow ) = 0;
 
@@ -121,19 +122,12 @@
     virtual SQLRETURN   getRows( qulonglong *pnRows ) = 0;
 
     /* doers */
-    virtual SQLRETURN doAppend() = 0;
-    virtual SQLRETURN doClear() = 0;
-    virtual SQLRETURN doDelete() = 0;
+    virtual SQLRETURN doPrepare( MCommand *pCommand ) = 0;
     virtual SQLRETURN doExecute() = 0;
-    virtual SQLRETURN doFirst() = 0;
-    virtual SQLRETURN doInsert() = 0;
-    virtual SQLRETURN doLast() = 0;
-    virtual SQLRETURN doNext() = 0;
-    virtual SQLRETURN doPrepare( MCommand *pCommand ) = 0;
-    virtual SQLRETURN doPrev() = 0;
-    virtual SQLRETURN doSkip( qlonglong nRows ) = 0;
-    virtual SQLRETURN doCommit() = 0;
 
+    virtual SQLRETURN doFetch();
+    virtual SQLRETURN doFetchScroll( SQLSMALLINT nFetchOrientation, SQLINTEGER
nFetchOffset );
+
     /* isers */
     virtual BOOLEAN isValidColumn( uint nColumn );
     virtual BOOLEAN isValidRow() = 0;
@@ -141,6 +135,8 @@
     BOOLEAN         isBuffered();
     virtual BOOLEAN isDirty() = 0;
 
+// SQL_ATTR_ROW_ARRAY_SIZE - statement attribute specifies the number of rows in the
rowset.
+
 protected:
     MResultGetData  resultGetData;      /*!< to support getData()       */
     MResultPutData  resultPutData;      /*!< to support doPutData()     */
@@ -262,12 +258,25 @@
     /*@}*/
 
     /* doers */
+    virtual SQLRETURN doAppend() = 0;
+    virtual SQLRETURN doClear() = 0;
+    virtual SQLRETURN doDelete() = 0;
+    virtual SQLRETURN doFirst() = 0;
+    virtual SQLRETURN doInsert() = 0;
+    virtual SQLRETURN doLast() = 0;
+    virtual SQLRETURN doNext() = 0;
+    virtual SQLRETURN doPrev() = 0;
+    virtual SQLRETURN doSkip( qlonglong nRows ) = 0;
+    virtual SQLRETURN doCommit() = 0;
+
     virtual SQLRETURN doStateRollBack( STATE nState ) = 0;
     SQLRETURN doLoadMetaDataField( unsigned int nField, MYSQL_FIELD *pField,
MDescriptorIRD *pDescriptor );
 
 private:
     STATE           nState;         /*!< our state                                    
                                                                 */
     BOOLEAN         bBuffered;      /*!< true causes entire resultset to get pulled to
client at execute (enabling other features) (default=true)       */
+    qulonglong      nRow;           /*!< Current row number (1st row of rowset) where
0=eof/bof. We need to keep track of this due to lack of functionality in client.  */
+    SQLUSMALLINT    nPos;           /*!< Pos/row in rowset which is current (1 to
rowset size). Affects getData() etc. See also; setPos().              */
     qulonglong      nRowsAffected;  /*!< number of rows affected by a non-SELECT
statement (catalog and SHOW statements count as SELECT in this case)   */
 };
 

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp	2006-08-17 06:02:08 UTC (rev 491)
@@ -7,7 +7,6 @@
 
     setObjectName( "MResultPlus" ); // we avoid Q_OBJECT by avoiding className
 
-    nRow = 0;
     stringlistTableTypesPossible << "SYSTEM TABLE" << "TABLE";
     setState( STATE_INITIALIZED );
 
@@ -1434,6 +1433,7 @@
         case STATE_EXECUTED:
             listResults.clear();
             nRow = 0;
+            nPos = 1;
             setRowsAffected( 0 );
 //            getImpParamDesc()->doClear();
             getImpRowDesc()->doClear();

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h	2006-08-17 06:02:08 UTC (rev 491)
@@ -57,18 +57,8 @@
     SQLRETURN getTypeInfo( SQLSMALLINT nDataType );   /*<! \sa SQLGetTypeInfo */
 
     /* doers */
-    SQLRETURN doAppend();
-    SQLRETURN doClear();
-    SQLRETURN doDelete();
+    SQLRETURN doPrepare( MCommand *pCommand );
     SQLRETURN doExecute();
-    SQLRETURN doFirst();
-    SQLRETURN doInsert();
-    SQLRETURN doLast();
-    SQLRETURN doNext();
-    SQLRETURN doPrepare( MCommand *pCommand );
-    SQLRETURN doPrev();
-    SQLRETURN doSkip( qlonglong nRows );
-    SQLRETURN doCommit();
 
     SQLRETURN doColumns( const QString &stringCatalogFilter, const QString
&stringSchemaFilter, const QString &stringTableFilter, const QString
&stringColumnFilter );
     SQLRETURN doForeignKeys( const QString &stringPKCatalog, const QString
&stringPKSchema, const QString &stringPKTable, const QString
&stringFKCatalog, const QString &stringFKSchema, const QString &stringFKTable
);
@@ -88,6 +78,17 @@
 
 protected:
     /* doers */
+    SQLRETURN doAppend();
+    SQLRETURN doClear();
+    SQLRETURN doDelete();
+    SQLRETURN doFirst();
+    SQLRETURN doInsert();
+    SQLRETURN doLast();
+    SQLRETURN doNext();
+    SQLRETURN doPrev();
+    SQLRETURN doSkip( qlonglong nRows );
+    SQLRETURN doCommit();
+
     SQLRETURN doStateRollBack( STATE nState );
 
     SQLRETURN doAppendVarChar();
@@ -100,7 +101,6 @@
     QList<QVector<QVariant>>    listResults;
 #endif
 
-    qulonglong                  nRow; /* 1 -based (0 as BOS/EOS) */
     QStringList                 stringlistTableTypesPossible; /*!< supports SQLTables
*/
 
     /*! \todo move some or all of these to MConnection */

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.cpp	2006-08-17 06:02:08 UTC (rev 491)
@@ -14,7 +14,6 @@
 
     setState( STATE_UNINITIALIZED );
     pRes        = NULL;
-    nRow        = 0;
 
     /*!
         \internal
@@ -96,16 +95,40 @@
 {
     MYODBCDbgEnter();
 
-    /*!
-        \internal
-        \todo
+    if ( getState() < STATE_EXECUTED )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
 
-        Implement. 
+    if ( nRow == this->nRow )
+        MYODBCDbgReturn( SQL_SUCCESS );
 
-        \sa MResultStmt::setRow
-    */
+    resultGetData.doClear();
 
-    MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("setRow() not supported in this context") ) );
+    if ( !isBuffered() )
+    {
+        if ( nRow < this->nRow )
+            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("setRow() not fully supported for unbuffered resultset") ) );
+
+        MYODBCDbgReturn( doSkip( this->nRow - nRow ) );
+    }
+
+    if ( nRow < this->nRow )
+    {
+        if ( getStatement()->getCursorType() == SQL_CURSOR_FORWARD_ONLY )
+            MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("setRow() not supported when SQL_CURSOR_FORWARD_ONLY") ) );
+    }
+
+    if ( nRow == 0 )
+    {
+        this->nRow = 0;
+        MYODBCDbgReturn( SQL_SUCCESS );
+    }
+    else if ( !isValidRow( nRow ) )
+    {
+        this->nRow = 0;
+        MYODBCDbgReturn( SQL_NO_DATA );
+    }
+
+    MYODBCDbgReturn( doSeek( nRow ) );
 }
 
 /*! 
@@ -1011,6 +1034,7 @@
                 mysql_free_result( pRes );
             pRes = NULL;
             nRow = 0;
+            nPos = 1;
             setRowsAffected( 0 );
             resultGetData.doClear();
             resultPutData.doClear();

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultRes.h	2006-08-17 06:02:08 UTC (rev 491)
@@ -32,32 +32,32 @@
     SQLRETURN getRow( qulonglong *pnRow );
     SQLRETURN getRows( qulonglong *pnRows );
 
+    SQLRETURN doPrepare( MCommand *pCommand );
+    SQLRETURN doExecute();
+
+    BOOLEAN isValidRow();
+    BOOLEAN isValidRow( qulonglong nRow );
+    BOOLEAN isDirty();
+
+protected:
+
+    /* doers */
     SQLRETURN doAppend();
     SQLRETURN doClear();
     SQLRETURN doDelete();
-    SQLRETURN doExecute();
     SQLRETURN doFirst();
     SQLRETURN doInsert();
     SQLRETURN doLast();
     SQLRETURN doNext();
-    SQLRETURN doPrepare( MCommand *pCommand );
     SQLRETURN doPrev();
     SQLRETURN doSkip( qlonglong nRows );
     SQLRETURN doCommit();
 
-    BOOLEAN isValidRow();
-    BOOLEAN isValidRow( qulonglong nRow );
-    BOOLEAN isDirty();
-
-protected:
-
-    /* doers */
     SQLRETURN doStateRollBack( STATE nState );
 
 private:
     MCommand *      pCommand;                   /*!< the command we are supporting    
                                                                         */
     MYSQL_RES *     pRes;                       /*!< current resultset as per
mysql_use_result() / mysql_store_result()                                         */
-    qulonglong      nRow;                       /*!< Current row number where
0=eof/bof. We need to keep track of this due to lack of functionality in client.  */
 
     /* setters */
     SQLRETURN doSeek( qulonglong nRow );

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp	2006-08-17 06:02:08 UTC (rev 491)
@@ -14,7 +14,6 @@
 
     setState( STATE_UNINITIALIZED );
     pbindColumns    = NULL;
-    nRow            = 0;
 
     if ( pStatement->getCursorType() == SQL_CURSOR_FORWARD_ONLY ) /* this also implies
SQL_ATTR_CURSOR_SCROLLABLE = SQL_NONSCROLLABLE */
         setBuffered( false );
@@ -1040,6 +1039,7 @@
             if ( !mysql_stmt_reset( pstm ) )
                 MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
             nRow = 0;
+            nPos = 1;
             setRowsAffected( 0 );
             resultGetData.doClear();
             setState( STATE_PREPARED );

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.h	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultStmt.h	2006-08-17 06:02:08 UTC (rev 491)
@@ -32,6 +32,7 @@
             - There may be limitations due to incomplete implementation of MYSQL_STMT
based 
             functionality on the server. For example some SQL is not supported at this
time. 
             - Batched (multiple commands in a single statement string) is not supported.
+            - Block cursor and the use of app provided buffers to process are not
supported in MYSQL_STMT
 
             The following are considerations with regard to unbuffered result-sets;
 
@@ -61,33 +62,33 @@
     SQLRETURN getRow( qulonglong *pnRow );
     SQLRETURN getRows( qulonglong *pnRows );
 
+    SQLRETURN doPrepare( MCommand *pCommand );
+    SQLRETURN doExecute();
+
+    BOOLEAN isValidRow();
+    BOOLEAN isValidRow( qulonglong nRow );
+    BOOLEAN isDirty();
+
+protected:
+
+    /* doers */
     SQLRETURN doAppend();
     SQLRETURN doClear();
     SQLRETURN doDelete();
-    SQLRETURN doExecute();
     SQLRETURN doFirst();
     SQLRETURN doInsert();
     SQLRETURN doLast();
     SQLRETURN doNext();
-    SQLRETURN doPrepare( MCommand *pCommand );
     SQLRETURN doPrev();
     SQLRETURN doSkip( qlonglong nRows );
     SQLRETURN doCommit();
 
-    BOOLEAN isValidRow();
-    BOOLEAN isValidRow( qulonglong nRow );
-    BOOLEAN isDirty();
-
-protected:
-
-    /* doers */
     SQLRETURN doStateRollBack( STATE nState );
 
 private:
     MYSQL_STMT *    pstm;               /*!< MySQL prepared statement                 
                                                                 */
     MYSQL_BIND *    pbindColumns;       /*!< binds for every col in res - loaded witb
call to mysql_stmt_fetch_column() as needed                       */
     MCommand *      pCommand;           /*!< the command we are supporting            
                                                                 */
-    qulonglong      nRow;               /*!< Current row number where 0=eof/bof. We
need to keep track of this due to lack of functionality in client.  */
 
     /* setters */
     SQLRETURN doSeek( qulonglong nRow );

Modified: trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp	2006-08-17 06:02:08 UTC (rev 491)
@@ -2581,7 +2581,7 @@
     MYODBCDbgReturn( nReturn );
 }
 
-SQLRETURN MStatement::doExtendedFetch( SQLUSMALLINT nFetchOrientation, SQLINTEGER
nFetchOffset, SQLUINTEGER *pnRowCountPtr, SQLUSMALLINT *pnRowStatusArray )
+SQLRETURN MStatement::doFetch()
 {
     MYODBCDbgEnter();
 
@@ -2592,10 +2592,51 @@
     */
     pDiagnostic->doClear();
 
-    MYODBCDbgReturn( SQL_ERROR );
+    /*!
+        \internal ODBC RULE (DM)
+
+        The specified StatementHandle was not in an executed state. 
+        The function was called without first calling SQLExecDirect, 
+        SQLExecute or a catalog function.
+    */
+    if ( !isExecuted() )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+    /*!
+        \internal ODBC RULE (DM)
+
+        An asynchronously executing function (not this one) was called 
+        for the StatementHandle and was still executing when this function 
+        was called.
+    */
+    if ( isAsyncInProgress() )
+        MYODBCDbgReturn( getDiagnostic()->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( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+    /*!
+        \internal ODBC RULE (DM)
+
+        The StatementHandle was in an executed state, but no result 
+        set was associated with the StatementHandle.
+    */
+    if ( getState() == STATE_S4 )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_24000 ) );
+
+    setState( STATE_S6 );
+
+    MYODBCDbgReturn( getResult()->doFetch() );
 }
 
-SQLRETURN MStatement::doFetch()
+SQLRETURN MStatement::doFetchScroll( SQLSMALLINT nFetchOrientation, SQLINTEGER
nFetchOffset )
 {
     MYODBCDbgEnter();
 
@@ -2629,29 +2670,74 @@
     /*!
         \internal ODBC RULE (DM)
 
+        SQLFetchScroll was called for a StatementHandle after SQLExtendedFetch was called
and before SQLFreeStmt 
+        with SQL_CLOSE was called.
+
+        \note
+
+        We do not support/implement SQLExtendedFetch (we may or may not in the future).
+    */
+    /* do nothing */
+
+    /*!
+        \internal ODBC RULE (DM)
+
         The StatementHandle was in an executed state, but no result 
         set was associated with the StatementHandle.
     */
     if ( getState() == STATE_S4 )
         MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_24000 ) );
 
-    setState( STATE_S6 );
+    /*!
+        \internal ODBC RULE
 
-    MYODBCDbgReturn( getResult()->doNext() );
-}
+        The value of the SQL_ATTR_CURSOR_TYPE statement attribute was
SQL_CURSOR_FORWARD_ONLY, and the 
+        value of argument FetchOrientation was not SQL_FETCH_NEXT.
+    */
+    if ( getCursorType() == SQL_CURSOR_FORWARD_ONLY && nFetchOrientation !=
SQL_FETCH_NEXT )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY106 ) );
 
-SQLRETURN MStatement::doFetchScroll( SQLSMALLINT nFetchOrientation, SQLINTEGER
nFetchOffset )
-{
-    MYODBCDbgEnter();
+    /*!
+        \internal ODBC RULE 
 
+        The value of the SQL_ATTR_CURSOR_SCROLLABLE statement attribute was
SQL_NONSCROLLABLE, and the 
+        value of argument FetchOrientation was not SQL_FETCH_NEXT.
+    */
+    if ( getCursorScrollable() == SQL_NONSCROLLABLE && nFetchOrientation !=
SQL_FETCH_NEXT )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY106 ) );
+
     /*!
         \internal ODBC RULE
 
-        We clear diagnostic each time an ODBC API call is made (with exceptions).
+        The value specified with the SQL_ATTR_CURSOR_TYPE statement attribute was
SQL_CURSOR_KEYSET_DRIVEN, 
+        but the value specified with the SQL_ATTR_KEYSET_SIZE statement attribute was
greater than 0 and 
+        less than the value specified with the SQL_ATTR_ROW_ARRAY_SIZE statement
attribute.
     */
-    pDiagnostic->doClear();
+    if ( getCursorType() == SQL_CURSOR_KEYSET_DRIVEN && ( getKeysetSize() > 0
&& getKeysetSize() < getRowArraySize() )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY107 ) );
 
-    MYODBCDbgReturn( SQL_ERROR );
+    /*!
+        \internal ODBC RULE (DM)
+
+        The argument FetchOrientation was SQL_FETCH_BOOKMARK, and the
SQL_ATTR_USE_BOOKMARKS 
+        statement attribute was set to SQL_UB_OFF.
+    */
+    if ( nFetchOrientation == SQL_FETCH_BOOKMARK && getUseBookmarks() ==
SQL_UB_OFF )
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY106 ) );
+
+    /*!
+        \internal ODBC RULE 
+        \todo Handle invalid bookmark.
+
+        The argument FetchOrientation was SQL_FETCH_BOOKMARK, and the bookmark pointed to
by the value 
+        in the SQL_ATTR_FETCH_BOOKMARK_PTR statement attribute was not valid or was a
null pointer.
+    */
+    if ( nFetchOrientation == SQL_FETCH_BOOKMARK && getFetchBookmarkPtr() == NULL
)
+        MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY111 ) );
+
+    setState( STATE_S6 );
+
+    MYODBCDbgReturn( getResult()->doFetchScroll( nFetchOrientation, nFetchOffset ) );
 }
 
 SQLRETURN MStatement::doForeignKeys( SQLWCHAR *psPKCatalog, SQLSMALLINT nLength1,
SQLWCHAR *psPKSchema, SQLSMALLINT nLength2, SQLWCHAR *psPKTable, SQLSMALLINT nLength3,
SQLWCHAR *psFKCatalog, SQLSMALLINT nLength4, SQLWCHAR *psFKSchema, SQLSMALLINT nLength5,
SQLWCHAR *psFKTable, SQLSMALLINT nLength6 )

Modified: trunk/MYSQLPlus/include/MStatement.h
===================================================================
--- trunk/MYSQLPlus/include/MStatement.h	2006-08-15 19:18:05 UTC (rev 490)
+++ trunk/MYSQLPlus/include/MStatement.h	2006-08-17 06:02:08 UTC (rev 491)
@@ -66,7 +66,6 @@
     SQLRETURN doDescribeParam( SQLUSMALLINT nParameterNumber, SQLSMALLINT *pnDataTypePtr,
SQLUINTEGER *pnParameterSizePtr, SQLSMALLINT *pnDecimalDigitsPtr, SQLSMALLINT
*pnNullablePtr );
     SQLRETURN doExecDirect( SQLWCHAR *psStatementText, SQLINTEGER nTextLength );
     SQLRETURN doExecute();
-    SQLRETURN doExtendedFetch( SQLUSMALLINT nFetchOrientation, SQLINTEGER nFetchOffset,
SQLUINTEGER *pnRowCountPtr, SQLUSMALLINT *pnRowStatusArray );
     SQLRETURN doFetch();
     SQLRETURN doFetchScroll( SQLSMALLINT nFetchOrientation, SQLINTEGER nFetchOffset );
     SQLRETURN doForeignKeys( SQLWCHAR *psPKCatalogName, SQLSMALLINT nNameLength1,
SQLWCHAR *psPKSchemaName, SQLSMALLINT nNameLength2, SQLWCHAR *psPKTableName, SQLSMALLINT
nNameLength3, SQLWCHAR *psFKCatalogName, SQLSMALLINT nNameLength4, SQLWCHAR
*psFKSchemaName, SQLSMALLINT nNameLength5, SQLWCHAR *psFKTableName, SQLSMALLINT
nNameLength6 );

Thread
Connector/ODBC 5 commit: r491 - in trunk: MYODBCDriver/MYODBCDriverLib MYSQLPlus/MYSQLPlusLib MYSQLPlus/includepharvey17 Aug