QSqlResult: replace virtual hooks with virtual functions

Instead of virtual functions which would have broken binary
compatibility, virtual_hook() was used to implement the virtual
functionality. Now, since the step to Qt 5.0 allows breaking
binary compatibility, we take the opporunity to simplify the code
using real virtual functions.

SetNumericalPrecision --> setNumericalPrecisionPolicy()
NextResult --> nextResult()
DetachFromResultSet --> detachFromResultSet()
BatchOperation --> execBatch()

Task-number: QTBUG-25252
Change-Id: Idd3a870f876d8b8a7457559d5f31ec2073786a75
Reviewed-by: Bill King <bill.king@nokia.com>
Reviewed-by: Harald Fernengel <harald.fernengel@nokia.com>
bb10
Mark Brand 2012-06-05 13:50:03 +02:00 committed by Qt by Nokia
parent 637ecd571f
commit fc15a1d5e2
15 changed files with 63 additions and 63 deletions

View File

@ -1120,19 +1120,17 @@ bool QDB2Result::nextResult()
void QDB2Result::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::NextResult:
Q_ASSERT(data);
*static_cast<bool*>(data) = nextResult();
break;
case QSqlResult::DetachFromResultSet:
if (d->hStmt)
SQLCloseCursor(d->hStmt);
break;
default:
QSqlResult::virtual_hook(id, data);
}
}
void QDB2Result::detachFromResultSet()
{
if (d->hStmt)
SQLCloseCursor(d->hStmt);
}
/************************************/
QDB2Driver::QDB2Driver(QObject* parent)

View File

@ -80,6 +80,7 @@ protected:
int numRowsAffected();
QSqlRecord record() const;
void virtual_hook(int id, void *data);
void detachFromResultSet();
bool nextResult();
private:

View File

@ -839,10 +839,6 @@ bool QMYSQLResult::nextResult()
void QMYSQLResult::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::NextResult:
Q_ASSERT(data);
*static_cast<bool*>(data) = nextResult();
break;
default:
QSqlResult::virtual_hook(id, data);
}

View File

@ -2042,14 +2042,18 @@ QVariant QOCIResult::lastInsertId() const
return QVariant();
}
bool QOCIResult::execBatch(bool arrayBind)
{
QOCICols::execBatch(d, boundValues(), arrayBind);
d->resetBindCount();
return d->error.type() == QSqlError::NoError;
}
void QOCIResult::virtual_hook(int id, void *data)
{
Q_ASSERT(data);
switch (id) {
case QSqlResult::BatchOperation:
QOCICols::execBatch(d, boundValues(), *reinterpret_cast<bool *>(data));
break;
default:
QSqlCachedResult::virtual_hook(id, data);
}

View File

@ -83,6 +83,7 @@ protected:
int numRowsAffected();
QSqlRecord record() const;
QVariant lastInsertId() const;
bool execBatch(bool arrayBind = false);
void virtual_hook(int id, void *data);
private:

View File

@ -1710,19 +1710,17 @@ bool QODBCResult::nextResult()
void QODBCResult::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::DetachFromResultSet:
if (d->hStmt)
SQLCloseCursor(d->hStmt);
break;
case QSqlResult::NextResult:
Q_ASSERT(data);
*static_cast<bool*>(data) = nextResult();
break;
default:
QSqlResult::virtual_hook(id, data);
}
}
void QODBCResult::detachFromResultSet()
{
if (d->hStmt)
SQLCloseCursor(d->hStmt);
}
void QODBCResult::setForwardOnly(bool forward)
{
d->userForwardOnly = forward;

View File

@ -104,6 +104,7 @@ protected:
int numRowsAffected();
QSqlRecord record() const;
void virtual_hook(int id, void *data);
void detachFromResultSet();
bool nextResult();
private:

View File

@ -334,10 +334,6 @@ QSQLiteResult::~QSQLiteResult()
void QSQLiteResult::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::DetachFromResultSet:
if (d->stmt)
sqlite3_reset(d->stmt);
break;
default:
QSqlCachedResult::virtual_hook(id, data);
}
@ -495,6 +491,12 @@ QSqlRecord QSQLiteResult::record() const
return d->rInf;
}
void QSQLiteResult::detachFromResultSet()
{
if (d->stmt)
sqlite3_reset(d->stmt);
}
QVariant QSQLiteResult::handle() const
{
return QVariant::fromValue(d->stmt);

View File

@ -79,6 +79,7 @@ protected:
int numRowsAffected();
QVariant lastInsertId() const;
QSqlRecord record() const;
void detachFromResultSet();
void virtual_hook(int id, void *data);
private:

View File

@ -267,9 +267,6 @@ QSQLite2Result::~QSQLite2Result()
void QSQLite2Result::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::DetachFromResultSet:
d->finalize();
break;
default:
QSqlCachedResult::virtual_hook(id, data);
}
@ -343,6 +340,11 @@ QSqlRecord QSQLite2Result::record() const
return d->rInf;
}
void QSQLite2Result::detachFromResultSet()
{
d->finalize();
}
QVariant QSQLite2Result::handle() const
{
return QVariant::fromValue(d->currentMachine);

View File

@ -77,6 +77,7 @@ protected:
int size();
int numRowsAffected();
QSqlRecord record() const;
void detachFromResultSet();
void virtual_hook(int id, void *data);
private:

View File

@ -305,14 +305,21 @@ QSqlCachedResult::ValueCache &QSqlCachedResult::cache()
void QSqlCachedResult::virtual_hook(int id, void *data)
{
switch (id) {
case QSqlResult::DetachFromResultSet:
case QSqlResult::SetNumericalPrecision:
cleanup();
break;
default:
QSqlResult::virtual_hook(id, data);
}
}
void QSqlCachedResult::detachFromResultSet()
{
cleanup();
}
void QSqlCachedResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy)
{
QSqlResult::setNumericalPrecisionPolicy(policy);
cleanup();
}
QT_END_NAMESPACE

