From f84b00c6d26eb7a3a6802210d2a8b12ddbf815aa Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Tue, 16 Sep 2014 10:03:14 -0400 Subject: Expose QSqlDriverPrivate dbmsType in public QSqlDriver api dbmsType was previously kept as a private variable in QSqlDriverPrivate, however it's particularly useful for QODBC users. [ChangeLog][QtSql][QSqlDriver] Add support for determining DBMS type from SQL driver. Change-Id: If1c221520da9ac4ccef85a02db078679d76eac92 Reviewed-by: Mark Brand --- src/sql/drivers/db2/qsql_db2.cpp | 2 +- src/sql/drivers/ibase/qsql_ibase.cpp | 2 +- src/sql/drivers/mysql/qsql_mysql.cpp | 2 +- src/sql/drivers/oci/qsql_oci.cpp | 2 +- src/sql/drivers/odbc/qsql_odbc.cpp | 30 +++++++++++++++--------------- src/sql/drivers/psql/qsql_psql.cpp | 2 +- src/sql/drivers/sqlite/qsql_sqlite.cpp | 2 +- src/sql/drivers/sqlite2/qsql_sqlite2.cpp | 2 +- src/sql/drivers/tds/qsql_tds.cpp | 2 +- src/sql/kernel/qsqldriver.cpp | 26 ++++++++++++++++++++++++++ src/sql/kernel/qsqldriver.h | 14 ++++++++++++++ src/sql/kernel/qsqldriver_p.h | 6 ++---- src/sql/kernel/qsqlresult.cpp | 4 ++-- 13 files changed, 67 insertions(+), 29 deletions(-) (limited to 'src/sql') diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp index a7508963f9..09ac5bda46 100644 --- a/src/sql/drivers/db2/qsql_db2.cpp +++ b/src/sql/drivers/db2/qsql_db2.cpp @@ -66,7 +66,7 @@ static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL class QDB2DriverPrivate : public QSqlDriverPrivate { public: - QDB2DriverPrivate() : QSqlDriverPrivate(), hEnv(0), hDbc(0) { dbmsType = DB2; } + QDB2DriverPrivate() : QSqlDriverPrivate(), hEnv(0), hDbc(0) { dbmsType = QSqlDriver::DB2; } SQLHANDLE hEnv; SQLHANDLE hDbc; QString user; diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 4ca1edbde0..bb3ffe619e 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -306,7 +306,7 @@ class QIBaseDriverPrivate : public QSqlDriverPrivate { Q_DECLARE_PUBLIC(QIBaseDriver) public: - QIBaseDriverPrivate() : QSqlDriverPrivate(), ibase(0), trans(0), tc(0) { dbmsType = Interbase; } + QIBaseDriverPrivate() : QSqlDriverPrivate(), ibase(0), trans(0), tc(0) { dbmsType = QSqlDriver::Interbase; } bool isError(const char *msg, QSqlError::ErrorType typ = QSqlError::UnknownError) { diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp index b4dd6773e0..db54ce84da 100644 --- a/src/sql/drivers/mysql/qsql_mysql.cpp +++ b/src/sql/drivers/mysql/qsql_mysql.cpp @@ -78,7 +78,7 @@ public: #else tc(0), #endif - preparedQuerysEnabled(false) { dbmsType = MySqlServer; } + preparedQuerysEnabled(false) { dbmsType = QSqlDriver::MySqlServer; } MYSQL *mysql; QTextCodec *tc; diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp index cf5ea7aa90..284fee8ccb 100644 --- a/src/sql/drivers/oci/qsql_oci.cpp +++ b/src/sql/drivers/oci/qsql_oci.cpp @@ -508,7 +508,7 @@ QOCIDriverPrivate::QOCIDriverPrivate() : QSqlDriverPrivate(), env(0), svc(0), srvhp(0), authp(0), err(0), transaction(false), serverVersion(-1), prefetchRows(-1), prefetchMem(QOCI_PREFETCH_MEM) { - dbmsType = Oracle; + dbmsType = QSqlDriver::Oracle; } void QOCIDriverPrivate::allocErrorHandle() diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index 8e7f2f5025..f95fb8868e 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -1660,14 +1660,14 @@ QVariant QODBCResult::lastInsertId() const QString sql; switch (d->driverPrivate->dbmsType) { - case QODBCDriverPrivate::MSSqlServer: - case QODBCDriverPrivate::Sybase: + case QSqlDriver::MSSqlServer: + case QSqlDriver::Sybase: sql = QLatin1String("SELECT @@IDENTITY;"); break; - case QODBCDriverPrivate::MySqlServer: + case QSqlDriver::MySqlServer: sql = QLatin1String("SELECT LAST_INSERT_ID();"); break; - case QODBCDriverPrivate::PostgreSQL: + case QSqlDriver::PostgreSQL: sql = QLatin1String("SELECT lastval();"); break; default: @@ -1807,14 +1807,14 @@ bool QODBCDriver::hasFeature(DriverFeature f) const case CancelQuery: return false; case LastInsertId: - return (d->dbmsType == QODBCDriverPrivate::MSSqlServer) - || (d->dbmsType == QODBCDriverPrivate::Sybase) - || (d->dbmsType == QODBCDriverPrivate::MySqlServer) - || (d->dbmsType == QODBCDriverPrivate::PostgreSQL); + return (d->dbmsType == MSSqlServer) + || (d->dbmsType == Sybase) + || (d->dbmsType == MySqlServer) + || (d->dbmsType == PostgreSQL); case MultipleResultSets: return d->hasMultiResultSets; case BLOB: { - if (d->dbmsType == QODBCDriverPrivate::MySqlServer) + if (d->dbmsType == MySqlServer) return true; else return false; @@ -1911,7 +1911,7 @@ bool QODBCDriver::open(const QString & db, d->checkDateTimePrecision(); setOpen(true); setOpenError(false); - if (d->dbmsType == QODBCDriverPrivate::MSSqlServer) { + if (d->dbmsType == MSSqlServer) { QSqlQuery i(createResult()); i.exec(QLatin1String("SET QUOTED_IDENTIFIER ON")); } @@ -2097,15 +2097,15 @@ void QODBCDriverPrivate::checkDBMS() serverType = QString::fromUtf8((const char *)serverString.constData(), t); #endif if (serverType.contains(QLatin1String("PostgreSQL"), Qt::CaseInsensitive)) - dbmsType = PostgreSQL; + dbmsType = QSqlDriver::PostgreSQL; else if (serverType.contains(QLatin1String("Oracle"), Qt::CaseInsensitive)) - dbmsType = Oracle; + dbmsType = QSqlDriver::Oracle; else if (serverType.contains(QLatin1String("MySql"), Qt::CaseInsensitive)) - dbmsType = MySqlServer; + dbmsType = QSqlDriver::MySqlServer; else if (serverType.contains(QLatin1String("Microsoft SQL Server"), Qt::CaseInsensitive)) - dbmsType = MSSqlServer; + dbmsType = QSqlDriver::MSSqlServer; else if (serverType.contains(QLatin1String("Sybase"), Qt::CaseInsensitive)) - dbmsType = Sybase; + dbmsType = QSqlDriver::Sybase; } r = SQLGetInfo(hDbc, SQL_DRIVER_NAME, diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index aa09191c71..e76dcc26a0 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -130,7 +130,7 @@ public: sn(0), pendingNotifyCheck(false), hasBackslashEscape(false) - { dbmsType = PostgreSQL; } + { dbmsType = QSqlDriver::PostgreSQL; } PGconn *connection; bool isUtf8; diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp index 33f504c49f..cbde2bfa9c 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite.cpp +++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp @@ -131,7 +131,7 @@ private: class QSQLiteDriverPrivate : public QSqlDriverPrivate { public: - inline QSQLiteDriverPrivate() : QSqlDriverPrivate(), access(0) { dbmsType = SQLite; } + inline QSQLiteDriverPrivate() : QSqlDriverPrivate(), access(0) { dbmsType = QSqlDriver::SQLite; } sqlite3 *access; QList results; }; diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp index 299810969a..760ece915f 100644 --- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp +++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp @@ -86,7 +86,7 @@ public: QSQLite2DriverPrivate::QSQLite2DriverPrivate() : QSqlDriverPrivate(), access(0) { utf8 = (qstrcmp(sqlite_encoding, "UTF-8") == 0); - dbmsType = SQLite; + dbmsType = QSqlDriver::SQLite; } class QSQLite2ResultPrivate; diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp index 933228f88e..5449930ae3 100644 --- a/src/sql/drivers/tds/qsql_tds.cpp +++ b/src/sql/drivers/tds/qsql_tds.cpp @@ -132,7 +132,7 @@ QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, int errNo = class QTDSDriverPrivate : public QSqlDriverPrivate { public: - QTDSDriverPrivate() : QSqlDriverPrivate(), login(0), initialized(false) { dbmsType = Sybase; } + QTDSDriverPrivate() : QSqlDriverPrivate(), login(0), initialized(false) { dbmsType = QSqlDriver::Sybase; } LOGINREC* login; // login information QString hostName; QString db; diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index fdeb10e915..736fe310e3 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -236,6 +236,22 @@ bool QSqlDriver::isOpenError() const \value OtherSource The notification source is another connection */ +/*! + \enum QSqlDriver::DBMSType + + This enum contains DBMS types. + + \value UnknownDBMS + \value MSSqlServer + \value MySqlServer + \value PostgreSQL + \value Oracle + \value Sybase + \value SQLite + \value Interbase + \value DB2 +*/ + /*! \fn bool QSqlDriver::hasFeature(DriverFeature feature) const @@ -766,6 +782,16 @@ QSql::NumericalPrecisionPolicy QSqlDriver::numericalPrecisionPolicy() const return d_func()->precisionPolicy; } +/*! + \since 5.4 + + Returns the current DBMS type for the database connection. +*/ +QSqlDriver::DBMSType QSqlDriver::dbmsType() const +{ + return d_func()->dbmsType; +} + /*! \since 5.0 \internal diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 659279a3b3..767c1ac74d 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -71,6 +71,18 @@ public: enum NotificationSource { UnknownSource, SelfSource, OtherSource }; + enum DBMSType { + UnknownDBMS, + MSSqlServer, + MySqlServer, + PostgreSQL, + Oracle, + Sybase, + SQLite, + Interbase, + DB2 + }; + explicit QSqlDriver(QObject *parent=0); ~QSqlDriver(); virtual bool isOpen() const; @@ -111,6 +123,8 @@ public: void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy); QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const; + DBMSType dbmsType() const; + public Q_SLOTS: virtual bool cancelQuery(); diff --git a/src/sql/kernel/qsqldriver_p.h b/src/sql/kernel/qsqldriver_p.h index bb44a831a3..427e3984fa 100644 --- a/src/sql/kernel/qsqldriver_p.h +++ b/src/sql/kernel/qsqldriver_p.h @@ -56,21 +56,19 @@ class QSqlDriverPrivate : public QObjectPrivate Q_DECLARE_PUBLIC(QSqlDriver) public: - enum DBMSType {UnknownDB, MSSqlServer, MySqlServer, PostgreSQL, Oracle, Sybase, SQLite, Interbase, DB2}; - QSqlDriverPrivate() : QObjectPrivate(), isOpen(false), isOpenError(false), precisionPolicy(QSql::LowPrecisionDouble), - dbmsType(UnknownDB) + dbmsType(QSqlDriver::UnknownDBMS) { } uint isOpen; uint isOpenError; QSqlError error; QSql::NumericalPrecisionPolicy precisionPolicy; - DBMSType dbmsType; + QSqlDriver::DBMSType dbmsType; }; QT_END_NAMESPACE diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp index 074e630394..4cd4e6fec4 100644 --- a/src/sql/kernel/qsqlresult.cpp +++ b/src/sql/kernel/qsqlresult.cpp @@ -87,7 +87,7 @@ QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) const result.reserve(n * 5 / 4); QChar closingQuote; int count = 0; - bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriverPrivate::PostgreSQL); + bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriver::PostgreSQL); for (int i = 0; i < n; ++i) { QChar ch = query.at(i); @@ -128,7 +128,7 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query) QChar closingQuote; int count = 0; int i = 0; - bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriverPrivate::PostgreSQL); + bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriver::PostgreSQL); while (i < n) { QChar ch = query.at(i); -- cgit v1.2.3