diff options
Diffstat (limited to 'src/sql/drivers/sqlite')
-rw-r--r-- | src/sql/drivers/sqlite/qsql_sqlite.cpp | 70 | ||||
-rw-r--r-- | src/sql/drivers/sqlite/qsql_sqlite_p.h | 5 |
2 files changed, 43 insertions, 32 deletions
diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp index 4286f5b338..66e5724e6f 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite.cpp +++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp @@ -105,8 +105,9 @@ class QSQLiteResultPrivate; class QSQLiteResult : public QSqlCachedResult { + Q_DECLARE_PRIVATE(QSQLiteResult) friend class QSQLiteDriver; - friend class QSQLiteResultPrivate; + public: explicit QSQLiteResult(const QSQLiteDriver* db); ~QSQLiteResult(); @@ -123,13 +124,12 @@ protected: QSqlRecord record() const Q_DECL_OVERRIDE; void detachFromResultSet() Q_DECL_OVERRIDE; void virtual_hook(int id, void *data) Q_DECL_OVERRIDE; - -private: - QSQLiteResultPrivate* d; }; class QSQLiteDriverPrivate : public QSqlDriverPrivate { + Q_DECLARE_PUBLIC(QSQLiteDriver) + public: inline QSQLiteDriverPrivate() : QSqlDriverPrivate(), access(0) { dbmsType = QSqlDriver::SQLite; } sqlite3 *access; @@ -137,19 +137,19 @@ public: }; -class QSQLiteResultPrivate +class QSQLiteResultPrivate: public QSqlCachedResultPrivate { + Q_DECLARE_PUBLIC(QSQLiteResult) + public: - QSQLiteResultPrivate(QSQLiteResult *res); + Q_DECLARE_SQLDRIVER_PRIVATE(QSQLiteDriver) + QSQLiteResultPrivate(QSQLiteResult *q, const QSQLiteDriver *drv); void cleanup(); bool fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch); // initializes the recordInfo and the cache void initColumns(bool emptyResultset); void finalize(); - QSQLiteResult* q; - sqlite3 *access; - sqlite3_stmt *stmt; bool skippedStatus; // the status of the fetchNext() that's skipped @@ -158,13 +158,17 @@ public: QVector<QVariant> firstRow; }; -QSQLiteResultPrivate::QSQLiteResultPrivate(QSQLiteResult* res) : q(res), access(0), - stmt(0), skippedStatus(false), skipRow(false) +QSQLiteResultPrivate::QSQLiteResultPrivate(QSQLiteResult *q, const QSQLiteDriver *drv) + : QSqlCachedResultPrivate(q, drv), + stmt(0), + skippedStatus(false), + skipRow(false) { } void QSQLiteResultPrivate::cleanup() { + Q_Q(QSQLiteResult); finalize(); rInf.clear(); skippedStatus = false; @@ -185,6 +189,7 @@ void QSQLiteResultPrivate::finalize() void QSQLiteResultPrivate::initColumns(bool emptyResultset) { + Q_Q(QSQLiteResult); int nCols = sqlite3_column_count(stmt); if (nCols <= 0) return; @@ -236,6 +241,7 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset) bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch) { + Q_Q(QSQLiteResult); int res; int i; @@ -318,7 +324,7 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i // SQLITE_ERROR is a generic error code and we must call sqlite3_reset() // to get the specific error message. res = sqlite3_reset(stmt); - q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult", + q->setLastError(qMakeError(drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); q->setAt(QSql::AfterLastRow); return false; @@ -326,7 +332,7 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i case SQLITE_BUSY: default: // something wrong, don't get col info, but still return false - q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult", + q->setLastError(qMakeError(drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); sqlite3_reset(stmt); q->setAt(QSql::AfterLastRow); @@ -336,20 +342,18 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i } QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db) - : QSqlCachedResult(db) + : QSqlCachedResult(*new QSQLiteResultPrivate(this, db)) { - d = new QSQLiteResultPrivate(this); - d->access = db->d_func()->access; - const_cast<QSQLiteDriverPrivate*>(db->d_func())->results.append(this); + Q_D(QSQLiteResult); + const_cast<QSQLiteDriverPrivate*>(d->drv_d_func())->results.append(this); } QSQLiteResult::~QSQLiteResult() { - const QSqlDriver *sqlDriver = driver(); - if (sqlDriver) - const_cast<QSQLiteDriverPrivate*>(qobject_cast<const QSQLiteDriver *>(sqlDriver)->d_func())->results.removeOne(this); + Q_D(QSQLiteResult); + if (d->drv_d_func()) + const_cast<QSQLiteDriverPrivate*>(d->drv_d_func())->results.removeOne(this); d->cleanup(); - delete d; } void QSQLiteResult::virtual_hook(int id, void *data) @@ -366,6 +370,7 @@ bool QSQLiteResult::reset(const QString &query) bool QSQLiteResult::prepare(const QString &query) { + Q_D(QSQLiteResult); if (!driver() || !driver()->isOpen() || driver()->isOpenError()) return false; @@ -376,7 +381,7 @@ bool QSQLiteResult::prepare(const QString &query) const void *pzTail = NULL; #if (SQLITE_VERSION_NUMBER >= 3003011) - int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), + int res = sqlite3_prepare16_v2(d->drv_d_func()->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, &pzTail); #else int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), @@ -384,12 +389,12 @@ bool QSQLiteResult::prepare(const QString &query) #endif if (res != SQLITE_OK) { - setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", + setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to execute statement"), QSqlError::StatementError, res)); d->finalize(); return false; } else if (pzTail && !QString(reinterpret_cast<const QChar *>(pzTail)).trimmed().isEmpty()) { - setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", + setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE)); d->finalize(); return false; @@ -399,6 +404,7 @@ bool QSQLiteResult::prepare(const QString &query) bool QSQLiteResult::exec() { + Q_D(QSQLiteResult); const QVector<QVariant> values = boundValues(); d->skippedStatus = false; @@ -409,7 +415,7 @@ bool QSQLiteResult::exec() int res = sqlite3_reset(d->stmt); if (res != SQLITE_OK) { - setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", + setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to reset statement"), QSqlError::StatementError, res)); d->finalize(); return false; @@ -469,7 +475,7 @@ bool QSQLiteResult::exec() } } if (res != SQLITE_OK) { - setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", + setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult", "Unable to bind parameters"), QSqlError::StatementError, res)); d->finalize(); return false; @@ -493,6 +499,7 @@ bool QSQLiteResult::exec() bool QSQLiteResult::gotoNext(QSqlCachedResult::ValueCache& row, int idx) { + Q_D(QSQLiteResult); return d->fetchNext(row, idx, false); } @@ -503,13 +510,15 @@ int QSQLiteResult::size() int QSQLiteResult::numRowsAffected() { - return sqlite3_changes(d->access); + Q_D(const QSQLiteResult); + return sqlite3_changes(d->drv_d_func()->access); } QVariant QSQLiteResult::lastInsertId() const { + Q_D(const QSQLiteResult); if (isActive()) { - qint64 id = sqlite3_last_insert_rowid(d->access); + qint64 id = sqlite3_last_insert_rowid(d->drv_d_func()->access); if (id) return id; } @@ -518,6 +527,7 @@ QVariant QSQLiteResult::lastInsertId() const QSqlRecord QSQLiteResult::record() const { + Q_D(const QSQLiteResult); if (!isActive() || !isSelect()) return QSqlRecord(); return d->rInf; @@ -525,12 +535,14 @@ QSqlRecord QSQLiteResult::record() const void QSQLiteResult::detachFromResultSet() { + Q_D(QSQLiteResult); if (d->stmt) sqlite3_reset(d->stmt); } QVariant QSQLiteResult::handle() const { + Q_D(const QSQLiteResult); return QVariant::fromValue(d->stmt); } @@ -640,7 +652,7 @@ void QSQLiteDriver::close() Q_D(QSQLiteDriver); if (isOpen()) { foreach (QSQLiteResult *result, d->results) { - result->d->finalize(); + result->d_func()->finalize(); } if (sqlite3_close(d->access) != SQLITE_OK) diff --git a/src/sql/drivers/sqlite/qsql_sqlite_p.h b/src/sql/drivers/sqlite/qsql_sqlite_p.h index 23b598de98..d0dc91daab 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite_p.h +++ b/src/sql/drivers/sqlite/qsql_sqlite_p.h @@ -46,7 +46,6 @@ // #include <QtSql/qsqldriver.h> -#include <QtSql/qsqlresult.h> struct sqlite3; @@ -58,14 +57,14 @@ struct sqlite3; QT_BEGIN_NAMESPACE +class QSqlResult; class QSQLiteDriverPrivate; -class QSQLiteDriver; class Q_EXPORT_SQLDRIVER_SQLITE QSQLiteDriver : public QSqlDriver { Q_DECLARE_PRIVATE(QSQLiteDriver) Q_OBJECT - friend class QSQLiteResult; + friend class QSQLiteResultPrivate; public: explicit QSQLiteDriver(QObject *parent = 0); explicit QSQLiteDriver(sqlite3 *connection, QObject *parent = 0); |