QSqlResult: replace virtual hooks with virtual functions
authorMark Brand <mabrand@mabrand.nl>
Tue, 5 Jun 2012 11:50:03 +0000 (13:50 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 6 Jun 2012 11:23:51 +0000 (13:23 +0200)
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>
15 files changed:
src/sql/drivers/db2/qsql_db2.cpp
src/sql/drivers/db2/qsql_db2.h
src/sql/drivers/mysql/qsql_mysql.cpp
src/sql/drivers/oci/qsql_oci.cpp
src/sql/drivers/oci/qsql_oci.h
src/sql/drivers/odbc/qsql_odbc.cpp
src/sql/drivers/odbc/qsql_odbc.h
src/sql/drivers/sqlite/qsql_sqlite.cpp
src/sql/drivers/sqlite/qsql_sqlite.h
src/sql/drivers/sqlite2/qsql_sqlite2.cpp
src/sql/drivers/sqlite2/qsql_sqlite2.h
src/sql/kernel/qsqlcachedresult.cpp
src/sql/kernel/qsqlcachedresult_p.h
src/sql/kernel/qsqlresult.cpp
src/sql/kernel/qsqlresult.h

index d5d02ff..8ee65fd 100644 (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)
index a2462a3..cf25dee 100644 (file)
@@ -80,6 +80,7 @@ protected:
     int numRowsAffected();
     QSqlRecord record() const;
     void virtual_hook(int id, void *data);
+    void detachFromResultSet();
     bool nextResult();
 
 private:
index 9bd1de1..84648ae 100644 (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);
     }
index 1e001f7..02eda36 100644 (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);
     }
index 9e97c84..42a7c86 100644 (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:
index 04bc0cc..05f740c 100644 (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;
index a89ce0f..6ae65a0 100644 (file)
@@ -104,6 +104,7 @@ protected:
     int numRowsAffected();
     QSqlRecord record() const;
     void virtual_hook(int id, void *data);
+    void detachFromResultSet();
     bool nextResult();
 
 private:
index 168500e..bfd08c9 100644 (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);
index 8232be0..0af6f63 100644 (file)
@@ -79,6 +79,7 @@ protected:
     int numRowsAffected();
     QVariant lastInsertId() const;
     QSqlRecord record() const;
+    void detachFromResultSet();
     void virtual_hook(int id, void *data);
 
 private:
index 5387640..70dd178 100644 (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);
index 4df870f..83961ec 100644 (file)
@@ -77,6 +77,7 @@ protected:
     int size();
     int numRowsAffected();
     QSqlRecord record() const;
+    void detachFromResultSet();
     void virtual_hook(int id, void *data);
 
 private:
index 1971a29..38d9525 100644 (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
index 9feaa54..1fcd62b 100644 (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;
index 03e227b..2abcf85 100644 (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;
 }
 
index 162451c..9c4213f 100644 (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;