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/include | pharvey | 17 Aug |