Merge "Merge remote-tracking branch 'origin/5.10.1' into 5.11" into refs/staging/5.11
This commit is contained in:
commit
3190edb077
154
dist/changes-5.10.1
vendored
Normal file
154
dist/changes-5.10.1
vendored
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
Qt 5.10.1 is a bug-fix release. It maintains both forward and backward
|
||||||
|
compatibility (source and binary) with Qt 5.10.0.
|
||||||
|
|
||||||
|
For more details, refer to the online documentation included in this
|
||||||
|
distribution. The documentation is also available online:
|
||||||
|
|
||||||
|
http://doc.qt.io/qt-5/index.html
|
||||||
|
|
||||||
|
The Qt version 5.10 series is binary compatible with the 5.9.x series.
|
||||||
|
Applications compiled for 5.9 will continue to run with 5.10.
|
||||||
|
|
||||||
|
Some of the changes listed in this file include issue tracking numbers
|
||||||
|
corresponding to tasks in the Qt Bug Tracker:
|
||||||
|
|
||||||
|
https://bugreports.qt.io/
|
||||||
|
|
||||||
|
Each of these identifiers can be entered in the bug tracker to obtain more
|
||||||
|
information about a particular change.
|
||||||
|
|
||||||
|
This release contains all fixes included in the Qt 5.9.4 release.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Library *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
QtCore
|
||||||
|
------
|
||||||
|
|
||||||
|
- [QTBUG-64529] Fixed a compilation issue with qfloat16 if AVX2 support is
|
||||||
|
enabled in the compiler. Since all processors that support AVX2 also
|
||||||
|
support F16C, for GCC and Clang it is recommended to either add -mf16c
|
||||||
|
to your build or to use the corresponding -march= switch.
|
||||||
|
|
||||||
|
- QCoreApplication:
|
||||||
|
* [QTBUG-58919] Fixed a crash if QCoreApplication is recreated on Windows
|
||||||
|
and the passed argv parameter is different.
|
||||||
|
|
||||||
|
- QFile:
|
||||||
|
* [QTBUG-64103] Fixed a regression in doing rename() on Android
|
||||||
|
Marshmallow.
|
||||||
|
|
||||||
|
- QFileInfo:
|
||||||
|
* [QTBUG-30148] Fixed isWritable() on Windows to return whether the given
|
||||||
|
file is writable only under current privilege levels. Previously, the
|
||||||
|
result would take into account privilege elevation.
|
||||||
|
|
||||||
|
- QMetaObject:
|
||||||
|
* [QTBUG-65462] Fixed a memory leak that happened when the new-style
|
||||||
|
call to invokeMethod() was used.
|
||||||
|
|
||||||
|
- QObject:
|
||||||
|
* [QTBUG-65712] Improved performance of QObject::deleteLater.
|
||||||
|
* Fixed a crash that could happen if the context QObject pointer passed to
|
||||||
|
new-style connect() was null.
|
||||||
|
|
||||||
|
- QPluginLoader:
|
||||||
|
* [QTBUG-65197] Fixed a bug that would cause the Qt plugin scanning
|
||||||
|
system to allocate too much memory and possibly crash the process.
|
||||||
|
|
||||||
|
- QProcess:
|
||||||
|
* [QTBUG-65076] Fixed a regression that made QProcess be unable to find
|
||||||
|
executables when the PATH environment variable on some Unix systems
|
||||||
|
wasn't set. This behavior should not be relied upon since many systems
|
||||||
|
do not have sensible fallback values for PATH.
|
||||||
|
|
||||||
|
- QRandomGenerator:
|
||||||
|
* [QTBUG-65414] Fixed compilation on Windows if the windows.h header was
|
||||||
|
included before this qrandom.h.
|
||||||
|
|
||||||
|
- QSettings:
|
||||||
|
* [QTBUG-64121] Fixed reading from NTFS symbolic links.
|
||||||
|
|
||||||
|
- QStandardPaths:
|
||||||
|
* [QTBUG-65076] findExecutable() will now apply the default value for
|
||||||
|
the PATH environment variable (as returned by the POSIX confstr(3)
|
||||||
|
function or found in <paths.h>) if the variable isn't set in the
|
||||||
|
environment.
|
||||||
|
* [QTBUG-65687] Fixed a memory leak with displayName() on Apple platforms.
|
||||||
|
* On Windows, it is now possible to resolve configuration paths even
|
||||||
|
without QCoreApplication created.
|
||||||
|
|
||||||
|
- QString:
|
||||||
|
* [QTBUG-65939] Fixed a regression from 5.9 that caused comparing
|
||||||
|
default-constructed QStrings to be sorted after non-empty strings.
|
||||||
|
|
||||||
|
- QTextBoundaryFinder:
|
||||||
|
* [QTBUG-63191] Fixed a bug in the generating of Unicode data, affecting
|
||||||
|
the joining properties of characters like U+200C ZWNJ.
|
||||||
|
|
||||||
|
- QXmlStreamWriter:
|
||||||
|
* [QTBUG-63538] Empty namespace URIs are now possible.
|
||||||
|
|
||||||
|
- State Machine:
|
||||||
|
* [QTBUG-61463] Fixed a failed assertion that could happen when emitting a
|
||||||
|
signal from another thread.
|
||||||
|
|
||||||
|
QtGui
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Text:
|
||||||
|
* [QTBUG-61882] Fixed a bug where mixing different writing systems with
|
||||||
|
emojis could lead to missing glyphs.
|
||||||
|
* [QTBUG-65519] Fixed ZWJ and ZWNJ control characters when fallback
|
||||||
|
fonts are in use.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Platform-specific Changes *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
- QNX:
|
||||||
|
* [QTBUG-64033] Fixed the detection of slog2 with QNX 7.0
|
||||||
|
|
||||||
|
- Windows:
|
||||||
|
* Named pipes internally created by QProcess now contain the PID in their
|
||||||
|
name to ensure uniqueness.
|
||||||
|
* [QTBUG-65940] Fixed asserts and crashes in QWinEventNotifier.
|
||||||
|
|
||||||
|
- WinRT:
|
||||||
|
* -qdevel and -qdebug are removed from the command line arguments and
|
||||||
|
not passed to the application.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Third-Party Code *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
- libjpeg-turbo was updated to version 1.5.3
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Tools *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
configure & build system
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
- [QTBUG-65753] Fixed installation of resource sources in some examples.
|
||||||
|
- Qt's pkg-config .pc files now add -DQT_{module}_LIB to CFLAGS.
|
||||||
|
|
||||||
|
qmake
|
||||||
|
-----
|
||||||
|
|
||||||
|
- [QTBUG-65106] The value of QT is now silently ignored when the sub-
|
||||||
|
project already failed requires()/REQUIRES.
|
||||||
|
- [QTBUG-63442] Fixed an issue that would cause warnings with CMake 3.10
|
||||||
|
for projects that used AUTOMOC.
|
||||||
|
- [QTBUG-63637][MinGW] Fixed cross compilation from Linux.
|
||||||
|
- [QTBUG-65103] Introduced precompile_header_c CONFIG option for MSVC to
|
||||||
|
enable precompiled header for C sources.
|
||||||
|
- [QTBUG-65477][Darwin] Added escaping to @BUNDLEIDENTIFIER@.
|
||||||
|
- [Darwin] Rewrote handling of placeholders in Info.plist; the preferred
|
||||||
|
style is now ${} and is consistent between Xcode and Makefile generators.
|
||||||
|
- [Windows] Fixed path separators when setting working directory in
|
||||||
|
"make check".
|
||||||
|
- [Windows] Paths which are relative to the current drive's root are not
|
||||||
|
treated as absolute any more.
|
@ -568,10 +568,6 @@ static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QCha
|
|||||||
{
|
{
|
||||||
if (a == b)
|
if (a == b)
|
||||||
return (ae - be);
|
return (ae - be);
|
||||||
if (a == 0)
|
|
||||||
return be - b;
|
|
||||||
if (b == 0)
|
|
||||||
return a - ae;
|
|
||||||
|
|
||||||
const QChar *e = ae;
|
const QChar *e = ae;
|
||||||
if (be - b < ae - a)
|
if (be - b < ae - a)
|
||||||
@ -600,11 +596,6 @@ static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QCha
|
|||||||
// Case-insensitive comparison between a Unicode string and a QLatin1String
|
// Case-insensitive comparison between a Unicode string and a QLatin1String
|
||||||
static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char *be)
|
static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char *be)
|
||||||
{
|
{
|
||||||
if (!a)
|
|
||||||
return be - b;
|
|
||||||
if (!b)
|
|
||||||
return a - ae;
|
|
||||||
|
|
||||||
auto e = ae;
|
auto e = ae;
|
||||||
if (be - b < ae - a)
|
if (be - b < ae - a)
|
||||||
e = a + (be - b);
|
e = a + (be - b);
|
||||||
|
@ -1131,7 +1131,7 @@ void QCocoaWindow::handleGeometryChange()
|
|||||||
// Guard against processing window system events during QWindow::setGeometry
|
// Guard against processing window system events during QWindow::setGeometry
|
||||||
// calls, which Qt and Qt applications do not expect.
|
// calls, which Qt and Qt applications do not expect.
|
||||||
if (!m_inSetGeometry)
|
if (!m_inSetGeometry)
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QCocoaWindow::handleExposeEvent(const QRegion ®ion)
|
void QCocoaWindow::handleExposeEvent(const QRegion ®ion)
|
||||||
|
@ -204,6 +204,7 @@ public:
|
|||||||
void setDatestyle();
|
void setDatestyle();
|
||||||
void setByteaOutput();
|
void setByteaOutput();
|
||||||
void detectBackslashEscape();
|
void detectBackslashEscape();
|
||||||
|
mutable QHash<int, QString> oidToTable;
|
||||||
};
|
};
|
||||||
|
|
||||||
void QPSQLDriverPrivate::appendTables(QStringList &tl, QSqlQuery &t, QChar type)
|
void QPSQLDriverPrivate::appendTables(QStringList &tl, QSqlQuery &t, QChar type)
|
||||||
@ -815,18 +816,20 @@ QSqlRecord QPSQLResult::record() const
|
|||||||
f.setName(QString::fromUtf8(PQfname(d->result, i)));
|
f.setName(QString::fromUtf8(PQfname(d->result, i)));
|
||||||
else
|
else
|
||||||
f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
|
f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
|
||||||
|
const int tableOid = PQftable(d->result, i);
|
||||||
|
auto &tableName = d->drv_d_func()->oidToTable[tableOid];
|
||||||
// WARNING: We cannot execute any other SQL queries on
|
// WARNING: We cannot execute any other SQL queries on
|
||||||
// the same db connection while forward-only mode is active
|
// the same db connection while forward-only mode is active
|
||||||
// (this would discard all results of forward-only query).
|
// (this would discard all results of forward-only query).
|
||||||
// So we just skip this...
|
// So we just skip this...
|
||||||
if (!isForwardOnly()) {
|
if (tableName.isEmpty() && !isForwardOnly()) {
|
||||||
QSqlQuery qry(driver()->createResult());
|
QSqlQuery qry(driver()->createResult());
|
||||||
if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1")
|
if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1")
|
||||||
.arg(PQftable(d->result, i))) && qry.next()) {
|
.arg(tableOid)) && qry.next()) {
|
||||||
f.setTableName(qry.value(0).toString());
|
tableName = qry.value(0).toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
f.setTableName(tableName);
|
||||||
int ptype = PQftype(d->result, i);
|
int ptype = PQftype(d->result, i);
|
||||||
f.setType(qDecodePSQLType(ptype));
|
f.setType(qDecodePSQLType(ptype));
|
||||||
int len = PQfsize(d->result, i);
|
int len = PQfsize(d->result, i);
|
||||||
|
@ -6049,8 +6049,14 @@ void tst_QString::compare_data()
|
|||||||
QTest::addColumn<int>("csr"); // case sensitive result
|
QTest::addColumn<int>("csr"); // case sensitive result
|
||||||
QTest::addColumn<int>("cir"); // case insensitive result
|
QTest::addColumn<int>("cir"); // case insensitive result
|
||||||
|
|
||||||
|
|
||||||
// null strings
|
// null strings
|
||||||
|
QTest::newRow("null-null") << QString() << QString() << 0 << 0;
|
||||||
|
QTest::newRow("text-null") << QString("a") << QString() << 1 << 1;
|
||||||
|
QTest::newRow("null-text") << QString() << QString("a") << -1 << -1;
|
||||||
|
QTest::newRow("null-empty") << QString() << QString("") << 0 << 0;
|
||||||
|
QTest::newRow("empty-null") << QString("") << QString() << 0 << 0;
|
||||||
|
|
||||||
|
// empty strings
|
||||||
QTest::newRow("data0") << QString("") << QString("") << 0 << 0;
|
QTest::newRow("data0") << QString("") << QString("") << 0 << 0;
|
||||||
QTest::newRow("data1") << QString("a") << QString("") << 1 << 1;
|
QTest::newRow("data1") << QString("a") << QString("") << 1 << 1;
|
||||||
QTest::newRow("data2") << QString("") << QString("a") << -1 << -1;
|
QTest::newRow("data2") << QString("") << QString("a") << -1 << -1;
|
||||||
|
@ -370,7 +370,8 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db )
|
|||||||
<< qTableName("task_234422", __FILE__, db)
|
<< qTableName("task_234422", __FILE__, db)
|
||||||
<< qTableName("test141895", __FILE__, db)
|
<< qTableName("test141895", __FILE__, db)
|
||||||
<< qTableName("qtest_oraOCINumber", __FILE__, db)
|
<< qTableName("qtest_oraOCINumber", __FILE__, db)
|
||||||
<< qTableName("bug2192", __FILE__, db);
|
<< qTableName("bug2192", __FILE__, db)
|
||||||
|
<< qTableName("tst_record", __FILE__, db);
|
||||||
|
|
||||||
if (dbType == QSqlDriver::PostgreSQL)
|
if (dbType == QSqlDriver::PostgreSQL)
|
||||||
tablenames << qTableName("task_233829", __FILE__, db);
|
tablenames << qTableName("task_233829", __FILE__, db);
|
||||||
@ -1009,6 +1010,29 @@ void tst_QSqlQuery::value()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SETUP_RECORD_TABLE \
|
||||||
|
do { \
|
||||||
|
QVERIFY_SQL(q, exec("CREATE TABLE " + tst_record + " (id integer, extra varchar(50))")); \
|
||||||
|
for (int i = 0; i < 3; ++i) \
|
||||||
|
QVERIFY_SQL(q, exec(QString("INSERT INTO " + tst_record + " VALUES(%1, 'extra%1')").arg(i))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define CHECK_RECORD \
|
||||||
|
do { \
|
||||||
|
QVERIFY_SQL(q, exec(QString("select %1.id, %1.t_varchar, %1.t_char, %2.id, %2.extra from %1, %2 where " \
|
||||||
|
"%1.id = %2.id order by %1.id").arg(lowerQTest).arg(tst_record))); \
|
||||||
|
QCOMPARE(q.record().fieldName(0).toLower(), QString("id")); \
|
||||||
|
QCOMPARE(q.record().field(0).tableName().toLower(), lowerQTest); \
|
||||||
|
QCOMPARE(q.record().fieldName(1).toLower(), QString("t_varchar")); \
|
||||||
|
QCOMPARE(q.record().field(1).tableName().toLower(), lowerQTest); \
|
||||||
|
QCOMPARE(q.record().fieldName(2).toLower(), QString("t_char")); \
|
||||||
|
QCOMPARE(q.record().field(2).tableName().toLower(), lowerQTest); \
|
||||||
|
QCOMPARE(q.record().fieldName(3).toLower(), QString("id")); \
|
||||||
|
QCOMPARE(q.record().field(3).tableName().toLower(), tst_record); \
|
||||||
|
QCOMPARE(q.record().fieldName(4).toLower(), QString("extra")); \
|
||||||
|
QCOMPARE(q.record().field(4).tableName().toLower(), tst_record); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
void tst_QSqlQuery::record()
|
void tst_QSqlQuery::record()
|
||||||
{
|
{
|
||||||
QFETCH( QString, dbName );
|
QFETCH( QString, dbName );
|
||||||
@ -1030,6 +1054,26 @@ void tst_QSqlQuery::record()
|
|||||||
|
|
||||||
QCOMPARE( q.record().fieldName( 0 ).toLower(), QString( "id" ) );
|
QCOMPARE( q.record().fieldName( 0 ).toLower(), QString( "id" ) );
|
||||||
QCOMPARE( q.value( 0 ).toInt(), 2 );
|
QCOMPARE( q.value( 0 ).toInt(), 2 );
|
||||||
|
|
||||||
|
const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
|
||||||
|
if (dbType == QSqlDriver::Oracle)
|
||||||
|
QSKIP("Getting the tablename is not supported in Oracle");
|
||||||
|
const auto lowerQTest = qtest.toLower();
|
||||||
|
for (int i = 0; i < 3; ++i)
|
||||||
|
QCOMPARE(q.record().field(i).tableName().toLower(), lowerQTest);
|
||||||
|
q.clear();
|
||||||
|
const auto tst_record = qTableName("tst_record", __FILE__, db).toLower();
|
||||||
|
SETUP_RECORD_TABLE;
|
||||||
|
CHECK_RECORD;
|
||||||
|
q.clear();
|
||||||
|
|
||||||
|
// Recreate the tables, in a different order
|
||||||
|
const QStringList tables = { qtest, tst_record, qTableName("qtest_null", __FILE__, db) };
|
||||||
|
tst_Databases::safeDropTables(db, tables);
|
||||||
|
SETUP_RECORD_TABLE;
|
||||||
|
createTestTables(db);
|
||||||
|
populateTestTables(db);
|
||||||
|
CHECK_RECORD;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QSqlQuery::isValid()
|
void tst_QSqlQuery::isValid()
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
qsqlquery \
|
qsqlquery \
|
||||||
|
qsqlrecord
|
||||||
|
5
tests/benchmarks/sql/kernel/qsqlrecord/qsqlrecord.pro
Normal file
5
tests/benchmarks/sql/kernel/qsqlrecord/qsqlrecord.pro
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
TARGET = tst_bench_qsqlrecord
|
||||||
|
|
||||||
|
SOURCES += tst_qsqlrecord.cpp
|
||||||
|
|
||||||
|
QT = core sql testlib core-private sql-private
|
191
tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
Normal file
191
tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the test suite of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <QtTest/QtTest>
|
||||||
|
#include <QtSql/QtSql>
|
||||||
|
|
||||||
|
#include "../../../../auto/sql/kernel/qsqldatabase/tst_databases.h"
|
||||||
|
|
||||||
|
const QString qtest(qTableName("qtest", __FILE__, QSqlDatabase()));
|
||||||
|
|
||||||
|
class tst_QSqlRecord : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
tst_QSqlRecord();
|
||||||
|
virtual ~tst_QSqlRecord();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void initTestCase();
|
||||||
|
void cleanupTestCase();
|
||||||
|
void init();
|
||||||
|
void cleanup();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void benchmarkRecord_data() { generic_data(); }
|
||||||
|
void benchmarkRecord();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void generic_data(const QString &engine = QString());
|
||||||
|
void dropTestTables(QSqlDatabase db);
|
||||||
|
void createTestTables(QSqlDatabase db);
|
||||||
|
void populateTestTables(QSqlDatabase db);
|
||||||
|
|
||||||
|
tst_Databases dbs;
|
||||||
|
};
|
||||||
|
|
||||||
|
QTEST_MAIN(tst_QSqlRecord)
|
||||||
|
|
||||||
|
tst_QSqlRecord::tst_QSqlRecord()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
tst_QSqlRecord::~tst_QSqlRecord()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::initTestCase()
|
||||||
|
{
|
||||||
|
dbs.open();
|
||||||
|
for (const auto &dbName : qAsConst(dbs.dbNames)) {
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
CHECK_DATABASE(db);
|
||||||
|
dropTestTables(db); // In case of leftovers
|
||||||
|
createTestTables(db);
|
||||||
|
populateTestTables(db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::cleanupTestCase()
|
||||||
|
{
|
||||||
|
for (const auto &dbName : qAsConst(dbs.dbNames)) {
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
CHECK_DATABASE(db);
|
||||||
|
dropTestTables(db);
|
||||||
|
}
|
||||||
|
dbs.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::cleanup()
|
||||||
|
{
|
||||||
|
QFETCH(QString, dbName);
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
CHECK_DATABASE(db);
|
||||||
|
const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
|
||||||
|
|
||||||
|
if (QTest::currentTestFailed() && (dbType == QSqlDriver::Oracle ||
|
||||||
|
db.driverName().startsWith("QODBC"))) {
|
||||||
|
// Since Oracle ODBC has a problem when encountering an error, we init again
|
||||||
|
db.close();
|
||||||
|
db.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::generic_data(const QString &engine)
|
||||||
|
{
|
||||||
|
if (dbs.fillTestTable(engine) == 0) {
|
||||||
|
if (engine.isEmpty())
|
||||||
|
QSKIP("No database drivers are available in this Qt configuration");
|
||||||
|
else
|
||||||
|
QSKIP(QString("No database drivers of type %1 are available in this Qt configuration").arg(engine).toLocal8Bit());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::dropTestTables(QSqlDatabase db)
|
||||||
|
{
|
||||||
|
QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
|
||||||
|
QStringList tablenames;
|
||||||
|
// drop all the tables in case a testcase failed
|
||||||
|
tablenames << qtest
|
||||||
|
<< qTableName("record", __FILE__, db);
|
||||||
|
tst_Databases::safeDropTables(db, tablenames);
|
||||||
|
|
||||||
|
if (dbType == QSqlDriver::Oracle) {
|
||||||
|
QSqlQuery q(db);
|
||||||
|
q.exec("DROP PACKAGE " + qTableName("pkg", __FILE__, db));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::createTestTables(QSqlDatabase db)
|
||||||
|
{
|
||||||
|
QSqlQuery q(db);
|
||||||
|
switch (tst_Databases::getDatabaseType(db)) {
|
||||||
|
case QSqlDriver::PostgreSQL:
|
||||||
|
QVERIFY_SQL(q, exec("set client_min_messages='warning'"));
|
||||||
|
QVERIFY_SQL(q, exec("create table " + qtest + " (id serial NOT NULL, t_varchar varchar(20), "
|
||||||
|
"t_char char(20), primary key(id)) WITH OIDS"));
|
||||||
|
break;
|
||||||
|
case QSqlDriver::MySqlServer:
|
||||||
|
QVERIFY_SQL(q, exec("set table_type=innodb"));
|
||||||
|
Q_FALLTHROUGH();
|
||||||
|
default:
|
||||||
|
QVERIFY_SQL(q, exec("create table " + qtest + " (id int " + tst_Databases::autoFieldName(db) +
|
||||||
|
" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::populateTestTables(QSqlDatabase db)
|
||||||
|
{
|
||||||
|
QSqlQuery q(db);
|
||||||
|
QVERIFY_SQL(q, exec("delete from " + qtest));
|
||||||
|
QVERIFY_SQL(q, exec("insert into " + qtest + " values (1, 'VarChar1', 'Char1')"));
|
||||||
|
QVERIFY_SQL(q, exec("insert into " + qtest + " values (2, 'VarChar2', 'Char2')"));
|
||||||
|
QVERIFY_SQL(q, exec("insert into " + qtest + " values (3, 'VarChar3', 'Char3')"));
|
||||||
|
QVERIFY_SQL(q, exec("insert into " + qtest + " values (4, 'VarChar4', 'Char4')"));
|
||||||
|
QVERIFY_SQL(q, exec("insert into " + qtest + " values (5, 'VarChar5', 'Char5')"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::benchmarkRecord()
|
||||||
|
{
|
||||||
|
QFETCH(QString, dbName);
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
CHECK_DATABASE(db);
|
||||||
|
const auto tableName = qTableName("record", __FILE__, db);
|
||||||
|
{
|
||||||
|
QSqlQuery qry(db);
|
||||||
|
QVERIFY_SQL(qry, exec("create table " + tableName + " (id int NOT NULL, t_varchar varchar(20), "
|
||||||
|
"t_char char(20), primary key(id))"));
|
||||||
|
for (int i = 0; i < 1000; i++)
|
||||||
|
QVERIFY_SQL(qry, exec(QString("INSERT INTO " + tableName +
|
||||||
|
" VALUES (%1, 'VarChar%1', 'Char%1')").arg(i)));
|
||||||
|
QVERIFY_SQL(qry, exec(QString("SELECT * from ") + tableName));
|
||||||
|
QBENCHMARK {
|
||||||
|
while (qry.next())
|
||||||
|
qry.record();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tst_Databases::safeDropTables(db, QStringList() << tableName);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "tst_qsqlrecord.moc"
|
Loading…
Reference in New Issue
Block a user