View File

@ -90,6 +90,8 @@ protected:
ValueCache &cache();
void virtual_hook(int id, void *data);
void detachFromResultSet();
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy);
private:
bool cacheNext();
QSqlCachedResultPrivate *d;

View File

@ -961,32 +961,24 @@ void QSqlResult::virtual_hook(int, void *)
*/
bool QSqlResult::execBatch(bool arrayBind)
{
if (driver()->hasFeature(QSqlDriver::BatchOperations)) {
virtual_hook(BatchOperation, &arrayBind);
d->resetBindCount();
return d->error.type() == QSqlError::NoError;
} else {
QVector<QVariant> values = d->values;
if (values.count() == 0)
Q_UNUSED(arrayBind);
QVector<QVariant> values = d->values;
if (values.count() == 0)
return false;
for (int i = 0; i < values.at(0).toList().count(); ++i) {
for (int j = 0; j < values.count(); ++j)
bindValue(j, values.at(j).toList().at(i), QSql::In);
if (!exec())
return false;
for (int i = 0; i < values.at(0).toList().count(); ++i) {
for (int j = 0; j < values.count(); ++j)
bindValue(j, values.at(j).toList().at(i), QSql::In);
if (!exec())
return false;
}
return true;
}
return false;
return true;
}
/*! \internal
*/
void QSqlResult::detachFromResultSet()
{
if (driver()->hasFeature(QSqlDriver::FinishQuery)
|| driver()->hasFeature(QSqlDriver::SimpleLocking))
virtual_hook(DetachFromResultSet, 0);
}
/*! \internal
@ -994,7 +986,6 @@ void QSqlResult::detachFromResultSet()
void QSqlResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy)
{
d->precisionPolicy = policy;
virtual_hook(SetNumericalPrecision, &policy);
}
/*! \internal
@ -1008,11 +999,6 @@ QSql::NumericalPrecisionPolicy QSqlResult::numericalPrecisionPolicy() const
*/
bool QSqlResult::nextResult()
{
if (driver()->hasFeature(QSqlDriver::MultipleResultSets)) {
bool result = false;
virtual_hook(NextResult, &result);
return result;
}
return false;
}

View File

@ -125,13 +125,13 @@ protected:
virtual QSqlRecord record() const;
virtual QVariant lastInsertId() const;
enum VirtualHookOperation { BatchOperation, DetachFromResultSet, SetNumericalPrecision, NextResult };
enum VirtualHookOperation { };
virtual void virtual_hook(int id, void *data);
bool execBatch(bool arrayBind = false);
void detachFromResultSet();
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy);
virtual bool execBatch(bool arrayBind = false);
virtual void detachFromResultSet();
virtual void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy);
QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const;
bool nextResult();
virtual bool nextResult();
private:
QSqlResultPrivate* d;