Modified:
MYSQLPlus/MYSQLPlusLib/MResult.cpp
MYSQLPlus/MYSQLPlusLib/MResult.h
MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
MYSQLPlus/MYSQLPlusLib/MResultPlus.h
MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-10 05:49:16 UTC (rev 218)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-10 16:50:09 UTC (rev 219)
@@ -49,7 +49,8 @@
Q_ASSERT( !pStatement );
- nState = STATE_UNINITIALIZED;
+ nState = STATE_UNINITIALIZED;
+ bReadOnly = true;
pStatement->getImpParamDesc()->doClear();
pStatement->getImpRowDesc()->doClear();
@@ -72,6 +73,12 @@
MYODBCDbgReturn3( "%d", nState );
}
+BOOLEAN MResult::isReadOnly()
+{
+ MYODBCDbgEnter();
+ MYODBCDbgReturn3( "%d", bReadOnly );
+}
+
BOOLEAN MResult::isValidColumn( uint nColumn )
{
BOOLEAN b;
@@ -92,6 +99,15 @@
MYODBCDbgReturn3( "%d", true );
}
+BOOLEAN MResult::setReadOnly( BOOLEAN bReadOnly )
+{
+ MYODBCDbgEnter();
+
+ this->nReadOnly = nReadOnly;
+
+ MYODBCDbgReturn3( "%d", true );
+}
+
MStatement *MResult::getStatement()
{
MYODBCDbgEnter();
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-10 05:49:16 UTC (rev 218)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-10 16:50:09 UTC (rev 219)
@@ -63,6 +63,7 @@
virtual SQLRETURN doSkip( qlonglong nRows ) = 0;
/* isers */
+ BOOLEAN isReadOnly();
virtual BOOLEAN isValidColumn( uint nColumn );
virtual BOOLEAN isValidRow() = 0;
virtual BOOLEAN isValidRow( qulonglong nRow ) = 0;
@@ -71,6 +72,7 @@
/* setters */
BOOLEAN setState( STATE nState );
+ BOOLEAN setReadOnly( BOOLEAN bReadOnly );
/* getters */
MStatement * getStatement();
@@ -84,8 +86,8 @@
virtual SQLRETURN doStateRollBack( STATE nState ) = 0;
private:
- STATE nState; /*!< our state */
-
+ STATE nState; /*!< our state
*/
+ BOOLEAN bReadOnly; /*!< can a caller use methods like setData() and
doAppend() */
};
#endif
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-10 05:49:16 UTC (rev 218)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-10 16:50:09 UTC (rev 219)
@@ -5,7 +5,8 @@
{
MYODBCDbgEnter();
- nRow = 0;
+ nRow = 0;
+ nState = STATE_INITIALIZED;
MYODBCDbgReturn2();
}
@@ -14,6 +15,8 @@
{
MYODBCDbgEnter();
+ doStateRollBack( STATE_UNINITIALIZED );
+
MYODBCDbgReturn2();
}
@@ -21,6 +24,12 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ if ( isReadOnly() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010, 0,
tr("Resultset is read-only.") ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Invalid row." ) );
@@ -40,6 +49,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow( nRow ) )
{
nRow = 0;
@@ -55,6 +67,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnColumns );
*pnColumns = getImpRowDesc()->getCount();
@@ -66,6 +81,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Invalid row." ) );
@@ -84,6 +102,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnRow );
*pnRow = nRow;
@@ -95,6 +116,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnRow );
*pnRows = listResults.count();
@@ -106,6 +130,12 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ if ( isReadOnly() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010, 0,
tr("Resultset is read-only.") ) );
+
SQLSMALLINT nColumns = getImpRowDesc()->getCount() - 1;
for ( int nAppended = 0; nAppended < nToAppend; nAppended++ )
@@ -121,10 +151,8 @@
{
MYODBCDbgEnter();
- listResults.clear();
- nRow = 0;
- getImpParamDesc()->doClear();
- getImpRowDesc()->doClear();
+ if ( getState() > STATE_INITIALIZED )
+ MYODBCDbgReturn( doStateRollBack( STATE_INITIALIZED ) );
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -133,6 +161,12 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
+ if ( isReadOnly() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010, 0,
tr("Resultset is read-only.") ) );
+
Q_ASSERT( !isValidRow() );
nRow--;
@@ -152,6 +186,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !listResults.count() )
{
nRow = 0;
@@ -167,8 +204,12 @@
{
MYODBCDbgEnter();
- /*! \todo inserts mess up the use of nRow for bookmarks */
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+ if ( isReadOnly() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010, 0,
tr("Resultset is read-only.") ) );
+
if ( nRow == 0 )
{
listResults.insert( nRow, QVector<QVariant>( getImpRowDesc()->getCount()
- 1 ) );
@@ -184,6 +225,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
nRow = listResults.count();
if ( !isValidRow() )
MYODBCDbgReturn( SQL_NO_DATA );
@@ -195,6 +239,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( doFirst() );
@@ -208,7 +255,6 @@
SQLRETURN MResultPlus::doPrepare( const QString & )
{
MYODBCDbgEnter();
-
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0, "Prepare a
statement is not relevant for driver generated resultsets." ) );
}
@@ -216,6 +262,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( doLast() );
@@ -230,6 +279,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( nRows == 0 );
if ( !isValidRow( nRow + nRows ) )
@@ -250,6 +302,9 @@
MDescriptor *pDescriptor;
doClear();
+ setState( STATE_EXECUTED );
+ setReadOnly( false );
+
pDescriptor = getImpRowDesc();
/* columns */
@@ -292,6 +347,8 @@
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
+ /*! \todo */
+ doClear();
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Not supported at this time." ) );
break;
case SQL_DECIMAL:
@@ -358,6 +415,8 @@
case SQL_INTERVAL_HOUR_TO_SECOND:
case SQL_INTERVAL_MINUTE_TO_SECOND:
case SQL_GUID:
+ /*! \todo */
+ doClear();
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Not supported at this time." ) );
break;
default:
@@ -373,11 +432,13 @@
We only support calling with standard, ODBC, SQL data type or
SQL_ALL_TYPES.
*/
+ doClear();
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY004, 0,
NULL ) );
}
/* we should be at last record so next will make us eof and a subsequent next will be
first record */
doNext();
+ setReadOnly( true );
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -388,6 +449,9 @@
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
b = isValidRow( nRow );
MYODBCDbgReturn3( "%d", b );
@@ -399,6 +463,9 @@
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
b = ( nRow > 0 && nRow <= listResults.count() );
MYODBCDbgReturn3( "%d", b );
@@ -422,11 +489,16 @@
break;
case STATE_PREPARED:
- setState(STATE_INITIALIZED );
+ setState( STATE_INITIALIZED );
break;
case STATE_EXECUTED:
- setState( STATE_PREPARED );
+ listResults.clear();
+ nRow = 0;
+ getImpParamDesc()->doClear();
+ getImpRowDesc()->doClear();
+ setReadOnly( true );
+ setState( STATE_INITIALIZED ); /* we do not use a 'prepared' state */
break;
default:
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-10 05:49:16 UTC (rev 218)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-10 16:50:09 UTC (rev 219)
@@ -22,7 +22,14 @@
- SQLStatistics
- SQLTablePrivileges
+ \note Currently, the resultset is always readonly so we could probably put the data
modifying methods
+ in 'protected'. Alternatively we could let callers control the read-only
attribute (and thereby
+ allow data modification) by putting a setReadOnly() in 'public'. For now;
either route can easily
+ be taken but neither is. The resultset is simply created by high level calls
such as
+ doGetTypeInfo().
+
\sa MResult
+ MResultRes
MResultStmt
*/
class MResultPlus : public MResult
@@ -67,8 +74,12 @@
private:
/* Our result set is a list of rows. Each row is a vector of column data. Column data
is a QVariant. */
QList<QVector<QVariant>> listResults;
- qulonglong nRow; /* 1 -based (0 as BOS) */
+ qulonglong nRow; /* 1 -based (0 as BOS/EOS) */
+ /*
+ These, doAppendTypeInfo*(), methods are not terribly efficient but are unlikely
to
+ be a source of performance issues. Hopefully they are easy to
understand/maintain.
+ */
SQLRETURN doAppendTypeInfo( const QVariant &stringTypeName,
const QVariant &nDataType,
const QVariant &nColumnSize,
Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-10 05:49:16 UTC (rev 218)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-10 16:50:09 UTC (rev 219)
@@ -1058,15 +1058,6 @@
MYODBCDbgReturn3( "%d", ( nRow > 0 && nRow <= nRows ) );
}
-BOOLEAN MResultStmt::setState( STATE nState )
-{
- MYODBCDbgEnter();
-
- this->nState > nState;
-
- MYODBCDbgReturn3( "%d", true );
-}
-
/*!
\brief Set the state.
| Thread |
|---|
| • Connector/ODBC 5 commit: r219 - MYSQLPlus/MYSQLPlusLib | pharvey | 10 May |