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
parent
637ecd571f
commit
fc15a1d5e2
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ protected:
|
|||
int numRowsAffected();
|
||||
QSqlRecord record() const;
|
||||
void virtual_hook(int id, void *data);
|
||||
void detachFromResultSet();
|
||||
bool nextResult();
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ protected:
|
|||
int numRowsAffected();
|
||||
QSqlRecord record() const;
|
||||
void virtual_hook(int id, void *data);
|
||||
void detachFromResultSet();
|
||||
bool nextResult();
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ protected:
|
|||
int numRowsAffected();
|
||||
QVariant lastInsertId() const;
|
||||
QSqlRecord record() const;
|
||||
void detachFromResultSet();
|
||||
void virtual_hook(int id, void *data);
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ protected:
|
|||
int size();
|
||||
int numRowsAffected();
|
||||
QSqlRecord record() const;
|
||||
void detachFromResultSet();
|
||||
void virtual_hook(int id, void *data);
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue