From: jh9216.park Date: Tue, 13 Dec 2022 10:15:29 +0000 (-0500) Subject: Fix a bug X-Git-Tag: accepted/tizen/unified/20221219.024705~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a96ddf006892f474714be83b1bcc3fa4e781d277;p=platform%2Fcore%2Fbase%2Fbundle.git Fix a bug - In case of SQLITE_DONE, class 'Result' should be considered to handle empty selection Change-Id: Id58595a9ab464d998221286d7e58fca36f2960e4 Signed-off-by: jh9216.park --- diff --git a/tests/tizen-database_unittests/src/test_database.cc b/tests/tizen-database_unittests/src/test_database.cc index 36421c0..a582767 100644 --- a/tests/tizen-database_unittests/src/test_database.cc +++ b/tests/tizen-database_unittests/src/test_database.cc @@ -266,6 +266,7 @@ TEST_F(DatabaseTest, test_select) { auto r = db.Exec({ Q_SELECT }); EXPECT_TRUE(static_cast(r)); + int cnt = 0; for (const auto& i : r) { auto [name, num, val, data] = i.Get<_, _, _, _>(); EXPECT_EQ(static_cast(name), "gogo"); @@ -277,7 +278,10 @@ TEST_F(DatabaseTest, test_select) { 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) { @@ -312,6 +316,21 @@ TEST_F(DatabaseTest, test_select3) { } } +TEST_F(DatabaseTest, test_select4) { + using tizen_base::_; + tizen_base::Database db(TEST_DB, SQLITE_OPEN_READWRITE); + auto r = db.Exec({ Q_SELECT }); + + int cnt = 0; + EXPECT_TRUE(static_cast(r)); + for (const auto& i : r) { + (void)i; + cnt++; + } + + EXPECT_EQ(cnt, 0); +} + TEST_F(DatabaseTest, test_ToVector) { SetDefault(); diff --git a/tizen-database/database.hpp b/tizen-database/database.hpp index 32140b0..9714251 100644 --- a/tizen-database/database.hpp +++ b/tizen-database/database.hpp @@ -348,6 +348,8 @@ class Database { Result(Result&& r) noexcept { stmt_ = r.stmt_; r.stmt_ = nullptr; + query_ = std::move(r.query_); + is_done_ = r.is_done_; } Result& operator = (Result&& r) noexcept { @@ -356,6 +358,8 @@ class Database { sqlite3_finalize(stmt_); stmt_ = r.stmt_; r.stmt_ = nullptr; + query_ = std::move(r.query_); + is_done_ = r.is_done_; } return *this; @@ -432,6 +436,8 @@ class Database { }; Iterator begin() const { + if (is_done_) + return Iterator(nullptr); return Iterator(stmt_); } @@ -518,14 +524,19 @@ class Database { return query_; } + void SetDone(bool is_done) { + is_done_ = is_done; + } + private: friend class Database; - Result(sqlite3_stmt* stmt, sqlite3* db, std::string query) - : stmt_(stmt), db_(db), query_(std::move(query)) {} + Result(sqlite3_stmt* stmt, sqlite3* db, std::string query, bool is_done) + : stmt_(stmt), db_(db), query_(std::move(query)), is_done_(is_done) {} sqlite3_stmt* stmt_ = nullptr; sqlite3* db_ = nullptr; std::string query_; + bool is_done_; }; Database(std::string db, int flags) { @@ -596,7 +607,7 @@ class Database { int r = sqlite3_prepare_v2(db_, sql.GetQuery().c_str(), -1, &stmt, nullptr); if (r != SQLITE_OK) { - return { nullptr, nullptr, "" }; + return { nullptr, nullptr, "", true }; } std::unique_ptr stmt_auto(stmt, @@ -619,13 +630,14 @@ class Database { r = sqlite3_step(stmt); if (r != SQLITE_ROW && r != SQLITE_DONE) { - return { nullptr, db_, "" }; + return { nullptr, db_, "", true }; } - return { stmt_auto.release(), db_, sql.GetQuery() }; + return { stmt_auto.release(), db_, sql.GetQuery(), + r == SQLITE_DONE ? true : false }; } - bool Exec(const Sql& sql, const Result& previous_stmt) { + bool Exec(const Sql& sql, Result& previous_stmt) { if (sql.GetQuery() != previous_stmt.GetQuery()) throw DbException("Query is different"); @@ -657,6 +669,7 @@ class Database { if (r != SQLITE_ROW && r != SQLITE_DONE) return false; + previous_stmt.SetDone(r == SQLITE_DONE ? true : false); return true; }