Revision control
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include <QtCore>
++ #include <QGuiApplication>
++ #include <QSqlDatabase>
++ #include <QSqlError>
++ #include <QtQml>
++
++ static void connectToDatabase()
++ {
++ QSqlDatabase database = QSqlDatabase::database();
++ if (!database.isValid()) {
++ database = QSqlDatabase::addDatabase("QSQLITE");
++ if (!database.isValid())
++ qFatal("Cannot add database: %s", qPrintable(database.lastError().text()));
++ }
++
++ const QDir writeDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
++ if (!writeDir.mkpath("."))
++ qFatal("Failed to create writable directory at %s", qPrintable(writeDir.absolutePath()));
++
++ // Ensure that we have a writable location on all devices.
++ const QString fileName = writeDir.absolutePath() + "/chat-database.sqlite3";
++ // When using the SQLite driver, open() will create the SQLite database if it doesn't exist.
++ database.setDatabaseName(fileName);
++ if (!database.open()) {
++ qFatal("Cannot open database: %s", qPrintable(database.lastError().text()));
++ QFile::remove(fileName);
++ }
++ }
++
++ int main(int argc, char *argv[])
++ {
++ QGuiApplication app(argc, argv);
++
++ connectToDatabase();
++
++ QQmlApplicationEngine engine;
++ engine.loadFromModule("chattutorial", "Main");
++ if (engine.rootObjects().isEmpty())
++ return -1;
++
++ return app.exec();
++ }
++