List:Commits« Previous MessageNext Message »
From:pharvey Date:September 18 2006 8:55am
Subject:Connector/ODBC 5 commit: r548 - trunk/SDK/MYSQLPlus/Library
View as plain text  
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/Librarypharvey18 Sep