diff options
-rw-r--r-- | src/imports/localstorage/plugin.cpp | 27 | ||||
-rw-r--r-- | tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml | 67 | ||||
-rw-r--r-- | tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp | 17 |
3 files changed, 101 insertions, 10 deletions
diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp index e7e8d130bb..3c34d8e45a 100644 --- a/src/imports/localstorage/plugin.cpp +++ b/src/imports/localstorage/plugin.cpp @@ -399,23 +399,23 @@ static ReturnedValue qmlsqldatabase_changeVersion(const FunctionObject *b, const if (from_version != *r->d()->version) V4THROW_SQL(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("Version mismatch: expected %1, found %2").arg(from_version).arg(*r->d()->version)); - Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(scope.engine)); - ScopedObject p(scope, databaseData(scope.engine)->queryProto.value()); - w->setPrototypeUnchecked(p.getPointer()); - w->d()->type = Heap::QQmlSqlDatabaseWrapper::Query; - *w->d()->database = db; - *w->d()->version = *r->d()->version; - bool ok = true; if (!!callback) { + Scoped<QQmlSqlDatabaseWrapper> query(scope, QQmlSqlDatabaseWrapper::create(scope.engine)); + ScopedObject p(scope, databaseData(scope.engine)->queryProto.value()); + query->setPrototypeUnchecked(p.getPointer()); + query->d()->type = Heap::QQmlSqlDatabaseWrapper::Query; + *query->d()->database = db; + *query->d()->version = *r->d()->version; + ok = false; db.transaction(); JSCallData jsCall(scope, 1); *jsCall->thisObject = scope.engine->globalObject; - jsCall->args[0] = w; + jsCall->args[0] = query; - TransactionRollback rollbackOnException(&db, &w->d()->inTransaction); + TransactionRollback rollbackOnException(&db, &query->d()->inTransaction); callback->call(jsCall); rollbackOnException.clear(); if (!db.commit()) { @@ -427,12 +427,18 @@ static ReturnedValue qmlsqldatabase_changeVersion(const FunctionObject *b, const } if (ok) { + Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(scope.engine)); + ScopedObject p(scope, databaseData(scope.engine)->databaseProto.value()); + w->setPrototypeUnchecked(p.getPointer()); + w->d()->type = Heap::QQmlSqlDatabaseWrapper::Database; + *w->d()->database = db; *w->d()->version = to_version; #if QT_CONFIG(settings) const QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(scope.engine->qmlEngine()); QSettings ini(enginePrivate->offlineStorageDatabaseDirectory() + db.connectionName() + QLatin1String(".ini"), QSettings::IniFormat); ini.setValue(QLatin1String("Version"), to_version); #endif + RETURN_RESULT(w.asReturnedValue()); } RETURN_UNDEFINED(); @@ -599,7 +605,8 @@ This data can be used by application tools. \section3 db.changeVersion(from, to, callback(tx)) -This method allows you to perform a \e{Scheme Upgrade}. +This method allows you to perform a \e{Scheme Upgrade}. If it succeeds it returns a new +database object of version \e to. Otherwise it returns \e undefined. If the current version of \e db is not \e from, then an exception is thrown. diff --git a/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml b/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml new file mode 100644 index 0000000000..7d2683d869 --- /dev/null +++ b/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQml 2.2 +import QtQuick.LocalStorage 2.0 + +QtObject { + property var db; + property string version; + + function create() { + db = LocalStorage.openDatabaseSync("testdb", "2", "stuff for testing", 100000); + version = db.version; + } + + function upgrade() { + db = db.changeVersion(db.version, "22", function(y) {}); + version = db.version; + } +} diff --git a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp index f1dcefdab6..28f9c9a0c2 100644 --- a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp +++ b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp @@ -63,6 +63,7 @@ private slots: void testQml_cleanopen_data(); void testQml_cleanopen(); void totalDatabases(); + void upgradeDatabase(); void cleanupTestCase(); @@ -200,6 +201,22 @@ void tst_qqmlsqldatabase::totalDatabases() QCOMPARE(QDir(dbDir()+"/Databases").entryInfoList(QDir::Files|QDir::NoDotAndDotDot).count(), total_databases_created_by_tests*2); } +void tst_qqmlsqldatabase::upgradeDatabase() +{ + QQmlComponent component(engine, testFile("changeVersion.qml")); + QVERIFY(component.isReady()); + + QObject *object = component.create(); + QVERIFY(object); + QVERIFY(object->property("version").toString().isEmpty()); + + QVERIFY(QMetaObject::invokeMethod(object, "create")); + QCOMPARE(object->property("version").toString(), QLatin1String("2")); + + QVERIFY(QMetaObject::invokeMethod(object, "upgrade")); + QCOMPARE(object->property("version").toString(), QLatin1String("22")); +} + QTEST_MAIN(tst_qqmlsqldatabase) #include "tst_qqmlsqldatabase.moc" |