summaryrefslogtreecommitdiffstats
path: root/src/sql/drivers/odbc
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2013-04-03 21:44:30 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-04 13:13:37 +0200
commit0bdc86d9ef7be8e27598d245c6ca8026f08aff12 (patch)
tree53d6556f439ebfdd92a5dc24d4dac61daf3f9869 /src/sql/drivers/odbc
parent708d39fa31368f80152440e94e4a361d024b19c1 (diff)
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 <andy.shaw@digia.com>
Diffstat (limited to 'src/sql/drivers/odbc')
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp44
-rw-r--r--src/sql/drivers/odbc/qsql_odbc_p.h3
2 files changed, 26 insertions, 21 deletions
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<const QODBCDriver*> (driver);
- return disconnectCount == odbcdriver->d->disconnectCount;
+ return disconnectCount == odbcdriver->d_func()->disconnectCount;
}
void QODBCPrivate::updateStmtHandleState(const QSqlDriver *driver)
{
const QODBCDriver *odbcdriver = static_cast<const QODBCDriver*> (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<QODBCDriverPrivate*>(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<QODBCDriverPrivate*>(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<QODBCDriverPrivate*>(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>("SQLHANDLE"), &d->hDbc);
}
QString QODBCDriver::escapeIdentifier(const QString &identifier, IdentifierType) const
{
- QChar quote = d->quoteChar();
+ Q_D(const QODBCDriver);
+ QChar quote = const_cast<QODBCDriverPrivate*>(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<QODBCDriverPrivate*>(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;
};