Add transaction feature to database
authorSangwan Kwon <sangwan.kwon@samsung.com>
Thu, 12 Dec 2019 02:57:48 +0000 (11:57 +0900)
committer권상완/Security 2Lab(SR)/Engineer/삼성전자 <sangwan.kwon@samsung.com>
Thu, 12 Dec 2019 10:16:10 +0000 (19:16 +0900)
- performance (500 insert statements) -
DatabaseTests.no_transaction (2380 ms)
DatabaseTests.transaction (16 ms)

Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
src/vist/database/connection.hpp
src/vist/database/tests/database.cpp

index b4a9eee54057d64e4a7d423adf98e5457d7ed172..bbaedf20e6b14cd31df4a1008fd7d97afc5954da 100644 (file)
@@ -53,6 +53,16 @@ public:
                return filename;
        }
 
+       void transactionBegin()
+       {
+               this->exec("BEGIN TRANSACTION;");
+       }
+
+       void transactionEnd()
+       {
+               this->exec("END TRANSACTION;");
+       }
+
        int getErrorCode() const
        {
                return ::sqlite3_errcode(handle);
index 60159c8351c960c035af79c9dc265ce58abb334b..f3dc613a8edb776c3c7f56377e3be1bab4d07146 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <vist/exception.hpp>
+#include <vist/logger.hpp>
 
 #include <vist/database/column.hpp>
 #include <vist/database/statement.hpp>
@@ -192,3 +193,56 @@ TEST(DatabaseTests, column)
                EXPECT_TRUE(false) << e.what();
        }
 }
+
+TEST(DatabaseTests, no_transaction)
+{
+       std::string query = "INSERT INTO CLIENT VALUES (NULL, 'TP', 'TK', 0, 5001)";
+
+
+       try {
+               database::Connection db(TEST_DB_PATH);
+               int loop = 500;
+               while (loop--)
+               {
+                       database::Statement(db, query).exec();
+               }
+       } catch (const vist::Exception<ErrCode>& e) {
+               EXPECT_TRUE(false) << e.what();
+       }
+}
+
+TEST(DatabaseTests, transaction)
+{
+       std::string query = "INSERT INTO CLIENT VALUES (NULL, 'TP', 'TK', 0, 5001)";
+
+       try {
+               database::Connection db(TEST_DB_PATH);
+               db.transactionBegin();
+               int loop = 500;
+               while (loop--)
+               {
+                       database::Statement(db, query).exec();
+               }
+               db.transactionEnd();
+       } catch (const vist::Exception<ErrCode>& e) {
+               EXPECT_TRUE(false) << e.what();
+       }
+}
+
+TEST(DatabaseTests, transaction_RAW_STRING)
+{
+       std::string query = "INSERT INTO CLIENT VALUES (NULL, 'TP', 'TK', 0, 5001)";
+
+       try {
+               database::Connection db(TEST_DB_PATH);
+               db.exec("BEGIN TRANSACTION;");
+               int loop = 500;
+               while (loop--)
+               {
+                       database::Statement(db, query).exec();
+               }
+               db.exec("END TRANSACTION;");
+       } catch (const vist::Exception<ErrCode>& e) {
+               EXPECT_TRUE(false) << e.what();
+       }
+}