From 4a5ee13b6ca81d71c252c62a170643b55d3a422c Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Mon, 1 Jul 2024 23:10:38 -0400 Subject: [PATCH] Add ExecAsync method in class Database Change-Id: I4a4bd8bf98608f894f07bd2c971377c283f2774b Signed-off-by: jh9216.park --- src/tizen-database/README.md | 23 +++++++ src/tizen-database/database.hpp | 7 ++ .../tizen-database_unittests/src/test_database.cc | 76 ++++++++++++++++++++++ 3 files changed, 106 insertions(+) diff --git a/src/tizen-database/README.md b/src/tizen-database/README.md index 00b5e94..96628ee 100644 --- a/src/tizen-database/README.md +++ b/src/tizen-database/README.md @@ -120,6 +120,29 @@ void test() { } ``` +### Running SQL queries simultaneously using tasks +```cpp + auto f1 = db.ExecAsync({ "SELECT name FROM TestTable;" }); + auto f2 = db.ExecAsync({ "SELECT val FROM TestTable;" }); + auto f3 = db.ExecAsync({ "SELECT num FROM TestTable;" }); + + f1.wait(); + f2.wait(); + f3.wait(); + + for (const auto& i : f1.get()) { + auto name = static_cast(i.Get(0)); + } + + for (const auto& i : f2.get()) { + auto val = static_cast(i.Get(0)); + } + + for (const auto& i : f3.get()) { + auto num = static_cast(i.Get(0)); + } +``` + ### ToList(), ToVector() methods - Once you provide function operator in your classes, you can call the methods. - The class or struct should be movable. diff --git a/src/tizen-database/database.hpp b/src/tizen-database/database.hpp index c5f1f72..6a4e7c9 100644 --- a/src/tizen-database/database.hpp +++ b/src/tizen-database/database.hpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -822,6 +823,12 @@ class Database { return true; } + std::future ExecAsync(const Sql& sql) const { + return std::async(std::launch::async, [=]() { + return Exec(sql); + }); + } + void OneStepExec(const Sql& sql) const { char* errmsg = nullptr; int ret = sqlite3_exec(db_.get(), sql.GetQuery().c_str(), nullptr, nullptr, diff --git a/tests/tizen-database_unittests/src/test_database.cc b/tests/tizen-database_unittests/src/test_database.cc index 669bd87..0e51f93 100644 --- a/tests/tizen-database_unittests/src/test_database.cc +++ b/tests/tizen-database_unittests/src/test_database.cc @@ -333,6 +333,82 @@ TEST_F(DatabaseTest, test_select) { EXPECT_EQ(cnt, 2); } +TEST_F(DatabaseTest, test_select_async) { + SetDefault(); + using tizen_base::_; + tizen_base::Database db(TEST_DB, SQLITE_OPEN_READWRITE); + auto f = db.ExecAsync({ Q_SELECT }); + auto r = f.get(); + + EXPECT_TRUE(r); + int cnt = 0; + for (const auto& i : r) { + auto [name, num, val, data] = i.Get<_, _, _, _>(); + EXPECT_EQ(static_cast(name), "gogo"); + EXPECT_EQ(static_cast(num), 1234); + EXPECT_EQ(static_cast(val), 9.216); + auto v = static_cast>(data); + EXPECT_EQ(v.size(), 4); + EXPECT_EQ(v[0], '9'); + EXPECT_EQ(v[1], '2'); + EXPECT_EQ(v[2], '1'); + EXPECT_EQ(v[3], '6'); + cnt++; + } + + EXPECT_EQ(cnt, 2); +} + +TEST_F(DatabaseTest, test_select_async2) { + SetDefault(); + using tizen_base::_; + tizen_base::Database db(TEST_DB, SQLITE_OPEN_READWRITE); + auto f1 = db.ExecAsync({ Q_SELECT }); + auto f2 = db.ExecAsync({ Q_SELECT }); + + f1.wait(); + f2.wait(); + + auto r1 = f1.get(); + EXPECT_TRUE(r1); + auto r2 = f2.get(); + EXPECT_TRUE(r2); + + int cnt = 0; + for (const auto& i : r1) { + auto [name, num, val, data] = i.Get<_, _, _, _>(); + EXPECT_EQ(static_cast(name), "gogo"); + EXPECT_EQ(static_cast(num), 1234); + EXPECT_EQ(static_cast(val), 9.216); + auto v = static_cast>(data); + EXPECT_EQ(v.size(), 4); + EXPECT_EQ(v[0], '9'); + EXPECT_EQ(v[1], '2'); + EXPECT_EQ(v[2], '1'); + EXPECT_EQ(v[3], '6'); + cnt++; + } + + EXPECT_EQ(cnt, 2); + + cnt = 0; + for (const auto& i : r2) { + auto [name, num, val, data] = i.Get<_, _, _, _>(); + EXPECT_EQ(static_cast(name), "gogo"); + EXPECT_EQ(static_cast(num), 1234); + EXPECT_EQ(static_cast(val), 9.216); + auto v = static_cast>(data); + EXPECT_EQ(v.size(), 4); + EXPECT_EQ(v[0], '9'); + EXPECT_EQ(v[1], '2'); + EXPECT_EQ(v[2], '1'); + EXPECT_EQ(v[3], '6'); + cnt++; + } + + EXPECT_EQ(cnt, 2); +} + TEST_F(DatabaseTest, test_select2) { SetDefault(); using tizen_base::_; -- 2.7.4