From 69d4e0a18f6efaf3d7660e4b708b9fcdb9a64250 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 4 Dec 2009 14:48:11 +1000 Subject: Prevent call to executeSql outside transaction (eg. if arg kept). --- src/declarative/qml/qmlsqldatabase.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/declarative/qml/qmlsqldatabase.cpp b/src/declarative/qml/qmlsqldatabase.cpp index 3ddfec3..d0d8264 100644 --- a/src/declarative/qml/qmlsqldatabase.cpp +++ b/src/declarative/qml/qmlsqldatabase.cpp @@ -196,6 +196,12 @@ static QScriptValue qmlsqldatabase_item(QScriptContext *context, QScriptEngine * return engine->undefinedValue(); } +static QScriptValue qmlsqldatabase_executeSql_outsidetransaction(QScriptContext *context, QScriptEngine *engine) +{ + qDebug() << QmlEngine::tr("executeSql called outside transaction()"); + THROW_SQL(DATABASE_ERR,QmlEngine::tr("executeSql called outside transaction()")); +} + static QScriptValue qmlsqldatabase_executeSql(QScriptContext *context, QScriptEngine *engine) { QSqlDatabase db = qscriptvalue_cast(context->thisObject()); @@ -308,6 +314,8 @@ static QScriptValue qmlsqldatabase_transaction_shared(QScriptContext *context, Q db.transaction(); callback.call(QScriptValue(), QScriptValueList() << tx); + instance.setProperty(QLatin1String("executeSql"), + engine->newFunction(qmlsqldatabase_executeSql_outsidetransaction)); if (engine->hasUncaughtException()) { db.rollback(); } else { -- cgit v0.12 From 80fe1a635d4bee97f5e6b15be34b59c7536ae54d Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 4 Dec 2009 14:53:08 +1000 Subject: Test for 69d4e0a18f6efaf3d7660e4b708b9fcdb9a64250 --- .../declarative/sql/data/error-outsidetransaction.js | 17 +++++++++++++++++ tests/auto/declarative/sql/tst_sql.cpp | 1 + 2 files changed, 18 insertions(+) create mode 100644 tests/auto/declarative/sql/data/error-outsidetransaction.js diff --git a/tests/auto/declarative/sql/data/error-outsidetransaction.js b/tests/auto/declarative/sql/data/error-outsidetransaction.js new file mode 100644 index 0000000..a7af3bd --- /dev/null +++ b/tests/auto/declarative/sql/data/error-outsidetransaction.js @@ -0,0 +1,17 @@ +function test() { + var db = openDatabaseSync("QmlTestDB-data/error-notransaction", "1.0", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; + var v; + + try { + db.transaction(function(tx) { v = tx }); + v.executeSql("SELECT 'bad'") + } catch (err) { + if (err.message == "executeSql called outside transaction()") + r = "passed"; + else + r = "WRONG ERROR="+err.message; + } + + return r; +} diff --git a/tests/auto/declarative/sql/tst_sql.cpp b/tests/auto/declarative/sql/tst_sql.cpp index 4296279..1e4e6f8 100644 --- a/tests/auto/declarative/sql/tst_sql.cpp +++ b/tests/auto/declarative/sql/tst_sql.cpp @@ -152,6 +152,7 @@ void tst_sql::testQml_data() QTest::newRow("iteration-forwardonly") << "data/iteration-forwardonly.js"; QTest::newRow("error-a") << "data/error-a.js"; QTest::newRow("error-notransaction") << "data/error-notransaction.js"; + QTest::newRow("error-outsidetransaction") << "data/error-outsidetransaction.js"; // reuse above QTest::newRow("reopen1") << "data/reopen1.js"; QTest::newRow("reopen2") << "data/reopen2.js"; // re-uses above DB -- cgit v0.12 From f25a36f619111ca8e39964830ebf421ab46f9b00 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 4 Dec 2009 14:58:24 +1000 Subject: undebug --- src/declarative/qml/qmlsqldatabase.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/declarative/qml/qmlsqldatabase.cpp b/src/declarative/qml/qmlsqldatabase.cpp index d0d8264..b550f96 100644 --- a/src/declarative/qml/qmlsqldatabase.cpp +++ b/src/declarative/qml/qmlsqldatabase.cpp @@ -198,7 +198,6 @@ static QScriptValue qmlsqldatabase_item(QScriptContext *context, QScriptEngine * static QScriptValue qmlsqldatabase_executeSql_outsidetransaction(QScriptContext *context, QScriptEngine *engine) { - qDebug() << QmlEngine::tr("executeSql called outside transaction()"); THROW_SQL(DATABASE_ERR,QmlEngine::tr("executeSql called outside transaction()")); } -- cgit v0.12 From f78ca8adb35a6ce95563e7e6b80c22705eaf57ef Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 4 Dec 2009 15:14:25 +1000 Subject: test bug --- tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp index fb8bfb3..c3c7977 100644 --- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp +++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp @@ -106,6 +106,7 @@ private slots: void signalTriggeredBindings(); void listProperties(); void exceptionClearsOnReeval(); + void exceptionProducesWarning(); void transientErrors(); void shutdownErrors(); void externalScript(); @@ -909,6 +910,18 @@ void tst_qmlecmascript::exceptionClearsOnReeval() QCOMPARE(object->property("test").toBool(), true); } +void tst_qmlecmascript::exceptionProducesWarning() +{ + QmlComponent component(&engine, TEST_FILE("exceptionProducesWarning.qml")); + QString url = component.url().toString(); + + QString warning = "Expected error - QTBUG-6507"; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); +} + static int transientErrorsMsgCount = 0; static void transientErrorsMsgHandler(QtMsgType, const char *) { -- cgit v0.12