Add ExecAsync method in class Database 86/313786/1
authorjh9216.park <jh9216.park@samsung.com>
Tue, 2 Jul 2024 03:10:38 +0000 (23:10 -0400)
committerjh9216.park <jh9216.park@samsung.com>
Tue, 2 Jul 2024 03:10:38 +0000 (23:10 -0400)
Change-Id: I4a4bd8bf98608f894f07bd2c971377c283f2774b
Signed-off-by: jh9216.park <jh9216.park@samsung.com>
src/tizen-database/README.md
src/tizen-database/database.hpp
tests/tizen-database_unittests/src/test_database.cc

index 00b5e946ad7602e76523349362e0fec30f566537..96628eecf2c9be39337f3cf017ff3fe4711313b2 100644 (file)
@@ -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<std::string>(i.Get(0));
+  }
+
+  for (const auto& i : f2.get()) {
+    auto val = static_cast<double>(i.Get(0));
+  }
+
+  for (const auto& i : f3.get()) {
+    auto num = static_cast<int>(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.
index c5f1f72d855c65dcde05d77b733eb251a87f9c08..6a4e7c9183cb1e48710af767a65403e919b8cad0 100644 (file)
@@ -20,6 +20,7 @@
 #include <sqlite3.h>
 
 #include <functional>
+#include <future>
 #include <list>
 #include <map>
 #include <memory>
@@ -822,6 +823,12 @@ class Database {
     return true;
   }
 
+  std::future<Result> 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,
index 669bd8712c80d1832b5e3953ee1ca3437d298441..0e51f93b02a901f72a2ea5975d8f90631036fb8b 100644 (file)
@@ -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<std::string>(name), "gogo");
+    EXPECT_EQ(static_cast<int>(num), 1234);
+    EXPECT_EQ(static_cast<double>(val), 9.216);
+    auto v = static_cast<std::vector<unsigned char>>(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<std::string>(name), "gogo");
+    EXPECT_EQ(static_cast<int>(num), 1234);
+    EXPECT_EQ(static_cast<double>(val), 9.216);
+    auto v = static_cast<std::vector<unsigned char>>(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<std::string>(name), "gogo");
+    EXPECT_EQ(static_cast<int>(num), 1234);
+    EXPECT_EQ(static_cast<double>(val), 9.216);
+    auto v = static_cast<std::vector<unsigned char>>(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::_;