File indexing completed on 2024-12-08 12:44:36
0001 // SPDX-FileCopyrightText: 2022 Jonah BrĂ¼chert <jbb@kaidan.im 0002 // 0003 // SPDX-License-Identifier: BSD-2-Clause 0004 0005 0006 // Qt 0007 #include "qstringliteral.h" 0008 #include <QCoreApplication> 0009 #include <QTimer> 0010 0011 // QCoro 0012 #include <QCoro/QCoroTask> 0013 #include <QCoro/QCoroFuture> 0014 0015 // FutureSQL 0016 #include <ThreadedDatabase> 0017 0018 // STL 0019 #include <tuple> 0020 0021 0022 // A data structure that represents data from the "test" table 0023 struct HelloWorld { 0024 // Types that the database columns can be converted to. The types must be convertible from QVariant. 0025 using ColumnTypes = std::tuple<int, QString>; 0026 0027 // This function gets a row from the database as a tuple, and puts it into the HelloWorld structs. 0028 // If the ColumnTypes already match the types and order of the attributes in the struct, you don't need to implement it. 0029 // 0030 // Try to comment it out, the example should still compile and work. 0031 static HelloWorld fromSql(ColumnTypes &&tuple) { 0032 auto [id, data] = tuple; 0033 return HelloWorld { id, data }; 0034 } 0035 0036 // attributes 0037 int id; 0038 QString data; 0039 }; 0040 0041 QCoro::Task<> databaseExample() { 0042 // This object contains the database configuration, 0043 // in this case just the path to the SQLite file, and the database type (SQLite). 0044 DatabaseConfiguration config; 0045 config.setDatabaseName(QStringLiteral("database.sqlite")); 0046 config.setType(DatabaseType::SQLite); 0047 0048 // Here we open the database file, and get a handle to the database. 0049 auto database = ThreadedDatabase::establishConnection(config); 0050 0051 // Execute some queries. 0052 co_await database->execute(QStringLiteral("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT)")); 0053 0054 // Query parameters are bound by position in the query. The execute function is variadic and you can add as many parameters as you need. 0055 co_await database->execute(QStringLiteral("INSERT INTO test (data) VALUES (?))"), QStringLiteral("Hello World")); 0056 0057 // Retrieve some data from the database. 0058 // The data is directly returned as our HelloWorld struct. 0059 auto results = co_await database->getResults<HelloWorld>(QStringLiteral("SELECT * FROM test")); 0060 0061 // Print out the data in the result list 0062 for (const auto &result : results) { 0063 qDebug() << result.id << result.data; 0064 } 0065 0066 // Quit the event loop as we are done 0067 QCoreApplication::instance()->quit(); 0068 } 0069 0070 // Just a minimal main function for QCoro, to start the Qt event loop. 0071 int main(int argc, char *argv[]) { 0072 QCoreApplication app(argc, argv); 0073 QTimer::singleShot(0, databaseExample); 0074 return app.exec(); 0075 }