From 708d39fa31368f80152440e94e4a361d024b19c1 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Wed, 3 Apr 2013 21:39:43 +0200 Subject: QSqlDriverPrivate clean-up Change-Id: Ia6cbb37330bc0beed7498e43cd18bb2a1afb8e3d Reviewed-by: Andy Shaw --- src/sql/kernel/qsqldriver_p.h | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'src/sql') diff --git a/src/sql/kernel/qsqldriver_p.h b/src/sql/kernel/qsqldriver_p.h index 1e7e3cc7a0..899c85ab8a 100644 --- a/src/sql/kernel/qsqldriver_p.h +++ b/src/sql/kernel/qsqldriver_p.h @@ -63,29 +63,24 @@ class QSqlDriverPrivate : public QObjectPrivate { public: enum DBMSType {UnknownDB, MSSqlServer, MySqlServer, PostgreSQL, Oracle, Sybase, SQLite, Interbase, DB2}; - QSqlDriverPrivate(); - virtual ~QSqlDriverPrivate(); -public: + QSqlDriverPrivate() + : QObjectPrivate(), + isOpen(false), + isOpenError(false), + precisionPolicy(QSql::LowPrecisionDouble), + dbmsType(UnknownDB) + { } + // @CHECK: this member is never used. It was named q, which expanded to q_func(). QSqlDriver *q_func(); - uint isOpen : 1; - uint isOpenError : 1; + uint isOpen; + uint isOpenError; QSqlError error; QSql::NumericalPrecisionPolicy precisionPolicy; DBMSType dbmsType; }; -inline QSqlDriverPrivate::QSqlDriverPrivate() - : QObjectPrivate(), isOpen(false), isOpenError(false), precisionPolicy(QSql::LowPrecisionDouble), - dbmsType(UnknownDB) -{ -} - -QSqlDriverPrivate::~QSqlDriverPrivate() -{ -} - QT_END_NAMESPACE #endif // QSQLDRIVER_P_H -- cgit v1.2.3 From 0bdc86d9ef7be8e27598d245c6ca8026f08aff12 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Wed, 3 Apr 2013 21:44:30 +0200 Subject: QSqlDriver: use Q_DECLARE_PUBLIC/Q_DECLARE_PRIVATE 406c8ef6e67da introduced deriving the private SQL driver classes from QSqlDriverPrivate. However, the drivers continued to keep their own pointer to the private class, even though QObject provides the same pointer. Worse yet, the private class is allocated too late and not even passed to QSqlDriver. The result is that QSqlDriver allocates a separate instance of QSqlDriverPrivate. This is likely to cause all kinds of chaos. The private class needs to be allocated in time pass it to QSqlDriver which passes it on to QObject. This commit covers the the base class and drivers: ibase mysql odbc psql sqlite tds Fixes for the remaining drivers will follow. Change-Id: Id8e7ec4205b0ca6cd00bd022c9cd24f137089245 Reviewed-by: Andy Shaw --- src/sql/drivers/ibase/qsql_ibase.cpp | 30 ++++++++++----- src/sql/drivers/ibase/qsql_ibase_p.h | 7 +--- src/sql/drivers/mysql/qsql_mysql.cpp | 69 ++++++++++++++++++++-------------- src/sql/drivers/mysql/qsql_mysql_p.h | 4 +- src/sql/drivers/odbc/qsql_odbc.cpp | 44 ++++++++++++---------- src/sql/drivers/odbc/qsql_odbc_p.h | 3 +- src/sql/drivers/psql/qsql_psql.cpp | 48 +++++++++++++++-------- src/sql/drivers/psql/qsql_psql_p.h | 5 +-- src/sql/drivers/sqlite/qsql_sqlite.cpp | 16 ++++---- src/sql/drivers/sqlite/qsql_sqlite_p.h | 4 +- src/sql/drivers/tds/qsql_tds.cpp | 16 +++++--- src/sql/drivers/tds/qsql_tds_p.h | 2 +- src/sql/kernel/qsqldriver.cpp | 7 ++++ src/sql/kernel/qsqldriver.h | 1 + src/sql/kernel/qsqldriver_p.h | 4 +- 15 files changed, 154 insertions(+), 106 deletions(-) (limited to 'src/sql') diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 2137514679..bd97db189c 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -312,11 +312,13 @@ struct QIBaseEventBuffer { class QIBaseDriverPrivate : public QSqlDriverPrivate { + Q_DECLARE_PUBLIC(QIBaseDriver) public: - QIBaseDriverPrivate(QIBaseDriver *d) : QSqlDriverPrivate(), q(d), ibase(0), trans(0), tc(0) { dbmsType = Interbase; } + QIBaseDriverPrivate() : QSqlDriverPrivate(), ibase(0), trans(0), tc(0) { dbmsType = Interbase; } bool isError(const char *msg, QSqlError::ErrorType typ = QSqlError::UnknownError) { + Q_Q(QIBaseDriver); QString imsg; ISC_LONG sqlcode; if (!getIBaseError(imsg, status, sqlcode, tc)) @@ -328,7 +330,6 @@ public: } public: - QIBaseDriver* q; isc_db_handle ibase; isc_tr_handle trans; QTextCodec *tc; @@ -418,9 +419,9 @@ public: QIBaseResultPrivate::QIBaseResultPrivate(QIBaseResult *d, const QIBaseDriver *ddb): - q(d), db(ddb), trans(0), stmt(0), ibase(ddb->d->ibase), sqlda(0), inda(0), queryType(-1), tc(ddb->d->tc) + q(d), db(ddb), trans(0), stmt(0), ibase(ddb->d_func()->ibase), sqlda(0), inda(0), queryType(-1), tc(ddb->d_func()->tc) { - localTransaction = (ddb->d->ibase == 0); + localTransaction = (ddb->d_func()->ibase == 0); } void QIBaseResultPrivate::cleanup() @@ -861,9 +862,9 @@ bool QIBaseResultPrivate::transaction() { if (trans) return true; - if (db->d->trans) { + if (db->d_func()->trans) { localTransaction = false; - trans = db->d->trans; + trans = db->d_func()->trans; return true; } localTransaction = true; @@ -1396,15 +1397,14 @@ QVariant QIBaseResult::handle() const /*********************************/ QIBaseDriver::QIBaseDriver(QObject * parent) - : QSqlDriver(parent) + : QSqlDriver(*new QIBaseDriverPrivate, parent) { - d = new QIBaseDriverPrivate(this); } QIBaseDriver::QIBaseDriver(isc_db_handle connection, QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QIBaseDriverPrivate, parent) { - d = new QIBaseDriverPrivate(this); + Q_D(QIBaseDriver); d->ibase = connection; setOpen(true); setOpenError(false); @@ -1444,6 +1444,7 @@ bool QIBaseDriver::open(const QString & db, int /*port*/, const QString & connOpts) { + Q_D(QIBaseDriver); if (isOpen()) close(); @@ -1526,6 +1527,7 @@ bool QIBaseDriver::open(const QString & db, void QIBaseDriver::close() { + Q_D(QIBaseDriver); if (isOpen()) { if (d->eventBuffers.size()) { @@ -1562,6 +1564,7 @@ QSqlResult *QIBaseDriver::createResult() const bool QIBaseDriver::beginTransaction() { + Q_D(QIBaseDriver); if (!isOpen() || isOpenError()) return false; if (d->trans) @@ -1574,6 +1577,7 @@ bool QIBaseDriver::beginTransaction() bool QIBaseDriver::commitTransaction() { + Q_D(QIBaseDriver); if (!isOpen() || isOpenError()) return false; if (!d->trans) @@ -1587,6 +1591,7 @@ bool QIBaseDriver::commitTransaction() bool QIBaseDriver::rollbackTransaction() { + Q_D(QIBaseDriver); if (!isOpen() || isOpenError()) return false; if (!d->trans) @@ -1749,6 +1754,7 @@ QString QIBaseDriver::formatValue(const QSqlField &field, bool trimStrings) cons QVariant QIBaseDriver::handle() const { + Q_D(const QIBaseDriver); return QVariant(qRegisterMetaType("isc_db_handle"), &d->ibase); } @@ -1777,6 +1783,7 @@ static isc_callback qEventCallback(char *result, short length, char *updated) bool QIBaseDriver::subscribeToNotification(const QString &name) { + Q_D(QIBaseDriver); if (!isOpen()) { qWarning("QIBaseDriver::subscribeFromNotificationImplementation: database not open."); return false; @@ -1826,6 +1833,7 @@ bool QIBaseDriver::subscribeToNotification(const QString &name) bool QIBaseDriver::unsubscribeFromNotification(const QString &name) { + Q_D(QIBaseDriver); if (!isOpen()) { qWarning("QIBaseDriver::unsubscribeFromNotificationImplementation: database not open."); return false; @@ -1855,11 +1863,13 @@ bool QIBaseDriver::unsubscribeFromNotification(const QString &name) QStringList QIBaseDriver::subscribedToNotifications() const { + Q_D(const QIBaseDriver); return QStringList(d->eventBuffers.keys()); } void QIBaseDriver::qHandleEventNotification(void *updatedResultBuffer) { + Q_D(QIBaseDriver); QMap::const_iterator i; for (i = d->eventBuffers.constBegin(); i != d->eventBuffers.constEnd(); ++i) { QIBaseEventBuffer* eBuffer = i.value(); diff --git a/src/sql/drivers/ibase/qsql_ibase_p.h b/src/sql/drivers/ibase/qsql_ibase_p.h index b2560ca17c..ab9edfd1a5 100644 --- a/src/sql/drivers/ibase/qsql_ibase_p.h +++ b/src/sql/drivers/ibase/qsql_ibase_p.h @@ -64,9 +64,9 @@ class QIBaseDriver; class QIBaseDriver : public QSqlDriver { - Q_OBJECT - friend class QIBaseDriverPrivate; friend class QIBaseResultPrivate; + Q_DECLARE_PRIVATE(QIBaseDriver) + Q_OBJECT public: explicit QIBaseDriver(QObject *parent = 0); explicit QIBaseDriver(isc_db_handle connection, QObject *parent = 0); @@ -104,9 +104,6 @@ public: private Q_SLOTS: void qHandleEventNotification(void* updatedResultBuffer); - -private: - QIBaseDriverPrivate* d; }; QT_END_NAMESPACE diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp index 871b13182f..0e20cf539e 100644 --- a/src/sql/drivers/mysql/qsql_mysql.cpp +++ b/src/sql/drivers/mysql/qsql_mysql.cpp @@ -435,8 +435,8 @@ void QMYSQLResult::cleanup() // must iterate trough leftover result sets from multi-selects or stored procedures // if this isn't done subsequent queries will fail with "Commands out of sync" #if MYSQL_VERSION_ID >= 40100 - while (d->driver && d->driver->d->mysql && mysql_next_result(d->driver->d->mysql) == 0) { - MYSQL_RES *res = mysql_store_result(d->driver->d->mysql); + while (d->driver && d->driver->d_func()->mysql && mysql_next_result(d->driver->d_func()->mysql) == 0) { + MYSQL_RES *res = mysql_store_result(d->driver->d_func()->mysql); if (res) mysql_free_result(res); } @@ -606,7 +606,7 @@ QVariant QMYSQLResult::data(int field) return QVariant(f.type); if (f.type != QVariant::ByteArray) - val = toUnicode(d->driver->d->tc, f.outField, f.bufLength); + val = toUnicode(d->driver->d_func()->tc, f.outField, f.bufLength); } else { if (d->row[field] == NULL) { // NULL value @@ -614,7 +614,7 @@ QVariant QMYSQLResult::data(int field) } fieldLength = mysql_fetch_lengths(d->result)[field]; if (f.type != QVariant::ByteArray) - val = toUnicode(d->driver->d->tc, d->row[field], fieldLength); + val = toUnicode(d->driver->d_func()->tc, d->row[field], fieldLength); } switch(f.type) { @@ -693,22 +693,22 @@ bool QMYSQLResult::reset (const QString& query) cleanup(); - const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); - if (mysql_real_query(d->driver->d->mysql, encQuery.data(), encQuery.length())) { + const QByteArray encQuery(fromUnicode(d->driver->d_func()->tc, query)); + if (mysql_real_query(d->driver->d_func()->mysql, encQuery.data(), encQuery.length())) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute query"), - QSqlError::StatementError, d->driver->d)); + QSqlError::StatementError, d->driver->d_func())); return false; } - d->result = mysql_store_result(d->driver->d->mysql); - if (!d->result && mysql_field_count(d->driver->d->mysql) > 0) { + d->result = mysql_store_result(d->driver->d_func()->mysql); + if (!d->result && mysql_field_count(d->driver->d_func()->mysql) > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store result"), - QSqlError::StatementError, d->driver->d)); + QSqlError::StatementError, d->driver->d_func())); return false; } - int numFields = mysql_field_count(d->driver->d->mysql); + int numFields = mysql_field_count(d->driver->d_func()->mysql); setSelect(numFields != 0); d->fields.resize(numFields); - d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); + d->rowsAffected = mysql_affected_rows(d->driver->d_func()->mysql); if (isSelect()) { for(int i = 0; i < numFields; i++) { @@ -753,7 +753,7 @@ QVariant QMYSQLResult::lastInsertId() const return QVariant(id); #endif } else { - quint64 id = mysql_insert_id(d->driver->d->mysql); + quint64 id = mysql_insert_id(d->driver->d_func()->mysql); if (id) return QVariant(id); } @@ -773,11 +773,11 @@ QSqlRecord QMYSQLResult::record() const res = d->result; #endif - if (!mysql_errno(d->driver->d->mysql)) { + if (!mysql_errno(d->driver->d_func()->mysql)) { mysql_field_seek(res, 0); MYSQL_FIELD* field = mysql_fetch_field(res); while(field) { - info.append(qToField(field, d->driver->d->tc)); + info.append(qToField(field, d->driver->d_func()->tc)); field = mysql_fetch_field(res); } } @@ -802,26 +802,26 @@ bool QMYSQLResult::nextResult() delete[] d->fields[i].outField; d->fields.clear(); - int status = mysql_next_result(d->driver->d->mysql); + int status = mysql_next_result(d->driver->d_func()->mysql); if (status > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute next query"), - QSqlError::StatementError, d->driver->d)); + QSqlError::StatementError, d->driver->d_func())); return false; } else if (status == -1) { return false; // No more result sets } - d->result = mysql_store_result(d->driver->d->mysql); - int numFields = mysql_field_count(d->driver->d->mysql); + d->result = mysql_store_result(d->driver->d_func()->mysql); + int numFields = mysql_field_count(d->driver->d_func()->mysql); if (!d->result && numFields > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store next result"), - QSqlError::StatementError, d->driver->d)); + QSqlError::StatementError, d->driver->d_func())); return false; } setSelect(numFields > 0); d->fields.resize(numFields); - d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); + d->rowsAffected = mysql_affected_rows(d->driver->d_func()->mysql); if (isSelect()) { for (int i = 0; i < numFields; i++) { @@ -874,7 +874,7 @@ bool QMYSQLResult::prepare(const QString& query) return false; #if MYSQL_VERSION_ID >= 40108 cleanup(); - if (!d->driver->d->preparedQuerysEnabled) + if (!d->driver->d_func()->preparedQuerysEnabled) return QSqlResult::prepare(query); int r; @@ -883,14 +883,14 @@ bool QMYSQLResult::prepare(const QString& query) return false; if (!d->stmt) - d->stmt = mysql_stmt_init(d->driver->d->mysql); + d->stmt = mysql_stmt_init(d->driver->d_func()->mysql); if (!d->stmt) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to prepare statement"), - QSqlError::StatementError, d->driver->d)); + QSqlError::StatementError, d->driver->d_func())); return false; } - const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); + const QByteArray encQuery(fromUnicode(d->driver->d_func()->tc, query)); r = mysql_stmt_prepare(d->stmt, encQuery.constData(), encQuery.length()); if (r != 0) { setLastError(qMakeStmtError(QCoreApplication::translate("QMYSQLResult", @@ -1010,7 +1010,7 @@ bool QMYSQLResult::exec() break; case QVariant::String: default: { - QByteArray ba = fromUnicode(d->driver->d->tc, val.toString()); + QByteArray ba = fromUnicode(d->driver->d_func()->tc, val.toString()); stringVector.append(ba); currBind->buffer_type = MYSQL_TYPE_STRING; currBind->buffer = const_cast(ba.constData()); @@ -1115,7 +1115,7 @@ static void qLibraryEnd() } QMYSQLDriver::QMYSQLDriver(QObject * parent) - : QSqlDriver(parent) + : QSqlDriver(*new QMYSQLDriverPrivate, parent) { init(); qLibraryInit(); @@ -1127,8 +1127,9 @@ QMYSQLDriver::QMYSQLDriver(QObject * parent) */ QMYSQLDriver::QMYSQLDriver(MYSQL * con, QObject * parent) - : QSqlDriver(parent) + : QSqlDriver(*new QMYSQLDriverPrivate, parent) { + Q_D(QMYSQLDriver); init(); if (con) { d->mysql = (MYSQL *) con; @@ -1146,7 +1147,7 @@ QMYSQLDriver::QMYSQLDriver(MYSQL * con, QObject * parent) void QMYSQLDriver::init() { - d = new QMYSQLDriverPrivate(); + Q_D(QMYSQLDriver); d->mysql = 0; qMySqlConnectionCount++; } @@ -1160,6 +1161,7 @@ QMYSQLDriver::~QMYSQLDriver() bool QMYSQLDriver::hasFeature(DriverFeature f) const { + Q_D(const QMYSQLDriver); switch (f) { case Transactions: // CLIENT_TRANSACTION should be defined in all recent mysql client libs > 3.23.34 @@ -1227,6 +1229,7 @@ bool QMYSQLDriver::open(const QString& db, int port, const QString& connOpts) { + Q_D(QMYSQLDriver); if (isOpen()) close(); @@ -1328,6 +1331,7 @@ bool QMYSQLDriver::open(const QString& db, void QMYSQLDriver::close() { + Q_D(QMYSQLDriver); if (isOpen()) { #ifndef QT_NO_THREAD mysql_thread_end(); @@ -1346,6 +1350,7 @@ QSqlResult *QMYSQLDriver::createResult() const QStringList QMYSQLDriver::tables(QSql::TableType type) const { + Q_D(const QMYSQLDriver); QStringList tl; #if MYSQL_VERSION_ID >= 40100 if( mysql_get_server_version(d->mysql) < 50000) @@ -1413,6 +1418,7 @@ QSqlIndex QMYSQLDriver::primaryIndex(const QString& tablename) const QSqlRecord QMYSQLDriver::record(const QString& tablename) const { + Q_D(const QMYSQLDriver); QString table=tablename; if(isIdentifierEscaped(table, QSqlDriver::TableName)) table = stripDelimiters(table, QSqlDriver::TableName); @@ -1434,11 +1440,13 @@ QSqlRecord QMYSQLDriver::record(const QString& tablename) const QVariant QMYSQLDriver::handle() const { + Q_D(const QMYSQLDriver); return QVariant::fromValue(d->mysql); } bool QMYSQLDriver::beginTransaction() { + Q_D(QMYSQLDriver); #ifndef CLIENT_TRANSACTIONS return false; #endif @@ -1456,6 +1464,7 @@ bool QMYSQLDriver::beginTransaction() bool QMYSQLDriver::commitTransaction() { + Q_D(QMYSQLDriver); #ifndef CLIENT_TRANSACTIONS return false; #endif @@ -1473,6 +1482,7 @@ bool QMYSQLDriver::commitTransaction() bool QMYSQLDriver::rollbackTransaction() { + Q_D(QMYSQLDriver); #ifndef CLIENT_TRANSACTIONS return false; #endif @@ -1490,6 +1500,7 @@ bool QMYSQLDriver::rollbackTransaction() QString QMYSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const { + Q_D(const QMYSQLDriver); QString r; if (field.isNull()) { r = QLatin1String("NULL"); diff --git a/src/sql/drivers/mysql/qsql_mysql_p.h b/src/sql/drivers/mysql/qsql_mysql_p.h index c23bcd92d7..a1be139b2a 100644 --- a/src/sql/drivers/mysql/qsql_mysql_p.h +++ b/src/sql/drivers/mysql/qsql_mysql_p.h @@ -110,8 +110,9 @@ private: class Q_EXPORT_SQLDRIVER_MYSQL QMYSQLDriver : public QSqlDriver { - Q_OBJECT friend class QMYSQLResult; + Q_DECLARE_PRIVATE(QMYSQLDriver) + Q_OBJECT public: explicit QMYSQLDriver(QObject *parent=0); explicit QMYSQLDriver(MYSQL *con, QObject * parent=0); @@ -141,7 +142,6 @@ protected: bool rollbackTransaction(); private: void init(); - QMYSQLDriverPrivate* d; }; QT_END_NAMESPACE diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index f92cda8c25..d36a224d8e 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -188,13 +188,13 @@ public: bool QODBCPrivate::isStmtHandleValid(const QSqlDriver *driver) { const QODBCDriver *odbcdriver = static_cast (driver); - return disconnectCount == odbcdriver->d->disconnectCount; + return disconnectCount == odbcdriver->d_func()->disconnectCount; } void QODBCPrivate::updateStmtHandleState(const QSqlDriver *driver) { const QODBCDriver *odbcdriver = static_cast (driver); - disconnectCount = odbcdriver->d->disconnectCount; + disconnectCount = odbcdriver->d_func()->disconnectCount; } static QString qWarnODBCHandle(int handleType, SQLHANDLE handle, int *nativeCode = 0) @@ -1767,15 +1767,14 @@ void QODBCResult::setForwardOnly(bool forward) QODBCDriver::QODBCDriver(QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QODBCDriverPrivate, parent) { - init(); } -QODBCDriver::QODBCDriver(SQLHANDLE env, SQLHANDLE con, QObject * parent) - : QSqlDriver(parent) +QODBCDriver::QODBCDriver(SQLHANDLE env, SQLHANDLE con, QObject *parent) + : QSqlDriver(*new QODBCDriverPrivate, parent) { - init(); + Q_D(QODBCDriver); d->hEnv = env; d->hDbc = con; if (env && con) { @@ -1784,11 +1783,6 @@ QODBCDriver::QODBCDriver(SQLHANDLE env, SQLHANDLE con, QObject * parent) } } -void QODBCDriver::init() -{ - d = new QODBCDriverPrivate(); -} - QODBCDriver::~QODBCDriver() { cleanup(); @@ -1796,6 +1790,7 @@ QODBCDriver::~QODBCDriver() bool QODBCDriver::hasFeature(DriverFeature f) const { + Q_D(const QODBCDriver); switch (f) { case Transactions: { if (!d->hDbc) @@ -1850,6 +1845,7 @@ bool QODBCDriver::open(const QString & db, int, const QString& connOpts) { + Q_D(QODBCDriver); if (isOpen()) close(); SQLRETURN r; @@ -1946,9 +1942,8 @@ void QODBCDriver::close() void QODBCDriver::cleanup() { + Q_D(QODBCDriver); SQLRETURN r; - if (!d) - return; if(d->hDbc) { // Open statements/descriptors handles are automatically cleaned up by SQLDisconnect @@ -2196,11 +2191,13 @@ void QODBCDriverPrivate::checkDateTimePrecision() QSqlResult *QODBCDriver::createResult() const { - return new QODBCResult(this, d); + Q_D(const QODBCDriver); + return new QODBCResult(this, const_cast(d)); } bool QODBCDriver::beginTransaction() { + Q_D(QODBCDriver); if (!isOpen()) { qWarning() << "QODBCDriver::beginTransaction: Database not open"; return false; @@ -2220,6 +2217,7 @@ bool QODBCDriver::beginTransaction() bool QODBCDriver::commitTransaction() { + Q_D(QODBCDriver); if (!isOpen()) { qWarning() << "QODBCDriver::commitTransaction: Database not open"; return false; @@ -2237,6 +2235,7 @@ bool QODBCDriver::commitTransaction() bool QODBCDriver::rollbackTransaction() { + Q_D(QODBCDriver); if (!isOpen()) { qWarning() << "QODBCDriver::rollbackTransaction: Database not open"; return false; @@ -2254,6 +2253,7 @@ bool QODBCDriver::rollbackTransaction() bool QODBCDriver::endTrans() { + Q_D(QODBCDriver); SQLUINTEGER ac(SQL_AUTOCOMMIT_ON); SQLRETURN r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_AUTOCOMMIT, @@ -2268,6 +2268,7 @@ bool QODBCDriver::endTrans() QStringList QODBCDriver::tables(QSql::TableType type) const { + Q_D(const QODBCDriver); QStringList tl; if (!isOpen()) return tl; @@ -2345,6 +2346,7 @@ QStringList QODBCDriver::tables(QSql::TableType type) const QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const { + Q_D(const QODBCDriver); QSqlIndex index(tablename); if (!isOpen()) return index; @@ -2360,7 +2362,7 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const return index; } QString catalog, schema, table; - d->splitTableQualifier(tablename, catalog, schema, table); + const_cast(d)->splitTableQualifier(tablename, catalog, schema, table); if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) catalog = stripDelimiters(catalog, QSqlDriver::TableName); @@ -2472,13 +2474,14 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const QSqlRecord QODBCDriver::record(const QString& tablename) const { + Q_D(const QODBCDriver); QSqlRecord fil; if (!isOpen()) return fil; SQLHANDLE hStmt; QString catalog, schema, table; - d->splitTableQualifier(tablename, catalog, schema, table); + const_cast(d)->splitTableQualifier(tablename, catalog, schema, table); if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) catalog = stripDelimiters(catalog, QSqlDriver::TableName); @@ -2597,12 +2600,14 @@ QString QODBCDriver::formatValue(const QSqlField &field, QVariant QODBCDriver::handle() const { + Q_D(const QODBCDriver); return QVariant(qRegisterMetaType("SQLHANDLE"), &d->hDbc); } QString QODBCDriver::escapeIdentifier(const QString &identifier, IdentifierType) const { - QChar quote = d->quoteChar(); + Q_D(const QODBCDriver); + QChar quote = const_cast(d)->quoteChar(); QString res = identifier; if(!identifier.isEmpty() && !identifier.startsWith(quote) && !identifier.endsWith(quote) ) { res.replace(quote, QString(quote)+QString(quote)); @@ -2614,7 +2619,8 @@ QString QODBCDriver::escapeIdentifier(const QString &identifier, IdentifierType) bool QODBCDriver::isIdentifierEscaped(const QString &identifier, IdentifierType) const { - QChar quote = d->quoteChar(); + Q_D(const QODBCDriver); + QChar quote = const_cast(d)->quoteChar(); return identifier.size() > 2 && identifier.startsWith(quote) //left delimited && identifier.endsWith(quote); //right delimited diff --git a/src/sql/drivers/odbc/qsql_odbc_p.h b/src/sql/drivers/odbc/qsql_odbc_p.h index 191f64f072..b18768a5a2 100644 --- a/src/sql/drivers/odbc/qsql_odbc_p.h +++ b/src/sql/drivers/odbc/qsql_odbc_p.h @@ -123,6 +123,7 @@ private: class Q_EXPORT_SQLDRIVER_ODBC QODBCDriver : public QSqlDriver { + Q_DECLARE_PRIVATE(QODBCDriver) Q_OBJECT public: explicit QODBCDriver(QObject *parent=0); @@ -154,10 +155,8 @@ protected: bool rollbackTransaction(); private: - void init(); bool endTrans(); void cleanup(); - QODBCDriverPrivate* d; friend class QODBCPrivate; }; diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index aed0a11218..9331f5c371 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -124,9 +124,9 @@ inline void qPQfreemem(void *buffer) class QPSQLDriverPrivate : public QSqlDriverPrivate { + Q_DECLARE_PUBLIC(QPSQLDriver) public: - QPSQLDriverPrivate(QPSQLDriver *qq) : QSqlDriverPrivate(), - q(qq), + QPSQLDriverPrivate() : QSqlDriverPrivate(), connection(0), isUtf8(false), pro(QPSQLDriver::Version6), @@ -135,7 +135,6 @@ public: hasBackslashEscape(false) { dbmsType = PostgreSQL; } - QPSQLDriver *q; PGconn *connection; bool isUtf8; QPSQLDriver::Protocol pro; @@ -179,10 +178,11 @@ void QPSQLDriverPrivate::appendTables(QStringList &tl, QSqlQuery &t, QChar type) PGresult * QPSQLDriverPrivate::exec(const char * stmt) const { + Q_Q(const QPSQLDriver); PGresult *result = PQexec(connection, stmt); if (seid.size() && !pendingNotifyCheck) { pendingNotifyCheck = true; - QMetaObject::invokeMethod(q, "_q_handleNotification", Qt::QueuedConnection, Q_ARG(int,0)); + QMetaObject::invokeMethod(const_cast(q), "_q_handleNotification", Qt::QueuedConnection, Q_ARG(int,0)); } return result; } @@ -205,7 +205,11 @@ public: QString fieldSerial(int i) const { return QLatin1Char('$') + QString::number(i + 1); } void deallocatePreparedStmt(); - const QPSQLDriverPrivate * privDriver() const {Q_Q(const QPSQLResult); return reinterpret_cast(q->driver())->d; } + const QPSQLDriverPrivate * privDriver() const + { + Q_Q(const QPSQLResult); + return reinterpret_cast(q->driver())->d_func(); + } PGresult *result; int currentSize; @@ -767,15 +771,14 @@ QPSQLDriver::Protocol QPSQLDriverPrivate::getPSQLVersion() } QPSQLDriver::QPSQLDriver(QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QPSQLDriverPrivate, parent) { - init(); } QPSQLDriver::QPSQLDriver(PGconn *conn, QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QPSQLDriverPrivate, parent) { - init(); + Q_D(QPSQLDriver); d->connection = conn; if (conn) { d->pro = d->getPSQLVersion(); @@ -785,24 +788,22 @@ QPSQLDriver::QPSQLDriver(PGconn *conn, QObject *parent) } } -void QPSQLDriver::init() -{ - d = new QPSQLDriverPrivate(this); -} - QPSQLDriver::~QPSQLDriver() { + Q_D(QPSQLDriver); if (d->connection) PQfinish(d->connection); } QVariant QPSQLDriver::handle() const { + Q_D(const QPSQLDriver); return QVariant::fromValue(d->connection); } bool QPSQLDriver::hasFeature(DriverFeature f) const { + Q_D(const QPSQLDriver); switch (f) { case Transactions: case QuerySize: @@ -849,6 +850,7 @@ bool QPSQLDriver::open(const QString & db, int port, const QString& connOpts) { + Q_D(QPSQLDriver); if (isOpen()) close(); QString connectString; @@ -891,6 +893,7 @@ bool QPSQLDriver::open(const QString & db, void QPSQLDriver::close() { + Q_D(QPSQLDriver); if (isOpen()) { d->seid.clear(); @@ -915,6 +918,7 @@ QSqlResult *QPSQLDriver::createResult() const bool QPSQLDriver::beginTransaction() { + Q_D(const QPSQLDriver); if (!isOpen()) { qWarning("QPSQLDriver::beginTransaction: Database not open"); return false; @@ -932,6 +936,7 @@ bool QPSQLDriver::beginTransaction() bool QPSQLDriver::commitTransaction() { + Q_D(QPSQLDriver); if (!isOpen()) { qWarning("QPSQLDriver::commitTransaction: Database not open"); return false; @@ -965,6 +970,7 @@ bool QPSQLDriver::commitTransaction() bool QPSQLDriver::rollbackTransaction() { + Q_D(QPSQLDriver); if (!isOpen()) { qWarning("QPSQLDriver::rollbackTransaction: Database not open"); return false; @@ -982,6 +988,7 @@ bool QPSQLDriver::rollbackTransaction() QStringList QPSQLDriver::tables(QSql::TableType type) const { + Q_D(const QPSQLDriver); QStringList tl; if (!isOpen()) return tl; @@ -989,9 +996,9 @@ QStringList QPSQLDriver::tables(QSql::TableType type) const t.setForwardOnly(true); if (type & QSql::Tables) - d->appendTables(tl, t, QLatin1Char('r')); + const_cast(d)->appendTables(tl, t, QLatin1Char('r')); if (type & QSql::Views) - d->appendTables(tl, t, QLatin1Char('v')); + const_cast(d)->appendTables(tl, t, QLatin1Char('v')); if (type & QSql::SystemTables) { t.exec(QLatin1String("select relname from pg_class where (relkind = 'r') " "and (relname like 'pg_%') ")); @@ -1013,6 +1020,7 @@ static void qSplitTableName(QString &tablename, QString &schema) QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const { + Q_D(const QPSQLDriver); QSqlIndex idx(tablename); if (!isOpen()) return idx; @@ -1094,6 +1102,7 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const QSqlRecord QPSQLDriver::record(const QString& tablename) const { + Q_D(const QPSQLDriver); QSqlRecord info; if (!isOpen()) return info; @@ -1231,6 +1240,7 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const { + Q_D(const QPSQLDriver); QString r; if (field.isNull()) { r = QLatin1String("NULL"); @@ -1326,16 +1336,19 @@ QString QPSQLDriver::escapeIdentifier(const QString &identifier, IdentifierType) bool QPSQLDriver::isOpen() const { + Q_D(const QPSQLDriver); return PQstatus(d->connection) == CONNECTION_OK; } QPSQLDriver::Protocol QPSQLDriver::protocol() const { + Q_D(const QPSQLDriver); return d->pro; } bool QPSQLDriver::subscribeToNotification(const QString &name) { + Q_D(QPSQLDriver); if (!isOpen()) { qWarning("QPSQLDriver::subscribeToNotificationImplementation: database not open."); return false; @@ -1373,6 +1386,7 @@ bool QPSQLDriver::subscribeToNotification(const QString &name) bool QPSQLDriver::unsubscribeFromNotification(const QString &name) { + Q_D(QPSQLDriver); if (!isOpen()) { qWarning("QPSQLDriver::unsubscribeFromNotificationImplementation: database not open."); return false; @@ -1404,11 +1418,13 @@ bool QPSQLDriver::unsubscribeFromNotification(const QString &name) QStringList QPSQLDriver::subscribedToNotifications() const { + Q_D(const QPSQLDriver); return d->seid; } void QPSQLDriver::_q_handleNotification(int) { + Q_D(QPSQLDriver); d->pendingNotifyCheck = false; PQconsumeInput(d->connection); diff --git a/src/sql/drivers/psql/qsql_psql_p.h b/src/sql/drivers/psql/qsql_psql_p.h index a20b9de3ef..5f4aa68b9e 100644 --- a/src/sql/drivers/psql/qsql_psql_p.h +++ b/src/sql/drivers/psql/qsql_psql_p.h @@ -103,6 +103,7 @@ class QPSQLDriverPrivate; class Q_EXPORT_SQLDRIVER_PSQL QPSQLDriver : public QSqlDriver { friend class QPSQLResultPrivate; + Q_DECLARE_PRIVATE(QPSQLDriver) Q_OBJECT public: @@ -155,10 +156,6 @@ protected: private Q_SLOTS: void _q_handleNotification(int); - -private: - void init(); - QPSQLDriverPrivate *d; }; QT_END_NAMESPACE diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp index c78f0b6882..ffeb7921b3 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite.cpp +++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp @@ -346,15 +346,15 @@ QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db) : QSqlCachedResult(db) { d = new QSQLiteResultPrivate(this); - d->access = db->d->access; - db->d->results.append(this); + d->access = db->d_func()->access; + const_cast(db->d_func())->results.append(this); } QSQLiteResult::~QSQLiteResult() { const QSqlDriver *sqlDriver = driver(); if (sqlDriver) - qobject_cast(sqlDriver)->d->results.removeOne(this); + const_cast(qobject_cast(sqlDriver)->d_func())->results.removeOne(this); d->cleanup(); delete d; } @@ -530,15 +530,14 @@ QVariant QSQLiteResult::handle() const ///////////////////////////////////////////////////////// QSQLiteDriver::QSQLiteDriver(QObject * parent) - : QSqlDriver(parent) + : QSqlDriver(*new QSQLiteDriverPrivate, parent) { - d = new QSQLiteDriverPrivate(); } QSQLiteDriver::QSQLiteDriver(sqlite3 *connection, QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QSQLiteDriverPrivate, parent) { - d = new QSQLiteDriverPrivate(); + Q_D(QSQLiteDriver); d->access = connection; setOpen(true); setOpenError(false); @@ -579,6 +578,7 @@ bool QSQLiteDriver::hasFeature(DriverFeature f) const */ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts) { + Q_D(QSQLiteDriver); if (isOpen()) close(); @@ -622,6 +622,7 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c void QSQLiteDriver::close() { + Q_D(QSQLiteDriver); if (isOpen()) { foreach (QSQLiteResult *result, d->results) { result->d->finalize(); @@ -778,6 +779,7 @@ QSqlRecord QSQLiteDriver::record(const QString &tbl) const QVariant QSQLiteDriver::handle() const { + Q_D(const QSQLiteDriver); return QVariant::fromValue(d->access); } diff --git a/src/sql/drivers/sqlite/qsql_sqlite_p.h b/src/sql/drivers/sqlite/qsql_sqlite_p.h index 548d1da97c..526dd9a22a 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite_p.h +++ b/src/sql/drivers/sqlite/qsql_sqlite_p.h @@ -71,6 +71,7 @@ class QSQLiteDriver; class Q_EXPORT_SQLDRIVER_SQLITE QSQLiteDriver : public QSqlDriver { + Q_DECLARE_PRIVATE(QSQLiteDriver) Q_OBJECT friend class QSQLiteResult; public: @@ -95,9 +96,6 @@ public: QSqlIndex primaryIndex(const QString &table) const; QVariant handle() const; QString escapeIdentifier(const QString &identifier, IdentifierType) const; - -private: - QSQLiteDriverPrivate* d; }; QT_END_NAMESPACE diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp index fe59fa8822..8d5f63c879 100644 --- a/src/sql/drivers/tds/qsql_tds.cpp +++ b/src/sql/drivers/tds/qsql_tds.cpp @@ -327,12 +327,12 @@ QTDSResult::QTDSResult(const QTDSDriver* db) : QSqlCachedResult(db) { d = new QTDSResultPrivate(); - d->login = db->d->login; + d->login = db->d_func()->login; - d->dbproc = dbopen(d->login, const_cast(db->d->hostName.toLatin1().constData())); + d->dbproc = dbopen(d->login, const_cast(db->d_func()->hostName.toLatin1().constData())); if (!d->dbproc) return; - if (dbuse(d->dbproc, const_cast(db->d->db.toLatin1().constData())) == FAIL) + if (dbuse(d->dbproc, const_cast(db->d_func()->db.toLatin1().constData())) == FAIL) return; // insert d in error handler dict @@ -541,14 +541,15 @@ QSqlRecord QTDSResult::record() const /////////////////////////////////////////////////////////////////// QTDSDriver::QTDSDriver(QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QTDSDriverPrivate, parent) { init(); } QTDSDriver::QTDSDriver(LOGINREC* rec, const QString& host, const QString &db, QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QTDSDriverPrivate, parent) { + Q_D(QTDSDriver); init(); d->login = rec; d->hostName = host; @@ -561,12 +562,13 @@ QTDSDriver::QTDSDriver(LOGINREC* rec, const QString& host, const QString &db, QO QVariant QTDSDriver::handle() const { + Q_D(const QTDSDriver); return QVariant(qRegisterMetaType("LOGINREC*"), &d->login); } void QTDSDriver::init() { - d = new QTDSDriverPrivate(); + Q_D(QTDSDriver); d->initialized = (dbinit() == SUCCEED); // the following two code-lines will fail compilation on some FreeTDS versions // just comment them out if you have FreeTDS (you won't get any errors and warnings then) @@ -606,6 +608,7 @@ bool QTDSDriver::open(const QString & db, int /*port*/, const QString& /*connOpts*/) { + Q_D(QTDSDriver); if (isOpen()) close(); if (!d->initialized) { @@ -645,6 +648,7 @@ bool QTDSDriver::open(const QString & db, void QTDSDriver::close() { + Q_D(QTDSDriver); if (isOpen()) { #ifdef Q_USE_SYBASE dbloginfree(d->login); diff --git a/src/sql/drivers/tds/qsql_tds_p.h b/src/sql/drivers/tds/qsql_tds_p.h index 5336f183ef..dd7088a167 100644 --- a/src/sql/drivers/tds/qsql_tds_p.h +++ b/src/sql/drivers/tds/qsql_tds_p.h @@ -84,6 +84,7 @@ class QTDSDriver; class Q_EXPORT_SQLDRIVER_TDS QTDSDriver : public QSqlDriver { + Q_DECLARE_PRIVATE(QTDSDriver) Q_OBJECT friend class QTDSResult; public: @@ -115,7 +116,6 @@ protected: bool rollbackTransaction(); private: void init(); - QTDSDriverPrivate *d; }; QT_END_NAMESPACE diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index 97f95e6280..63b90f27c6 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -88,6 +88,13 @@ QSqlDriver::QSqlDriver(QObject *parent) { } +/*! \internal +*/ +QSqlDriver::QSqlDriver(QSqlDriverPrivate &dd, QObject *parent) + : QObject(dd, parent) +{ +} + /*! Destroys the object and frees any allocated resources. */ diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 5e0950e57b..017ffd4e4a 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -126,6 +126,7 @@ Q_SIGNALS: void notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload); protected: + QSqlDriver(QSqlDriverPrivate &dd, QObject *parent = 0); virtual void setOpen(bool o); virtual void setOpenError(bool e); virtual void setLastError(const QSqlError& e); diff --git a/src/sql/kernel/qsqldriver_p.h b/src/sql/kernel/qsqldriver_p.h index 899c85ab8a..05570e584c 100644 --- a/src/sql/kernel/qsqldriver_p.h +++ b/src/sql/kernel/qsqldriver_p.h @@ -61,6 +61,8 @@ QT_BEGIN_NAMESPACE class QSqlDriverPrivate : public QObjectPrivate { + Q_DECLARE_PUBLIC(QSqlDriver) + public: enum DBMSType {UnknownDB, MSSqlServer, MySqlServer, PostgreSQL, Oracle, Sybase, SQLite, Interbase, DB2}; @@ -72,8 +74,6 @@ public: dbmsType(UnknownDB) { } - // @CHECK: this member is never used. It was named q, which expanded to q_func(). - QSqlDriver *q_func(); uint isOpen; uint isOpenError; QSqlError error; -- cgit v1.2.3 From c8c8093561e1e15d1931c88f42dd876a569c2974 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Thu, 4 Apr 2013 01:05:58 +0200 Subject: QTDSDriver: fix index out of range Follow-up to 5544208e2. Change-Id: Iba3ff291622533e8050ddc0494e4488233727ebe Reviewed-by: Andy Shaw Reviewed-by: Thiago Macieira --- src/sql/drivers/tds/qsql_tds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/sql') diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp index 8d5f63c879..69534fe380 100644 --- a/src/sql/drivers/tds/qsql_tds.cpp +++ b/src/sql/drivers/tds/qsql_tds.cpp @@ -355,7 +355,7 @@ void QTDSResult::cleanup() d->clearErrorMsgs(); d->rec.clear(); for (int i = 0; i < d->buffer.size(); ++i) - free(d->buffer.at(i * 2).data); + free(d->buffer.at(i).data); d->buffer.clear(); // "can" stands for "cancel"... very clever. dbcanquery(d->dbproc); -- cgit v1.2.3 From f6011ec52836bff8009739ff3b75c2daf65b3c4c Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Thu, 4 Apr 2013 10:37:04 +0200 Subject: QSQLITE2Driver: use Q_DECLARE_PUBLIC/Q_DECLARE_PRIVATE Follow-up to 0bdc86d9ef7be8 Change-Id: I0a480b5780eb22b1c22e8a47b3a13ab1cd97b934 Reviewed-by: Andy Shaw --- src/sql/drivers/sqlite2/qsql_sqlite2.cpp | 20 +++++++++++++------- src/sql/drivers/sqlite2/qsql_sqlite2_p.h | 6 ++---- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'src/sql') diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp index 39ad122822..7e56d5cc17 100644 --- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp +++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp @@ -281,8 +281,8 @@ QSQLite2Result::QSQLite2Result(const QSQLite2Driver* db) : QSqlCachedResult(db) { d = new QSQLite2ResultPrivate(this); - d->access = db->d->access; - d->utf8 = db->d->utf8; + d->access = db->d_func()->access; + d->utf8 = db->d_func()->utf8; } QSQLite2Result::~QSQLite2Result() @@ -376,16 +376,15 @@ QVariant QSQLite2Result::handle() const ///////////////////////////////////////////////////////// -QSQLite2Driver::QSQLite2Driver(QObject * parent) - : QSqlDriver(parent) +QSQLite2Driver::QSQLite2Driver(QObject *parent) + : QSqlDriver(*new QSQLite2DriverPrivate, parent) { - d = new QSQLite2DriverPrivate(); } QSQLite2Driver::QSQLite2Driver(sqlite *connection, QObject *parent) - : QSqlDriver(parent) + : QSqlDriver(*new QSQLite2DriverPrivate, parent) { - d = new QSQLite2DriverPrivate(); + Q_D(QSQLite2Driver); d->access = connection; setOpen(true); setOpenError(false); @@ -398,6 +397,7 @@ QSQLite2Driver::~QSQLite2Driver() bool QSQLite2Driver::hasFeature(DriverFeature f) const { + Q_D(const QSQLite2Driver); switch (f) { case Transactions: case SimpleLocking: @@ -415,6 +415,7 @@ bool QSQLite2Driver::hasFeature(DriverFeature f) const */ bool QSQLite2Driver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &) { + Q_D(QSQLite2Driver); if (isOpen()) close(); @@ -441,6 +442,7 @@ bool QSQLite2Driver::open(const QString & db, const QString &, const QString &, void QSQLite2Driver::close() { + Q_D(QSQLite2Driver); if (isOpen()) { sqlite_close(d->access); d->access = 0; @@ -456,6 +458,7 @@ QSqlResult *QSQLite2Driver::createResult() const bool QSQLite2Driver::beginTransaction() { + Q_D(QSQLite2Driver); if (!isOpen() || isOpenError()) return false; @@ -473,6 +476,7 @@ bool QSQLite2Driver::beginTransaction() bool QSQLite2Driver::commitTransaction() { + Q_D(QSQLite2Driver); if (!isOpen() || isOpenError()) return false; @@ -490,6 +494,7 @@ bool QSQLite2Driver::commitTransaction() bool QSQLite2Driver::rollbackTransaction() { + Q_D(QSQLite2Driver); if (!isOpen() || isOpenError()) return false; @@ -586,6 +591,7 @@ QSqlRecord QSQLite2Driver::record(const QString &tbl) const QVariant QSQLite2Driver::handle() const { + Q_D(const QSQLite2Driver); return QVariant::fromValue(d->access); } diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2_p.h b/src/sql/drivers/sqlite2/qsql_sqlite2_p.h index 7a075210ae..ae38a662ac 100644 --- a/src/sql/drivers/sqlite2/qsql_sqlite2_p.h +++ b/src/sql/drivers/sqlite2/qsql_sqlite2_p.h @@ -71,8 +71,9 @@ class QSQLite2Driver; class QSQLite2Driver : public QSqlDriver { - Q_OBJECT friend class QSQLite2Result; + Q_DECLARE_PRIVATE(QSQLite2Driver) + Q_OBJECT public: explicit QSQLite2Driver(QObject *parent = 0); explicit QSQLite2Driver(sqlite *connection, QObject *parent = 0); @@ -100,9 +101,6 @@ public: QSqlIndex primaryIndex(const QString &table) const; QVariant handle() const; QString escapeIdentifier(const QString &identifier, IdentifierType) const; - -private: - QSQLite2DriverPrivate* d; }; QT_END_NAMESPACE -- cgit v1.2.3 From 97c6fd22d2dcaf65fc41c2db22f83b5270968062 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 9 Apr 2013 07:31:53 +0200 Subject: Use Q_DECLARE_PRIVATE for Oracle and DB2 plugins This completes the change started with 0bdc86d9ef7be8e27598d245c6ca8026f08aff12 by providing the implementation for the Oracle and DB2 sqldrivers Change-Id: Ia14415c6d7dea51f1369a81236f79aff892b3af7 Reviewed-by: Mark Brand --- src/sql/drivers/db2/qsql_db2.cpp | 17 +++++++++++++---- src/sql/drivers/db2/qsql_db2_p.h | 2 +- src/sql/drivers/oci/qsql_oci.cpp | 21 ++++++++++++++++----- src/sql/drivers/oci/qsql_oci_p.h | 3 +-- 4 files changed, 31 insertions(+), 12 deletions(-) (limited to 'src/sql') diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp index 25da004db8..e58710e0f5 100644 --- a/src/sql/drivers/db2/qsql_db2.cpp +++ b/src/sql/drivers/db2/qsql_db2.cpp @@ -1132,15 +1132,14 @@ void QDB2Result::detachFromResultSet() /************************************/ QDB2Driver::QDB2Driver(QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QDB2DriverPrivate, parent) { - d = new QDB2DriverPrivate; } QDB2Driver::QDB2Driver(Qt::HANDLE env, Qt::HANDLE con, QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QDB2DriverPrivate, parent) { - d = new QDB2DriverPrivate; + Q_D(QDB2Driver); d->hEnv = (SQLHANDLE)env; d->hDbc = (SQLHANDLE)con; if (env && con) { @@ -1157,6 +1156,7 @@ QDB2Driver::~QDB2Driver() bool QDB2Driver::open(const QString& db, const QString& user, const QString& password, const QString& host, int port, const QString& connOpts) { + Q_D(QDB2Driver); if (isOpen()) close(); SQLRETURN r; @@ -1259,6 +1259,7 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas void QDB2Driver::close() { + Q_D(QDB2Driver); SQLRETURN r; if (d->hDbc) { // Open statements/descriptors handles are automatically cleaned up by SQLDisconnect @@ -1285,11 +1286,13 @@ void QDB2Driver::close() QSqlResult *QDB2Driver::createResult() const { + Q_D(const QDB2Driver); return new QDB2Result(this, d); } QSqlRecord QDB2Driver::record(const QString& tableName) const { + Q_D(const QDB2Driver); QSqlRecord fil; if (!isOpen()) return fil; @@ -1363,6 +1366,7 @@ QSqlRecord QDB2Driver::record(const QString& tableName) const QStringList QDB2Driver::tables(QSql::TableType type) const { + Q_D(const QDB2Driver); QStringList tl; if (!isOpen()) return tl; @@ -1434,6 +1438,7 @@ QStringList QDB2Driver::tables(QSql::TableType type) const QSqlIndex QDB2Driver::primaryIndex(const QString& tablename) const { + Q_D(const QDB2Driver); QSqlIndex index(tablename); if (!isOpen()) return index; @@ -1535,6 +1540,7 @@ bool QDB2Driver::beginTransaction() bool QDB2Driver::commitTransaction() { + Q_D(QDB2Driver); if (!isOpen()) { qWarning("QDB2Driver::commitTransaction: Database not open"); return false; @@ -1552,6 +1558,7 @@ bool QDB2Driver::commitTransaction() bool QDB2Driver::rollbackTransaction() { + Q_D(QDB2Driver); if (!isOpen()) { qWarning("QDB2Driver::rollbackTransaction: Database not open"); return false; @@ -1569,6 +1576,7 @@ bool QDB2Driver::rollbackTransaction() bool QDB2Driver::setAutoCommit(bool autoCommit) { + Q_D(QDB2Driver); SQLUINTEGER ac = autoCommit ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF; SQLRETURN r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_AUTOCOMMIT, @@ -1627,6 +1635,7 @@ QString QDB2Driver::formatValue(const QSqlField &field, bool trimStrings) const QVariant QDB2Driver::handle() const { + Q_D(const QDB2Driver); return QVariant(qRegisterMetaType("SQLHANDLE"), &d->hDbc); } diff --git a/src/sql/drivers/db2/qsql_db2_p.h b/src/sql/drivers/db2/qsql_db2_p.h index 68563448ed..89b07c9c83 100644 --- a/src/sql/drivers/db2/qsql_db2_p.h +++ b/src/sql/drivers/db2/qsql_db2_p.h @@ -101,6 +101,7 @@ private: class Q_EXPORT_SQLDRIVER_DB2 QDB2Driver : public QSqlDriver { + Q_DECLARE_PRIVATE(QDB2Driver) Q_OBJECT public: explicit QDB2Driver(QObject* parent = 0); @@ -127,7 +128,6 @@ public: private: bool setAutoCommit(bool autoCommit); - QDB2DriverPrivate* d; }; QT_END_NAMESPACE diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp index 6eb6703ebf..fe9ae42e6f 100644 --- a/src/sql/drivers/oci/qsql_oci.cpp +++ b/src/sql/drivers/oci/qsql_oci.cpp @@ -2088,10 +2088,9 @@ void QOCIResult::virtual_hook(int id, void *data) QOCIDriver::QOCIDriver(QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QOCIDriverPrivate, parent) { - d = new QOCIDriverPrivate(); - + Q_D(QOCIDriver); #ifdef QOCI_THREADED const ub4 mode = OCI_UTF16 | OCI_OBJECT | OCI_THREADED; #else @@ -2116,9 +2115,9 @@ QOCIDriver::QOCIDriver(QObject* parent) } QOCIDriver::QOCIDriver(OCIEnv* env, OCISvcCtx* ctx, QObject* parent) - : QSqlDriver(parent) + : QSqlDriver(*new QOCIDriverPrivate, parent) { - d = new QOCIDriverPrivate(); + Q_D(QOCIDriver); d->env = env; d->svc = ctx; @@ -2132,6 +2131,7 @@ QOCIDriver::QOCIDriver(OCIEnv* env, OCISvcCtx* ctx, QObject* parent) QOCIDriver::~QOCIDriver() { + Q_D(QOCIDriver); if (isOpen()) close(); int r = OCIHandleFree(d->err, OCI_HTYPE_ERROR); @@ -2144,6 +2144,7 @@ QOCIDriver::~QOCIDriver() bool QOCIDriver::hasFeature(DriverFeature f) const { + Q_D(const QOCIDriver); switch (f) { case Transactions: case LastInsertId: @@ -2202,6 +2203,7 @@ bool QOCIDriver::open(const QString & db, int port, const QString &opts) { + Q_D(QOCIDriver); int r; if (isOpen()) @@ -2288,6 +2290,7 @@ bool QOCIDriver::open(const QString & db, void QOCIDriver::close() { + Q_D(QOCIDriver); if (!isOpen()) return; @@ -2305,11 +2308,13 @@ void QOCIDriver::close() QSqlResult *QOCIDriver::createResult() const { + Q_D(const QOCIDriver); return new QOCIResult(this, d); } bool QOCIDriver::beginTransaction() { + Q_D(QOCIDriver); if (!isOpen()) { qWarning("QOCIDriver::beginTransaction: Database not open"); return false; @@ -2330,6 +2335,7 @@ bool QOCIDriver::beginTransaction() bool QOCIDriver::commitTransaction() { + Q_D(QOCIDriver); if (!isOpen()) { qWarning("QOCIDriver::commitTransaction: Database not open"); return false; @@ -2349,6 +2355,7 @@ bool QOCIDriver::commitTransaction() bool QOCIDriver::rollbackTransaction() { + Q_D(QOCIDriver); if (!isOpen()) { qWarning("QOCIDriver::rollbackTransaction: Database not open"); return false; @@ -2368,6 +2375,7 @@ bool QOCIDriver::rollbackTransaction() QStringList QOCIDriver::tables(QSql::TableType type) const { + Q_D(const QOCIDriver); QStringList tl; QStringList sysUsers = QStringList() << QLatin1String("MDSYS") << QLatin1String("LBACSYS") @@ -2473,6 +2481,7 @@ void qSplitTableAndOwner(const QString & tname, QString * tbl, QSqlRecord QOCIDriver::record(const QString& tablename) const { + Q_D(const QOCIDriver); QSqlRecord fil; if (!isOpen()) return fil; @@ -2546,6 +2555,7 @@ QSqlRecord QOCIDriver::record(const QString& tablename) const QSqlIndex QOCIDriver::primaryIndex(const QString& tablename) const { + Q_D(const QOCIDriver); QSqlIndex idx(tablename); if (!isOpen()) return idx; @@ -2666,6 +2676,7 @@ QString QOCIDriver::formatValue(const QSqlField &field, bool trimStrings) const QVariant QOCIDriver::handle() const { + Q_D(const QOCIDriver); return QVariant::fromValue(d->env); } diff --git a/src/sql/drivers/oci/qsql_oci_p.h b/src/sql/drivers/oci/qsql_oci_p.h index 0b874e6be3..c55a4209fa 100644 --- a/src/sql/drivers/oci/qsql_oci_p.h +++ b/src/sql/drivers/oci/qsql_oci_p.h @@ -73,6 +73,7 @@ class QOCIDriverPrivate; class Q_EXPORT_SQLDRIVER_OCI QOCIDriver : public QSqlDriver { + Q_DECLARE_PRIVATE(QOCIDriver) Q_OBJECT friend struct QOCIResultPrivate; friend class QOCIPrivate; @@ -101,8 +102,6 @@ protected: bool beginTransaction(); bool commitTransaction(); bool rollbackTransaction(); -private: - QOCIDriverPrivate *d; }; QT_END_NAMESPACE -- cgit v1.2.3