Modified:
MYSQLPlus/MYSQLPlusLib/MResult.cpp
MYSQLPlus/MYSQLPlusLib/MResult.h
MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
MYSQLPlus/MYSQLPlusLib/MResultPlus.h
MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
MYSQLPlus/MYSQLPlusLib/MResultStmt.h
MYSQLPlus/MYSQLPlusLib/MStatement.cpp
MYSQLPlus/include/MStatement.h
Log:
Modified: MYSQLPlus/MYSQLPlusLib/MResult.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResult.cpp 2006-05-10 05:22:10 UTC (rev 217)
@@ -49,6 +49,7 @@
Q_ASSERT( !pStatement );
+ nState = STATE_UNINITIALIZED;
pStatement->getImpParamDesc()->doClear();
pStatement->getImpRowDesc()->doClear();
@@ -65,6 +66,12 @@
MYODBCDbgReturn2();
}
+STATE MResult::getState()
+{
+ MYODBCDbgEnter();
+ MYODBCDbgReturn3( "%d", nState );
+}
+
BOOLEAN MResult::isValidColumn( uint nColumn )
{
BOOLEAN b;
@@ -76,6 +83,15 @@
MYODBCDbgReturn3( "%d", b );
}
+BOOLEAN MResult::setState( STATE nState )
+{
+ MYODBCDbgEnter();
+
+ this->nState = nState;
+
+ MYODBCDbgReturn3( "%d", true );
+}
+
MStatement *MResult::getStatement()
{
MYODBCDbgEnter();
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-10 05:22:10 UTC (rev 217)
@@ -26,12 +26,24 @@
class MResult : public QObject
{
public:
+ enum STATE
+ {
+ STATE_UNINITIALIZED,
+ STATE_INITIALIZED,
+ STATE_PREPARED,
+ STATE_EXECUTED
+ };
+
MResult( MStatement *pStatement );
virtual ~MResult();
+ /* setters */
virtual SQLRETURN setData( uint nColumn, const QVariant &variantData ) = 0;
virtual SQLRETURN setRow( qulonglong nRow ) = 0;
+ /* getters */
+ STATE getState();
+
virtual SQLRETURN getColumns( uint *pnColumns ) = 0;
virtual SQLRETURN getData( uint nColumn, QVariant &variantData ) = 0;
virtual SQLRETURN getRow( qulonglong *pnRow ) = 0;
@@ -57,6 +69,9 @@
protected:
+ /* setters */
+ BOOLEAN setState( STATE nState );
+
/* getters */
MStatement * getStatement();
MDiagnostic * getDiagnostic();
@@ -65,7 +80,11 @@
MDescriptor * getImpParamDesc();
MDescriptor * getImpRowDesc();
+ /* doers */
+ virtual SQLRETURN doStateRollBack( STATE nState ) = 0;
+
private:
+ STATE nState; /*!< our state */
};
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-10 05:22:10 UTC (rev 217)
@@ -404,6 +404,42 @@
MYODBCDbgReturn3( "%d", b );
}
+SQLRETURN MResultPlus::doStateRollBack( STATE nState )
+{
+ MYODBCDbgEnter();
+
+ if ( getState() <= nState )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01000, 0,
tr("Request to roll back state has no affect.") ) );
+
+ switch ( getState() )
+ {
+ case STATE_UNINITIALIZED:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Invalid state; no state before STATE_UNINITIALIZED.") ) );
+ break;
+
+ case STATE_INITIALIZED:
+ setState( STATE_UNINITIALIZED );
+ break;
+
+ case STATE_PREPARED:
+ setState(STATE_INITIALIZED );
+ break;
+
+ case STATE_EXECUTED:
+ setState( STATE_PREPARED );
+ break;
+
+ default:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Unknown state.") ) );
+ }
+
+ /* recurse to roll-back more as needed */
+ if ( getState() > nState )
+ MYODBCDbgReturn( doStateRollBack( nState ) );
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
SQLRETURN MResultPlus::doAppendTypeInfo( const QVariant &stringTypeName,
const QVariant &nDataType,
const QVariant &nColumnSize,
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-10 05:22:10 UTC (rev 217)
@@ -31,14 +31,17 @@
MResultPlus( MStatement *pStatement );
~MResultPlus();
+ /* setters */
SQLRETURN setData( uint nColumn, const QVariant &variantData );
SQLRETURN setRow( qulonglong nRow );
+ /* getters */
SQLRETURN getColumns( uint *pnColumns );
SQLRETURN getData( uint nColumn, QVariant &variantData );
SQLRETURN getRow( qulonglong *pnRow );
SQLRETURN getRows( qulonglong *pnRows );
+ /* doers */
SQLRETURN doAppend( int nToAppend = 1 );
SQLRETURN doClear();
SQLRETURN doDelete();
@@ -53,10 +56,13 @@
SQLRETURN doGetTypeInfo( SQLSMALLINT nDataType ); /*<! \sa SQLGetTypeInfo */
+ /* isers */
BOOLEAN isValidRow();
BOOLEAN isValidRow( qulonglong nRow );
protected:
+ /* doers */
+ SQLRETURN doStateRollBack( STATE nState );
private:
/* Our result set is a list of rows. Each row is a vector of column data. Column data
is a QVariant. */
Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-10 05:22:10 UTC (rev 217)
@@ -10,15 +10,17 @@
{
MYODBCDbgEnter();
- int bUpdateMaxLength = 1;
-
+ nState = STATE_UNINITIALIZED;
pbindColumns = NULL;
nRow = 0;
stringStatement = QString::null;
- pstm = mysql_stmt_init(
(MYSQL*)(pStatement->getConnection()->getMySQL()) );
- Q_ASSERT( !pstm );
- mysql_stmt_attr_set( pstm, STMT_ATTR_UPDATE_MAX_LENGTH, &bUpdateMaxLength )
+ pstm = mysql_stmt_init( (MYSQL*)(pStatement->getConnection()->getMySQL()) );
+ if ( pstm )
+ nState = STATE_INITIALIZED;
+ else
+ pStatement->getDiagnostic()->doAppend( MDiagnostic::DIA_HY001, 0,
"mysql_stmt_init() failed" ) );
+
MYODBCDbgReturn2();
}
@@ -26,8 +28,7 @@
{
MYODBCDbgEnter();
- mysql_stmt_close( pstm );
- pstm = NULL;
+ doStateRollBack( STATE_UNINITALIZED );
MYODBCDbgReturn2();
}
@@ -51,6 +52,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Invalid row." ) );
@@ -97,6 +101,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow( nRow ) )
{
nRow = 0;
@@ -132,6 +139,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_PREPARED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnColumns );
*pnColumns = getImpRowDesc()->getCount();
@@ -162,6 +172,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
"Invalid row." ) );
@@ -253,6 +266,9 @@
SQLINTEGER * pnIndicator = pDescriptorRecord->getIndicatorPtr();
SQLINTEGER * pnOctetLength = pDescriptorRecord->getOctetLengthPtr();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
if ( variantData.isNull() )
{
if ( pnIndicator )
@@ -463,6 +479,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnRow );
*pnRow = nRow;
@@ -488,6 +507,9 @@
{
MYODBCDbgEnter();
+ if ( getState() < STATE_EXECUTED )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
+
Q_ASSERT( !pnRow );
/*!
@@ -534,13 +556,19 @@
{
MYODBCDbgEnter();
- pstm;
- pbindColumns;
- nRow = 0;
- stringStatement = QString::null;
- getImpParamDesc()->doClear();
- getImpRowDesc()->doClear();
+ if ( getState() > STATE_INITIALIZED )
+ MYODBCDbgReturn( doStateRollBack( STATE_INITIALIZED ) );
+ /* we failed to init in constructor - lets give it another try */
+ if ( getState() == STATE_UNINITIALIZED )
+ {
+ pstm = mysql_stmt_init( (MYSQL*)(pStatement->getConnection()->getMySQL())
);
+ if ( pstm )
+ setState( STATE_INITIALIZED );
+ else
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY001, 0,
"mysql_stmt_init() failed" ) );
+ }
+
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -561,7 +589,7 @@
{
MYODBCDbgEnter();
- if ( getState() < Executed )
+ if ( getState() < STATE_EXECUTED )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0, "doDelete
not supported here at this time." ) );
@@ -1105,6 +1133,51 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+/*
+ pstm;
+ pbindColumns;
+ nRow = 0;
+ stringStatement = QString::null;
+ getImpParamDesc()->doClear();
+ getImpRowDesc()->doClear();
+
+*/
+SQLRETURN MResultStmt::doStateRollBack( STATE nState )
+{
+ MYODBCDbgEnter();
+
+ if ( getState() <= nState )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01000, 0,
tr("Request to roll back state has no affect.") ) );
+
+ switch ( getState() )
+ {
+ case STATE_UNINITIALIZED:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Invalid state; no state before STATE_UNINITIALIZED.") ) );
+ break;
+
+ case STATE_INITIALIZED:
+ setState( STATE_UNINITIALIZED );
+ break;
+
+ case STATE_PREPARED:
+ setState(STATE_INITIALIZED );
+ break;
+
+ case STATE_EXECUTED:
+ setState( STATE_PREPARED );
+ break;
+
+ default:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Unknown state.") ) );
+ }
+
+ /* recurse to roll-back more as needed */
+ if ( getState() > nState )
+ MYODBCDbgReturn( doStateRollBack( nState ) );
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
/*!
\brief Loads result-set meta data.
Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.h 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.h 2006-05-10 05:22:10 UTC (rev 217)
@@ -77,6 +77,8 @@
BOOLEAN isValidRow( qulonglong nRow );
protected:
+ /* doers */
+ SQLRETURN doStateRollBack( STATE nState );
private:
MYSQL_STMT * pstm; /*!< MySQL prepared statement
*/
Modified: MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-05-10 05:22:10 UTC (rev 217)
@@ -224,6 +224,13 @@
}
+MStatement::STATE MStatement::getState()
+{
+ MYODBCDbgEnter();
+
+ MYODBCDbgReturn3( "%d", nState );
+}
+
SQLRETURN MStatement::getCursorName( SQLWCHAR *psCursorName, SQLSMALLINT nBufferLength,
SQLSMALLINT *pnNameLengthPtr )
{
MYODBCDbgEnter();
@@ -1670,6 +1677,15 @@
MYODBCDbgReturn3( "%d", false );
}
+BOOLEAN MStatement::setState( STATE nState )
+{
+ MYODBCDbgEnter();
+
+ this->nState = nState;
+
+ MYODBCDbgReturn3( "%d", true );
+}
+
SQLRETURN MStatement::setAppParamDesc( MDescriptor *pDescriptor )
{
MYODBCDbgEnter();
@@ -2158,13 +2174,6 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-MStatement::STATE MStatement::getState()
-{
- MYODBCDbgEnter();
-
- MYODBCDbgReturn3( "%d", nState );
-}
-
MConnection *MStatement::getConnection()
{
MYODBCDbgEnter();
Modified: MYSQLPlus/include/MStatement.h
===================================================================
--- MYSQLPlus/include/MStatement.h 2006-05-09 23:14:44 UTC (rev 216)
+++ MYSQLPlus/include/MStatement.h 2006-05-10 05:22:10 UTC (rev 217)
@@ -35,6 +35,8 @@
SQLRETURN setStmtAttr( SQLINTEGER nAttribute, SQLPOINTER pValue, SQLINTEGER
nStringLength );
/* getters */
+ STATE getState();
+
SQLRETURN getCursorName( SQLWCHAR *psCursorName, SQLSMALLINT nBufferLength,
SQLSMALLINT *pnNameLengthPtr );
SQLRETURN getData( SQLUSMALLINT nColumnNumber, SQLSMALLINT nTargetType, SQLPOINTER
pTargetValuePtr, SQLINTEGER nBufferLength, SQLINTEGER *pnStrLenOrIndPtr );
SQLRETURN getDiagField( SQLSMALLINT nRecNumber, SQLSMALLINT nDiagIdentifier,
SQLPOINTER pDiagInfoPtr, SQLSMALLINT nBufferLength, SQLSMALLINT *pnStringLengthPtr );
@@ -82,6 +84,8 @@
protected:
/* setters */
+ BOOLEAN setState( STATE nState );
+
SQLRETURN setAppParamDesc( MDescriptor *pDescriptor ); /*!<
SQL_ATTR_APP_PARAM_DESC */
SQLRETURN setAppRowDesc( MDescriptor *pDescriptor ); /*!<
SQL_ATTR_APP_ROW_DESC */
SQLRETURN setAsyncEnable( SQLUINTEGER nAsyncEnable ); /*!<
SQL_ATTR_ASYNC_ENABLE */
@@ -114,7 +118,6 @@
SQLRETURN setUseBookmarks( SQLUINTEGER nUseBookmarks ); /*!<
SQL_ATTR_USE_BOOKMARKS */
/* getters */
- STATE getState();
MConnection * getConnection();
MDiagnostic * getDiagnostic();
| Thread |
|---|
| • Connector/ODBC 5 commit: r217 - in MYSQLPlus: MYSQLPlusLib include | pharvey | 10 May |