Modified:
trunk/SDK/MYSQLPlus/Library/MResult.cpp
trunk/SDK/MYSQLPlus/Library/MResult.h
trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
trunk/SDK/MYSQLPlus/Library/MResultPlus.h
trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
trunk/SDK/MYSQLPlus/Library/MResultRes.h
Log:
- changes/additions for block-cursor support
Modified: trunk/SDK/MYSQLPlus/Library/MResult.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResult.cpp 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResult.cpp 2006-09-18 06:55:48 UTC (rev 548)
@@ -125,11 +125,14 @@
nResultSetRows = 0; // no rows in ResultSet
nRowsAffected = 0; // no rows affected
nRowSetRow = 1; // First row in RowSet (we
must always be 1 - RowSetSize and pref. 1 - RowSetRows).
- nRowSetRows = 1; // same as nRowSetSize
+ nRowSetRows = 0; // no valid rows
nRowSetSize = 1; // single row cursor
nState = STATE_UNINITIALIZED; // our state
nSimulateCursor = SIMULATE_CURSOR_TRY_UNIQUE; // we try to ensure pos
update/delete affects 1 row but in case of no unique row id - we may affect more than 1
row
+ vectorStatus.resize( 1 );
+ vectorStatus[0] = SQL_ROW_NOROW;
+
/*!
\internal
\note
@@ -409,13 +412,24 @@
{
MYODBCDbgEnter();
+ /*!
+ \internal ODBC RULE
+ \todo
+
+ We are glossing over the finer points in the ODBC spec. here. We simply do not
allow
+ the size to change once the 'ball is in motion'.
+ */
+ if ( getState() > STATE_INITIALIZED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( nRowSetSize < 1 )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("RowSetSize must be > 0.") ) );
this->nRowSetSize = nRowSetSize;
- // ensure that RowSetRow is not outside of RowSetSize...
- nRowSetRow = 1;
+ vectorStatus.resize( nRowSetSize );
+ setBeforeStart();
+
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -1477,7 +1491,7 @@
BOOLEAN b = isValidResultSetRow();
if ( b )
- b = !( nRowSetRow > 0 && ( nRowSetRow <= nRowSetRows ) );
+ b = !( getRowSetRow() > 0 && ( getRowSetRow() <= getRowSetRows() )
);
MYODBCDbgReturn3( "%d", b );
}
@@ -1801,6 +1815,12 @@
this->nRowSetRows = nRowSetRows;
+ while ( nRowSetRows < getRowSetSize() )
+ {
+ vectorStatus[nRowSetRows] = SQL_ROW_NOROW;
+ nRowSetRows++;
+ }
+
MYODBCDbgReturn2();
}
@@ -1851,7 +1871,7 @@
{
if ( MDescriptorRecordIRD::isVariableLength(
resultGetData.pDescriptorRecordIRD->getConciseType() ) )
{
- if ( resultGetData.nColumn == 0 || *(resultGetData.pnBytesRemaining) == 0 ||
vectorRows.at( resultGetData.nRow ).vectorColumns.at( resultGetData.nColumn ).isNull() )
+ if ( resultGetData.nColumn == 0 || *(resultGetData.pnBytesRemaining) == 0 ||
vectorRows[resultGetData.nRow][resultGetData.nColumn].isNull() )
MYODBCDbgReturn( SQL_NO_DATA );
/*!
@@ -1896,7 +1916,7 @@
resultGetData.pnBytesRemaining = &resultGetData.nBytesRemaining;
/* get indicator value; no need to process further if we are null */
- if ( vectorRows.at( resultGetData.nRow ).vectorColumns.at( resultGetData.nColumn
).isNull() )
+ if ( vectorRows[resultGetData.nRow][resultGetData.nColumn].isNull() )
{
resultGetData.nIndicator = SQL_NULL_DATA;
*resultGetData.pnBytesRemaining = 0;
@@ -2767,10 +2787,10 @@
/* convert to string (if possible) */
if ( pResultGetData->stringData.isNull() )
{
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QString>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QString>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
/* make a copy we can easily work with (avoid re-convert) in case of chunking
(optimize this later) */
- pResultGetData->stringData = vectorRows.at( pResultGetData->nRow
).vectorColumns.at( pResultGetData->nColumn ).toString();
+ pResultGetData->stringData =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toString();
}
/* do we even need to do the data bit (or just looking for len)? */
@@ -2835,10 +2855,10 @@
/* convert to string (if possible) */
if ( pResultGetData->stringData.isNull() )
{
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QString>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QString>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
/* make a copy we can easily work with (avoid re-convert) in case of chunking
(optimize this later) */
- pResultGetData->stringData = vectorRows.at( pResultGetData->nRow
).vectorColumns.at( pResultGetData->nColumn ).toString();
+ pResultGetData->stringData =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toString();
}
/* do we even need to do the data bit (or just looking for len)? */
@@ -2902,10 +2922,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<short int>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<short
int>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((short int *)(pResultGetData->pTarget)) = (short int)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toInt();
+ *((short int *)(pResultGetData->pTarget)) = (short
int)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toInt();
*pResultGetData->pnBytesRemaining = 0;
@@ -2939,10 +2959,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<unsigned short int>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<unsigned
short int>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((unsigned short int *)pResultGetData->pTarget) = (unsigned short
int)vectorRows.at( pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn
).toUInt();
+ *((unsigned short int *)pResultGetData->pTarget) = (unsigned short
int)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toUInt();
*pResultGetData->pnBytesRemaining = 0;
@@ -2987,17 +3007,17 @@
pResultGetData->pDescriptorRecordIRD->getConciseType() == SQL_TYPE_DATE
||
pResultGetData->pDescriptorRecordIRD->getConciseType() ==
SQL_TYPE_TIMESTAMP )
{
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QDateTime>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QDateTime>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((long int *)pResultGetData->pTarget) = (long int)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn
).toDateTime().toTime_t();
+ *((long int *)pResultGetData->pTarget) = (long
int)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toDateTime().toTime_t();
}
else
{
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<qlonglong>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<qlonglong>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((long int *)pResultGetData->pTarget) = (long int)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toLongLong();
+ *((long int *)pResultGetData->pTarget) = (long
int)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toLongLong();
}
*pResultGetData->pnBytesRemaining = 0;
@@ -3035,7 +3055,7 @@
// if ( !pResultGetData->variantData.canConvert<unsigned long int>() )
// MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((unsigned long int *)pResultGetData->pTarget) = (unsigned long
int)vectorRows.at( pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn
).toULongLong();
+ *((unsigned long int *)pResultGetData->pTarget) = (unsigned long
int)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toULongLong();
*pResultGetData->pnBytesRemaining = 0;
@@ -3069,10 +3089,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<float>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<float>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((float *)pResultGetData->pTarget) = (float)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toDouble();
+ *((float *)pResultGetData->pTarget) =
(float)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toDouble();
*pResultGetData->pnBytesRemaining = 0;
@@ -3106,10 +3126,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<double>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<double>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((double *)pResultGetData->pTarget) = (double)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toDouble();
+ *((double *)pResultGetData->pTarget) =
(double)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toDouble();
*pResultGetData->pnBytesRemaining = 0;
@@ -3143,7 +3163,7 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<unsigned char>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<unsigned
char>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
/*!
@@ -3153,9 +3173,9 @@
This rule is for compat with v3 - but we issue a warning.
*/
- if ( vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toInt() == 0 )
+ if ( vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toInt() == 0 )
*((unsigned char *)pResultGetData->pTarget) = 0;
- else if ( vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toInt() == 1 )
+ else if ( vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toInt() ==
1 )
*((unsigned char *)pResultGetData->pTarget) = 1;
else
{
@@ -3195,10 +3215,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<char>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<char>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((char *)pResultGetData->pTarget) = vectorRows.at( pResultGetData->nRow
).vectorColumns.at( pResultGetData->nColumn ).toInt();
+ *((char *)pResultGetData->pTarget) =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toInt();
*pResultGetData->pnBytesRemaining = 0;
@@ -3232,10 +3252,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<unsigned char>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<unsigned
char>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((unsigned char *)pResultGetData->pTarget) = vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toInt();
+ *((unsigned char *)pResultGetData->pTarget) =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toInt();
*pResultGetData->pnBytesRemaining = 0;
@@ -3269,10 +3289,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<qint64>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<qint64>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((qint64 *)pResultGetData->pTarget) = (qint64)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toLongLong();
+ *((qint64 *)pResultGetData->pTarget) =
(qint64)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toLongLong();
*pResultGetData->pnBytesRemaining = 0;
@@ -3306,10 +3326,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<quint64>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<quint64>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- *((quint64 *)pResultGetData->pTarget) = (quint64)vectorRows.at(
pResultGetData->nRow ).vectorColumns.at( pResultGetData->nColumn ).toLongLong();
+ *((quint64 *)pResultGetData->pTarget) =
(quint64)vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toLongLong();
*pResultGetData->pnBytesRemaining = 0;
@@ -3335,10 +3355,10 @@
/* convert to bytearray */
if ( pResultGetData->bytearrayData.isNull() )
{
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QByteArray>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QByteArray>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
/* make a copy we can easily work with (avoid re-convert) in case of chunking
(optimize this later) */
- pResultGetData->bytearrayData = vectorRows.at( pResultGetData->nRow
).vectorColumns.at( pResultGetData->nColumn ).toByteArray();
+ pResultGetData->bytearrayData =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toByteArray();
}
/* do we even need to do the data bit (or just looking for len)? */
@@ -3417,10 +3437,10 @@
SQL_DATE_STRUCT *pDateTarget = (SQL_DATE_STRUCT *)pResultGetData->pTarget;
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QDate>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QDate>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- QDate d = vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toDate();
+ QDate d =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toDate();
pDateTarget->day = d.day();
pDateTarget->month = d.month();
pDateTarget->year = d.year();
@@ -3459,10 +3479,10 @@
SQL_TIME_STRUCT *pTimeTarget = (SQL_TIME_STRUCT *)pResultGetData->pTarget;
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QTime>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QTime>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- QTime t = vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toTime();
+ QTime t =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toTime();
pTimeTarget->hour = t.hour();
pTimeTarget->minute = t.minute();
pTimeTarget->second = t.second();
@@ -3501,10 +3521,10 @@
SQL_TIMESTAMP_STRUCT *pTimeStampTarget = (SQL_TIMESTAMP_STRUCT
*)pResultGetData->pTarget;
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QDateTime>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QDateTime>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006 ) );
- QDateTime t = vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toDateTime();
+ QDateTime t =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toDateTime();
pTimeStampTarget->day = t.date().day();
pTimeStampTarget->fraction = t.time().msec(); /*! \todo fraction is not same as
msec - look into it */
pTimeStampTarget->hour = t.time().hour();
@@ -3552,7 +3572,7 @@
/* our high precision stuff (DECIMAL) is stored as a string and all other numerics
can be turned into a string
so lets use a string as our starting point - in this way we hope to catch &
report any possible loss of
precision/scale :) */
- if ( !vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).canConvert<QString>() )
+ if (
!vectorRows[pResultGetData->nRow][pResultGetData->nColumn].canConvert<QString>()
)
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006, 0,
tr("Variant (data conversion hub) could not convert to a string.") ) );
/*!
@@ -3566,7 +3586,7 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01004 ) );
}
- QString stringData = vectorRows.at( pResultGetData->nRow ).vectorColumns.at(
pResultGetData->nColumn ).toString().trimmed();
+ QString stringData =
vectorRows[pResultGetData->nRow][pResultGetData->nColumn].toString().trimmed();
/*!
\internal ODBC RULE
@@ -4953,8 +4973,7 @@
while fetching the row.
*/
if ( pImpRowDesc->getArrayStatusPtr() )
- pImpRowDesc->getArrayStatusPtr()[nRowSetRow-1] = vectorRows.at( nRowsIndex
).nStatus;
- vectorRows[nRowsIndex].nStatus = SQL_ROW_SUCCESS;
+ pImpRowDesc->getArrayStatusPtr()[nRowSetRow-1] = vectorStatus[nRowSetRow-1];
for ( SQLSMALLINT nColumn = 0; nColumn <= pAppRowDesc->getCount(); nColumn++ )
{
Modified: trunk/SDK/MYSQLPlus/Library/MResult.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResult.h 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResult.h 2006-09-18 06:55:48 UTC (rev 548)
@@ -233,6 +233,8 @@
- the cursor can be moved randomly about the ResultSet
- ResultSetRows is deferred which defers pulling all data to
client - possibly add option to get ResultSetRows
at doExecute enable this by switching 'use' result with 'store'
result - but this means even more buffering
+ - we update ResultSet as we update server data so they remain in
sync
+ - we can be more accurate with returning RowStatus as ResultSet
rows can be compared with fresh server data
Cons;
- can cause considerable storage to be used on client
@@ -241,9 +243,6 @@
Used if;
- not CURSOR_TYPE_FORWARD_ONLY and not CONCURRENCY_READ_ONLY
- This will be used rarely and only when we want to affect a particular
cursor sensitivity or want a very specific
- type of optimization which can be had by having our data buffered in
listRows.
-
MYSQLPlus implements CURSOR_TYPE_KEYSET_DRIVEN with the use of
additional buffers which operate in parallel with data
buffers. We do not really support CURSOR_TYPE_DYNAMIC - we just do
same thing as CURSOR_TYPE_KEYSET_DRIVEN.
*/
@@ -346,6 +345,7 @@
virtual BOOLEAN isAfterEnd();
virtual BOOLEAN isBeforeStart();
virtual BOOLEAN isResultSetRowsKnown();
+ virtual BOOLEAN isResultSetPossible() = 0;
virtual BOOLEAN isValidColumn( SQLUSMALLINT nColumn );
virtual BOOLEAN isValidResultSetRow();
virtual BOOLEAN isValidRowSetRow();
@@ -360,6 +360,8 @@
This contains the ResultSet (incl. RowSet) rows or just the RowSet rows
depending
upon the cursor settings.
+ This is size, resized, and loaded by derived classes.
+
At some point block-cursors may be supported in the server. If this
happens we may need to
abstract ourself from this - but for now its a handy solution which meets
our needs.
*/
@@ -371,6 +373,11 @@
\name vectorStatus
This contains the status for each row in the RowSet.
+
+ vectorStatus is sized/resized by us (not derived classes) in
setRowSetSize().
+
+ This is loaded by derived classes when they load vectorRows. An exception
to this is that
+ setRowSetRows() will set the SQL_ROW_NOROW as needed.
*/
/*@{*/
QVector<SQLUSMALLINT> vectorStatus;
Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp 2006-09-18 06:55:48 UTC (rev 548)
@@ -53,7 +53,7 @@
resultGetData.doClear();
- vectorRows[ getResultSetRow() - 1 + getRowSetRow() - 1 ].vectorColumns.replace(
nColumn - 1, variantData );
+ vectorRows[getResultSetRow() - 1 + getRowSetRow() - 1].replace( nColumn - 1,
variantData );
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -94,12 +94,10 @@
\internal
\note
- We do not actually store a bookmark column (we just use row number for that) so
vectorRows[nRow].vectorColumns[0] is
+ We do not actually store a bookmark column (we just use row number for that) so
vectorRows[nRow][0] is
the first data cell.
*/
- vectorRows.append( MResultRow );
- vectorRows.last().nStatus = SQL_ROW_SUCCESS;
- vectorRows.last().vectorColumns.resize( getImpRowDesc()->getCount() );
+ vectorRows.append( MResultColumns( getImpRowDesc()->getCount() ) );
MYODBCDbgReturn( SQL_SUCCESS );
}
Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.h 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.h 2006-09-18 06:55:48 UTC (rev 548)
@@ -76,6 +76,7 @@
/*@}*/
/* isers */
+ BOOLEAN isResultSetPossible() { MYODBCDbgEnter(); MYODBCDbgReturn3( "%d", true ); }
protected:
/* doers */
Modified: trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultRes.cpp 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResultRes.cpp 2006-09-18 06:55:48 UTC (rev 548)
@@ -296,11 +296,6 @@
back to the prepared or allocated state, the statement is reexecuted, or
SQLCloseCursor is called. Note that if a function
has been called since the SQL_DIAG_ROW_COUNT field was set, the value returned by
SQLRowCount might be different from the
value in the SQL_DIAG_ROW_COUNT field because the SQL_DIAG_ROW_COUNT field is
reset to 0 by any function call.
-
- \internal MYODBC RULE
-
- Wet set SQL_DIAG_ROW_COUNT when any result set is requested - for example we also
set SQL_DIAG_ROW_COUNT for catalog
- functions.
*/
if ( pCommand->isResultSetPossible() )
{
@@ -321,31 +316,50 @@
nRows = mysql_num_rows( pRes );
if ( mysql_errno( getMySQL() ) )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_errno( getMySQL() ), mysql_error( getMySQL() ) ) );
- nResultSetRows = nRows;
- bResultSetRowsKnown = true;
+ setResultSetRows( nRows, true );
}
+ else
+ setResultSetRows( nRows );
- getDiagnostic()->setCursorRowCount( nRows );
- getDiagnostic()->setRowCount( nRows );
- setRowsAffected( nRows );
+ setBeforeStart();
}
else
{
qulonglong nRows = mysql_affected_rows( getMySQL() );
-
- getDiagnostic()->setCursorRowCount( -1 );
- getDiagnostic()->setRowCount( nRows );
setRowsAffected( nRows );
- nResultSetRows = 0;
- bResultSetRowsKnown = true;
}
- setBeforeStart();
-
MYODBCDbgReturn( nReturn );
}
/*!
+ \brief Use this to insert a new, blank, row.
+
+ This will insert a new blank row before the current row and make
+ the new row current.
+
+ \return SQLRETURN
+
+ \sa doDelete
+ doInsert
+*/
+SQLRETURN MResultRes::doInsert()
+{
+ MYODBCDbgEnter();
+
+ /*!
+ \internal
+ \todo
+
+ Implement.
+
+ \sa MResultStmt::doInsert
+ */
+
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doInsert() not supported in this context") ) );
+}
+
+/*!
\brief Prepares the provided statement.
This is called to get the server to prepare the statement and to load the
result-set meta-data
@@ -382,6 +396,16 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+BOOLEAN MResultRes::isResultSetPossible()
+{
+ MYODBCDbgEnter();
+
+ if ( pCommand )
+ MYODBCDbgReturn3( "%d", pCommand->isResultSetPossible() );
+
+ MYODBCDbgReturn3( "%d", false );
+}
+
/*!
\brief Prepares for a \sa doFirst.
*/
@@ -457,59 +481,53 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Unknown buffer type.") ) );
}
- SQLRETURN nReturn2 = MResult::doGoto( nRow, bRefresh );
-
- if ( !SQL_SUCCEEDED( nReturn1 ) )
- MYODBCDbgReturn( nReturn1 );
-
- MYODBCDbgReturn( nReturn2 );
+ MYODBCDbgReturn( nReturn1 );
}
-
-/*!
- \brief Use this to insert a new, blank, row.
-
- This will insert a new blank row before the current row and make
- the new row current.
-
- \return SQLRETURN
-
- \sa doDelete
- doInsert
+/*!
+ \brief Prepares for a \sa doLast.
*/
-SQLRETURN MResultRes::doInsert()
+SQLRETURN MResultRes::doLast_()
{
MYODBCDbgEnter();
- /*!
- \internal
- \todo
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
- Implement.
+ SQLRETURN nReturn1 = SQL_SUCCESS;
- \sa MResultStmt::doInsert
- */
+ switch ( getBuffered() )
+ {
+ case BUFFERED_UNBUFFERED:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY106 ) );
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doInsert() not supported in this context") ) );
-}
+ case BUFFERED_MYSQL_PLUS:
+ // have we buffered everything?
+ while ( !isResultSetRowsKnown() )
+ {
+ nReturn1 = getRowSetData();
+ if ( !SQL_SUCCEEDED( nReturn1 ) )
+ {
+ if ( isResultSetRowsKnown() )
+ nReturn1 = SQL_SUCCESS;
+ }
+ }
+ break;
-/*!
- \brief Prepares for a \sa doLast.
-*/
-SQLRETURN MResultRes::doLast_()
-{
- MYODBCDbgEnter();
+ case BUFFERED_MYSQL_CLIENT:
+ if ( getRowSetSize() > getResultSetRows() )
+ MYODBCDbgReturn( doFirst_() );
- /*!
- \internal
- \todo
+ mysql_data_seek( pRes, getResultSetRows() - getRowSetSize() );
+ // load RowSet
+ nReturn1 = getRowSetData();
+ break;
- Implement.
+ default:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Unknown buffer type.") ) );
+ }
- \sa MResultStmt::doLast
- */
-
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doLast() not supported in this context") ) );
+ MYODBCDbgReturn( nReturn1 );
}
/*!
@@ -726,9 +744,9 @@
mysql_free_result( pRes );
pRes = NULL;
listRows.clear();
- setResultSetRowsKnown( false );
- setBeforeStart();
+ setResultSetRows( 0, true );
setRowsAffected( 0 );
+ setBeforeStart();
resultGetData.doClear();
resultSetData.doClear();
setState( STATE_PREPARED );
@@ -745,64 +763,6 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-/*!
- \brief Refreshs the row data.
-
- This call causes any bound columns (as per ARD) to be refreshed. This action
includes data type
- conversions from the driver column data buffers to any bound columns.
-
- \note It may be that in the future we allow setting column data and keep track of
such changes but for now
- we always refresh all columns.
-
- \return SQLRETURN
-
- \sa setRow
- getRow
- getRows
- doNext
- doPrev
- doFirst
- doLast
- doSkip
-*/
-SQLRETURN MResultRes::doRefresh()
-{
- MYODBCDbgEnter();
-
- /* state etc validation done by caller */
-
- /*!
- \internal
- \todo
-
- Load any bound columns from SQLBindCol/ARD. Use getData to reduce redundant code.
Using
- getData in this way may not be optimal - need to revisit.
- */
- {
- MDescriptor *pDescriptor = getAppRowDesc();
- SQLSMALLINT nColumns = pDescriptor->getCount();
-
- for ( SQLSMALLINT nColumn = 0; nColumn <= nColumns; nColumn++ )
- {
- MDescriptorRecordARD *pDescriptorRecord = (MDescriptorRecordARD
*)pDescriptor->getRecord( nColumn );
-
- if ( pDescriptorRecord->getDataPtr() )
- {
- SQLRETURN nReturn = MResult::getData( nColumn,
-
pDescriptorRecord->getConciseType(),
- pDescriptorRecord->getDataPtr(),
- pDescriptorRecord->getLength(),
-
pDescriptorRecord->getOctetLengthPtr(),
-
pDescriptorRecord->getIndicatorPtr() );
- if ( nReturn != SQL_SUCCESS )
- MYODBCDbgReturn( nReturn );
- }
- }
- }
-
- MYODBCDbgReturn( SQL_SUCCESS );
-}
-
/*!
\brief Load RowSet with data.
Modified: trunk/SDK/MYSQLPlus/Library/MResultRes.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultRes.h 2006-09-17 23:37:00 UTC (rev 547)
+++ trunk/SDK/MYSQLPlus/Library/MResultRes.h 2006-09-18 06:55:48 UTC (rev 548)
@@ -37,12 +37,12 @@
SQLRETURN doInsert();
SQLRETURN doPrepare( MCommand *pCommand );
+ /* isers */
+ BOOLEAN isResultSetPossible();
+
protected:
/* doers */
- SQLRETURN doApplyCursorRestrictions();
- SQLRETURN doStateRollBack( STATE nState );
-
/*!
\name Cursor methods.
@@ -74,6 +74,8 @@
SQLRETURN doPrev_();
SQLRETURN doSkip_( qlonglong nRowSets );
/*@}*/
+ SQLRETURN doApplyCursorRestrictions();
+ SQLRETURN doStateRollBack( STATE nState );
private:
MCommand * pCommand; /*!< the command we are supporting
*/
| Thread |
|---|
| • Connector/ODBC 5 commit: r548 - trunk/SDK/MYSQLPlus/Library | pharvey | 18 Sep |