Modified:
MYODBCDbg/include/MYODBCDbg.h
MYSQLPlus/MYSQLPlusLib/MResult.h
MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
MYSQLPlus/MYSQLPlusLib/MResultPlus.h
MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
MYSQLPlus/MYSQLPlusLib/MResultStmt.h
Log:
Modified: MYODBCDbg/include/MYODBCDbg.h
===================================================================
--- MYODBCDbg/include/MYODBCDbg.h 2006-05-12 05:04:38 UTC (rev 225)
+++ MYODBCDbg/include/MYODBCDbg.h 2006-05-12 07:06:26 UTC (rev 226)
@@ -180,6 +180,7 @@
}\
}
+/* WARNING !!! B gets evaluated 2 times */
#define MYODBCDbgReturn3(A,B)\
{\
if ( gpMYODBCDbg )\
Modified: MYSQLPlus/MYSQLPlusLib/MResult.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-12 05:04:38 UTC (rev 225)
+++ MYSQLPlus/MYSQLPlusLib/MResult.h 2006-05-12 07:06:26 UTC (rev 226)
@@ -50,7 +50,7 @@
virtual SQLRETURN getRows( qulonglong *pnRows ) = 0;
/* doers */
- virtual SQLRETURN doAppend( int nToAppend = 1 ) = 0;
+ virtual SQLRETURN doAppend() = 0;
virtual SQLRETURN doClear() = 0;
virtual SQLRETURN doDelete() = 0;
virtual SQLRETURN doExecute() = 0;
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-12 05:04:38 UTC (rev 225)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-05-12 07:06:26 UTC (rev 226)
@@ -137,7 +137,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResultPlus::doAppend( int nToAppend )
+SQLRETURN MResultPlus::doAppend()
{
MYODBCDbgEnter();
@@ -156,13 +156,9 @@
}
SQLSMALLINT nColumns = getImpRowDesc()->getCount() - 1;
+ listResults.append( QVector<QVariant>( nColumns ) );
+ nRow = listResults.count();
- for ( int nAppended = 0; nAppended < nToAppend; nAppended++ )
- {
- listResults.append( QVector<QVariant>( nColumns ) );
- nRow = listResults.count();
- }
-
MYODBCDbgReturn( SQL_SUCCESS );
}
Modified: MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-12 05:04:38 UTC (rev 225)
+++ MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-05-12 07:06:26 UTC (rev 226)
@@ -49,7 +49,7 @@
SQLRETURN getRows( qulonglong *pnRows );
/* doers */
- SQLRETURN doAppend( int nToAppend = 1 );
+ SQLRETURN doAppend();
SQLRETURN doClear();
SQLRETURN doDelete();
SQLRETURN doExecute();
Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-12 05:04:38 UTC (rev 225)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.cpp 2006-05-12 07:06:26 UTC (rev 226)
@@ -14,6 +14,11 @@
pbindColumns = NULL;
nRow = 0;
+ if ( pStatement->getCursorType() == SQL_CURSOR_FORWARD_ONLY ) /* this also implies
SQL_ATTR_CURSOR_SCROLLABLE = SQL_NONSCROLLABLE */
+ setBuffered( false );
+ else
+ setBuffered( true );
+
/* init pstm */
pstm = mysql_stmt_init( (MYSQL*)(pStatement->getConnection()->getMySQL()) );
if ( pstm )
@@ -120,15 +125,26 @@
if ( getState() < STATE_EXECUTED )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
- 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 == this->nRow )
+ MYODBCDbgReturn( SQL_SUCCESS );
if ( !isBuffered() )
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("setRow() not supported for unbuffered resultset") ) );
+ {
+ 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 = nRow;
+ this->nRow = 0;
MYODBCDbgReturn( SQL_SUCCESS );
}
else if ( !isValidRow( nRow ) )
@@ -137,8 +153,6 @@
MYODBCDbgReturn( SQL_NO_DATA );
}
- Q_ASSERT( !pstm );
-
MYODBCDbgReturn( doSeek( nRow ) );
}
@@ -521,26 +535,7 @@
MYODBCDbgReturn( SQL_NO_DATA );
}
- /*!
- \internal MYSQL RULE
-
- mysql_stmt_data_seek() does not provide any error information or status.
-
- \note
-
- We check for errors just in case it works ;)
- */
- mysql_stmt_data_seek( pstm, nRow - 1 );
- if ( mysql_stmt_errno( pstm ) )
- {
- nRow = 0;
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
- }
-
- nRow = 1;
- doRefresh();
-
- MYODBCDbgReturn( SQL_SUCCESS );
+ MYODBCDbgReturn( doSeek( 1 ) );
}
/*!
@@ -566,6 +561,12 @@
if ( getStatement()->getConcurrency() == SQL_CONCUR_READ_ONLY )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Resultset is read-only.") ) );
+ /*!
+ \internal
+ \todo
+
+ Implement.
+ */
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doInsert not supported here at this time.") ) );
}
@@ -596,9 +597,6 @@
if ( getState() < STATE_EXECUTED )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
- if ( getStatement()->getCursorType() == SQL_CURSOR_FORWARD_ONLY )
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doLast() not supported when SQL_CURSOR_FORWARD_ONLY") ) );
-
if ( !isBuffered() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doLast() not supported for unbuffered resultset") ) );
@@ -610,23 +608,7 @@
MYODBCDbgReturn( SQL_NO_DATA );
}
- /*!
- \internal MYSQL RULE
-
- mysql_stmt_data_seek() has no return value and produces no errors - joy.
-
- \note
-
- We check for errors anyway :)
- */
- nRow = nRows;
- mysql_stmt_data_seek( pstm, nRow - 1 );
- if ( mysql_stmt_errno( pstm ) )
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
-
- doRefresh();
-
- MYODBCDbgReturn( SQL_SUCCESS );
+ MYODBCDbgReturn( doSeek( nRows ) );
}
/*!
@@ -659,27 +641,39 @@
if ( getState() < STATE_EXECUTED )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY010 ) );
- int n = mysql_stmt_fetch( pstm );
- switch ( n )
+ if ( isBuffered() )
{
- case 0:
- nRow++;
- MYODBCDbgReturn( doRefresh() );
-
- case 1:
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
-
- case MYSQL_NO_DATA:
+ if ( !isValidRow( nRow + 1 ) )
+ {
nRow = 0;
MYODBCDbgReturn( SQL_NO_DATA );
+ }
+ MYODBCDbgReturn( doSeek( nRow + 1 ) );
+ }
+ else
+ {
+ int n = mysql_stmt_fetch( pstm );
+ switch ( n )
+ {
+ case 0:
+ nRow++;
+ MYODBCDbgReturn( doRefresh() );
- case MYSQL_DATA_TRUNCATED:
- nRow++;
- doRefresh();
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_22001,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
+ case 1:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
- default:
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, n,
tr("unknown return code from mysql_stmt_fetch()") ) );
+ case MYSQL_NO_DATA:
+ nRow = 0;
+ MYODBCDbgReturn( SQL_NO_DATA );
+
+ case MYSQL_DATA_TRUNCATED:
+ nRow++;
+ doRefresh();
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_22001,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
+
+ default:
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, n,
tr("unknown return code from mysql_stmt_fetch()") ) );
+ }
}
MYODBCDbgReturn( SQL_SUCCESS );
@@ -756,21 +750,19 @@
if ( getStatement()->getCursorType() == SQL_CURSOR_FORWARD_ONLY )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doPrev() not supported when SQL_CURSOR_FORWARD_ONLY") ) );
+ if ( !isBuffered() )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doPrev() not supported for unbuffered resultset") ) );
+
if ( !isValidRow() )
MYODBCDbgReturn( doLast() );
- nRow--;
- if ( !isValidRow() )
+ if ( !isValidRow( nRow - 1 ) )
{
nRow = 0;
MYODBCDbgReturn( SQL_NO_DATA );
}
- mysql_stmt_data_seek( pstm, nRow - 1 );
-
- doRefresh();
-
- MYODBCDbgReturn( SQL_SUCCESS );
+ MYODBCDbgReturn( doSeek( nRow - 1 ) );
}
/*!
@@ -805,19 +797,35 @@
if ( nRows == 0 )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_01000, 0,
tr("doSkip 0 records is meaningless.") ) );
- if ( getStatement()->getCursorType() == SQL_CURSOR_FORWARD_ONLY && nRows
< 0 )
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doSkip() not fully supported when SQL_CURSOR_FORWARD_ONLY") ) );
+ if ( nRows < 0 )
+ {
+ if ( getStatement()->getCursorType() == SQL_CURSOR_FORWARD_ONLY )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("doSkip() not fully supported when SQL_CURSOR_FORWARD_ONLY") ) );
+ }
- if ( !isValidRow( nRow + nRows ) )
+ if ( isBuffered() )
{
- nRow = 0;
- MYODBCDbgReturn( SQL_NO_DATA );
+ if ( (nRow + nRows) <= 0 || !isValidRow( nRow + nRows ) )
+ {
+ nRow = 0;
+ MYODBCDbgReturn( SQL_NO_DATA );
+ }
+
+ MYODBCDbgReturn( doSeek( nRow + nRows ) );
}
+ else
+ {
+ SQLRETURN nReturn;
- nRow += nRows;
- mysql_stmt_data_seek( pstm, nRow - 1 );
- doRefresh();
+ for ( qulonglong n = 0; n < nRows; n++ )
+ {
+ nReturn = doNext();
+ if ( !SQL_SUCCEEDED( nReturn ) )
+ MYODBCDbgReturn( nReturn );
+ }
+ }
+
MYODBCDbgReturn( SQL_SUCCESS );
}
@@ -866,11 +874,7 @@
if ( getState() < STATE_EXECUTED )
MYODBCDbgReturn3( "%d", false );
- /* eof/bof */
- if ( nRow == 0 )
- MYODBCDbgReturn3( "%d", false );
-
- MYODBCDbgReturn3( "%d", true );
+ MYODBCDbgReturn3( "%d", ( nRow != 0 ) );
}
/*!
@@ -898,6 +902,9 @@
if ( nRow == 0 )
MYODBCDbgReturn3( "%d", false );
+ if ( nRow <= this->nRow )
+ MYODBCDbgReturn3( "%d", true );
+
nReturn = getRows( &nRows );
if ( !SQL_SUCCEEDED( nReturn ) )
MYODBCDbgReturn3( "%d", false );
@@ -980,7 +987,7 @@
break;
default:
- MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000, 0,
tr("Unknown state.") ) );
+ Q_ASSERT( true );
}
/* recurse to roll-back more as needed */
@@ -990,7 +997,7 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
-SQLRETURN MResultStmt::doSeek( qulonglong nRow )
+SQLRETURN MResultStmt::doSeek( qulonglong nRow /* 1-based */ )
{
MYODBCDbgEnter();
@@ -1011,10 +1018,10 @@
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_stmt_errno( pstm ), mysql_stmt_error( pstm ) ) );
SQLRETURN nReturn = doRefresh();
- if ( !SQL_SUCCEEDED( nReturn ) )
+ if ( SQL_SUCCEEDED( nReturn ) )
this->nRow = nRow;
else
- this->nRow = nRow;
+ this->nRow = 0;
MYODBCDbgReturn( nReturn );
}
@@ -1063,7 +1070,7 @@
if ( !variantData.canConvert<QString>() )
MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_07006
) );
QString stringData = variantData.asString();
- MYODBCC::doStrNCpy( (SQLWCHAR)pdata,
pDescriptorRecord->getOctetLength() / sizeof(SQLWCHAR), stringData.utf16() );
+ MYODBCC::doStrNCpy( (SQLWCHAR*)pdata,
pDescriptorRecord->getOctetLength() / sizeof(SQLWCHAR), stringData.utf16() );
if ( pnOctetLength ) *pnOctetLength = stringData.length() *
sizeof(SQLWCHAR);
}
break;
@@ -1364,7 +1371,7 @@
for ( nField = 0; nField < nFields; nField++ )
{
pField = mysql_fetch_field( pMetaData );
- nReturn = doLoadMetaDataField( nField + 1, pField );
+ SQLRETURN nReturn = doLoadMetaDataField( nField + 1, pField );
if ( !SQL_SUCCEEDED( nReturn ) )
{
mysql_free_result( pMetaData );
@@ -1447,7 +1454,7 @@
/* pDescriptorRecord->setliteral_prefix; - type specific */
/* pDescriptorRecord->setliteral_suffix; - type specific */
pDescriptorRecord->setLocalTypeName( "" );
- pDescriptorRecord->setName( nField pField->name );
+ pDescriptorRecord->setName( pField->name );
pDescriptorRecord->setNullable( ((pField->flags && NOT_NULL_FLAG) ?
SQL_NO_NULLS : SQL_NULLABLE) );
/* pDescriptorRecord->setnum_prec_radix; - type specific */
/* pDescriptorRecord->setoctet_length; - type specific */
Modified: MYSQLPlus/MYSQLPlusLib/MResultStmt.h
===================================================================
--- MYSQLPlus/MYSQLPlusLib/MResultStmt.h 2006-05-12 05:04:38 UTC (rev 225)
+++ MYSQLPlus/MYSQLPlusLib/MResultStmt.h 2006-05-12 07:06:26 UTC (rev 226)
@@ -59,7 +59,7 @@
SQLRETURN getRow( qulonglong *pnRow );
SQLRETURN getRows( qulonglong *pnRows );
- SQLRETURN doAppend( int nToAppend = 1 );
+ SQLRETURN doAppend();
SQLRETURN doClear();
SQLRETURN doDelete();
SQLRETURN doExecute();
| Thread |
|---|
| • Connector/ODBC 5 commit: r226 - MYODBCDbg/include MYSQLPlus/MYSQLPlusLib | pharvey | 12 May |