summaryrefslogtreecommitdiffstats
path: root/tests/auto/sql/kernel/qvfssql/tst_qvfssql.cpp
blob: 0dbdf7e60a52b2aab2c88faacdcc73554a6d5988 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include <QTest>

#include <qsqldatabase.h>
#include <qstandardpaths.h>

#include "../qsqldatabase/tst_databases.h"

using namespace Qt::StringLiterals;

class tst_QVfsSql : public QObject
{
    Q_OBJECT
private slots:
    void testRoDb();
    void testRwDb();
};

void tst_QVfsSql::testRoDb()
{
    QVERIFY(QSqlDatabase::drivers().contains("QSQLITE"_L1));
    QSqlDatabase::addDatabase("QSQLITE"_L1, "ro_db"_L1);
    QSqlDatabase db = QSqlDatabase::database("ro_db"_L1, false);
    QVERIFY_SQL(db, isValid());
    db.setDatabaseName(":/ro/sample.db"_L1);

    db.setConnectOptions("QSQLITE_USE_QT_VFS"_L1);
    QVERIFY(!db.open()); // can not open as the QSQLITE_OPEN_READONLY attribute is missing

    db.setConnectOptions("QSQLITE_USE_QT_VFS;QSQLITE_OPEN_READONLY"_L1);
    QVERIFY_SQL(db, open());

    QStringList tables = db.tables();
    QSqlQuery q{db};
    for (auto table : {"reltest1"_L1, "reltest2"_L1, "reltest3"_L1, "reltest4"_L1, "reltest5"_L1}) {
        QVERIFY(tables.contains(table));
        QVERIFY_SQL(q, exec("select * from " + table));
        QVERIFY(q.next());
    }
    QVERIFY_SQL(q, exec("select * from reltest1 where id = 4"_L1));
    QVERIFY_SQL(q, first());
    QVERIFY(q.value(0).toInt() == 4);
    QVERIFY(q.value(1).toString() == "boris"_L1);
    QVERIFY(q.value(2).toInt() == 2);
    QVERIFY(q.value(3).toInt() == 2);
}

void tst_QVfsSql::testRwDb()
{
    QSqlDatabase::addDatabase("QSQLITE"_L1, "rw_db"_L1);
    QSqlDatabase db = QSqlDatabase::database("rw_db"_L1, false);
    QVERIFY_SQL(db, isValid());
    const auto dbPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/test_qt_vfs.db"_L1;
    db.setDatabaseName(dbPath);
    QFile::remove(dbPath);

    db.setConnectOptions("QSQLITE_USE_QT_VFS;QSQLITE_OPEN_READONLY"_L1);
    QVERIFY(!db.open()); // can not open as the QSQLITE_OPEN_READONLY attribute is set and the file is missing

    db.setConnectOptions("QSQLITE_USE_QT_VFS"_L1);
    QVERIFY_SQL(db, open());

    QVERIFY(db.tables().isEmpty());
    QSqlQuery q{db};
    QVERIFY_SQL(q, exec("CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT, val INTEGER)"_L1));
    QVERIFY_SQL(q, exec("BEGIN"_L1));
    for (int i = 0; i < 1000; ++i) {
        q.prepare("INSERT INTO test (val) VALUES (:val)"_L1);
        q.bindValue(":val"_L1, i);
        QVERIFY_SQL(q, exec());
    }
    QVERIFY_SQL(q, exec("COMMIT"_L1));
    QVERIFY_SQL(q, exec("SELECT val FROM test ORDER BY val"_L1));
    for (int i = 0; i < 1000; ++i) {
        QVERIFY_SQL(q, next());
        QCOMPARE(q.value(0).toInt() , i);
    }
    QVERIFY_SQL(q, exec("DELETE FROM test WHERE val < 500"_L1));
    auto fileSize = QFileInfo{dbPath}.size();
    QVERIFY_SQL(q, exec("VACUUM"_L1));
    QVERIFY(QFileInfo{dbPath}.size() < fileSize); // TEST xTruncate VFS
    QVERIFY_SQL(q, exec("SELECT val FROM test ORDER BY val"_L1));
    for (int i = 500; i < 1000; ++i) {
        QVERIFY_SQL(q, next());
        QCOMPARE(q.value(0).toInt() , i);
    }
    db.close();
    QFile::remove(dbPath);
}

QTEST_MAIN(tst_QVfsSql)
#include "tst_qvfssql.moc"