diff options
author | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2013-03-20 13:46:57 +0100 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2013-03-20 13:49:28 +0100 |
commit | 76c0be34cd4ff4564693162fa7528463e23ce9d8 (patch) | |
tree | f165b7bc319548fb0082365411a871028f92e89e /src/sql/drivers/odbc | |
parent | 27b4fe96b59e9e63d1e570e802c072e9afdfb2d4 (diff) | |
parent | 36cb3f3f655a9090c82de609010cbfb88651a0f3 (diff) |
Merge branch 'dev' into stable
This starts Qt 5.1 release cycle
Conflicts:
src/gui/text/qfontdatabase.cpp
src/gui/text/qharfbuzz_copy_p.h
src/widgets/kernel/qapplication.cpp
src/widgets/kernel/qcoreapplication.cpp
Change-Id: I72fbf83ab3c2206aeea1b089428b0fc2a89bd62b
Diffstat (limited to 'src/sql/drivers/odbc')
-rw-r--r-- | src/sql/drivers/odbc/qsql_odbc.cpp | 70 | ||||
-rw-r--r-- | src/sql/drivers/odbc/qsql_odbc.pri | 2 | ||||
-rw-r--r-- | src/sql/drivers/odbc/qsql_odbc_p.h (renamed from src/sql/drivers/odbc/qsql_odbc.h) | 21 |
3 files changed, 70 insertions, 23 deletions
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index 5fa47795ae..f0f1f64141 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qsql_odbc.h" +#include "qsql_odbc_p.h" #include <qsqlrecord.h> #if defined (Q_OS_WIN32) @@ -115,9 +115,10 @@ class QODBCDriverPrivate { public: enum DefaultCase{Lower, Mixed, Upper, Sensitive}; + enum DBMSType {UnknownDB, MSSqlServer, MySqlServer, PostgreSQL, Oracle, Sybase}; QODBCDriverPrivate() - : hEnv(0), hDbc(0), unicode(false), useSchema(false), disconnectCount(0), datetime_precision(19), isMySqlServer(false), - isMSSqlServer(false), isFreeTDSDriver(false), hasSQLFetchScroll(true), + : hEnv(0), hDbc(0), unicode(false), useSchema(false), disconnectCount(0), datetime_precision(19), + dbmsType(UnknownDB), isFreeTDSDriver(false), hasSQLFetchScroll(true), hasMultiResultSets(false), isQuoteInitialized(false), quote(QLatin1Char('"')) { } @@ -129,15 +130,14 @@ public: bool useSchema; int disconnectCount; int datetime_precision; - bool isMySqlServer; - bool isMSSqlServer; + DBMSType dbmsType; bool isFreeTDSDriver; bool hasSQLFetchScroll; bool hasMultiResultSets; bool checkDriver() const; void checkUnicode(); - void checkSqlServer(); + void checkDBMS(); void checkHasSQLFetchScroll(); void checkHasMultiResults(); void checkSchemaUsage(); @@ -1677,6 +1677,38 @@ QSqlRecord QODBCResult::record() const return d->rInf; } +QVariant QODBCResult::lastInsertId() const +{ + QString sql; + + switch (d->driverPrivate->dbmsType) { + case QODBCDriverPrivate::MSSqlServer: + case QODBCDriverPrivate::Sybase: + sql = QLatin1String("SELECT @@IDENTITY;"); + break; + case QODBCDriverPrivate::MySqlServer: + sql = QLatin1String("SELECT LAST_INSERT_ID();"); + break; + case QODBCDriverPrivate::PostgreSQL: + sql = QLatin1String("SELECT lastval();"); + break; + default: + break; + } + + if (!sql.isEmpty()) { + QSqlQuery qry(driver()->createResult()); + if (qry.exec(sql) && qry.next()) + return qry.value(0); + + qSqlWarning(QLatin1String("QODBCResult::lastInsertId: Unable to get lastInsertId"), d); + } else { + qSqlWarning(QLatin1String("QODBCResult::lastInsertId: not implemented for this DBMS"), d); + } + + return QVariant(); +} + QVariant QODBCResult::handle() const { return QVariant(qRegisterMetaType<SQLHANDLE>("SQLHANDLE"), &d->hStmt); @@ -1797,16 +1829,20 @@ bool QODBCDriver::hasFeature(DriverFeature f) const return true; case QuerySize: case NamedPlaceholders: - case LastInsertId: case BatchOperations: case SimpleLocking: case EventNotifications: case CancelQuery: return false; + case LastInsertId: + return (d->dbmsType == QODBCDriverPrivate::MSSqlServer) + || (d->dbmsType == QODBCDriverPrivate::Sybase) + || (d->dbmsType == QODBCDriverPrivate::MySqlServer) + || (d->dbmsType == QODBCDriverPrivate::PostgreSQL); case MultipleResultSets: return d->hasMultiResultSets; case BLOB: { - if(d->isMySqlServer) + if (d->dbmsType == QODBCDriverPrivate::MySqlServer) return true; else return false; @@ -1896,13 +1932,13 @@ bool QODBCDriver::open(const QString & db, d->checkUnicode(); d->checkSchemaUsage(); - d->checkSqlServer(); + d->checkDBMS(); d->checkHasSQLFetchScroll(); d->checkHasMultiResults(); d->checkDateTimePrecision(); setOpen(true); setOpenError(false); - if(d->isMSSqlServer) { + if (d->dbmsType == QODBCDriverPrivate::MSSqlServer) { QSqlQuery i(createResult()); i.exec(QLatin1String("SET QUOTED_IDENTIFIER ON")); } @@ -2069,7 +2105,7 @@ void QODBCDriverPrivate::checkSchemaUsage() useSchema = (val != 0); } -void QODBCDriverPrivate::checkSqlServer() +void QODBCDriverPrivate::checkDBMS() { SQLRETURN r; QVarLengthArray<SQLTCHAR> serverString(200); @@ -2088,8 +2124,16 @@ void QODBCDriverPrivate::checkSqlServer() #else serverType = QString::fromUtf8((const char *)serverString.constData(), t); #endif - isMySqlServer = serverType.contains(QLatin1String("mysql"), Qt::CaseInsensitive); - isMSSqlServer = serverType.contains(QLatin1String("Microsoft SQL Server"), Qt::CaseInsensitive); + if (serverType.contains(QLatin1String("PostgreSQL"), Qt::CaseInsensitive)) + dbmsType = PostgreSQL; + else if (serverType.contains(QLatin1String("Oracle"), Qt::CaseInsensitive)) + dbmsType = Oracle; + else if (serverType.contains(QLatin1String("MySql"), Qt::CaseInsensitive)) + dbmsType = MySqlServer; + else if (serverType.contains(QLatin1String("Microsoft SQL Server"), Qt::CaseInsensitive)) + dbmsType = MSSqlServer; + else if (serverType.contains(QLatin1String("Sybase"), Qt::CaseInsensitive)) + dbmsType = Sybase; } r = SQLGetInfo(hDbc, SQL_DRIVER_NAME, diff --git a/src/sql/drivers/odbc/qsql_odbc.pri b/src/sql/drivers/odbc/qsql_odbc.pri index 19ff784a04..b206df37c3 100644 --- a/src/sql/drivers/odbc/qsql_odbc.pri +++ b/src/sql/drivers/odbc/qsql_odbc.pri @@ -1,4 +1,4 @@ -HEADERS += $$PWD/qsql_odbc.h +HEADERS += $$PWD/qsql_odbc_p.h SOURCES += $$PWD/qsql_odbc.cpp unix { diff --git a/src/sql/drivers/odbc/qsql_odbc.h b/src/sql/drivers/odbc/qsql_odbc_p.h index 4fba49b9c5..191f64f072 100644 --- a/src/sql/drivers/odbc/qsql_odbc.h +++ b/src/sql/drivers/odbc/qsql_odbc_p.h @@ -42,6 +42,17 @@ #ifndef QSQL_ODBC_H #define QSQL_ODBC_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include <QtSql/qsqldriver.h> #include <QtSql/qsqlresult.h> @@ -70,15 +81,8 @@ #include <sqlext.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE -#if 0 -#pragma qt_no_master_include -#pragma qt_sync_stop_processing -#endif - class QODBCPrivate; class QODBCDriverPrivate; class QODBCDriver; @@ -93,6 +97,7 @@ public: bool prepare(const QString& query); bool exec(); + QVariant lastInsertId() const; QVariant handle() const; virtual void setForwardOnly(bool forward); @@ -158,6 +163,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QSQL_ODBC_H |