diff --git a/tddb/td/db/SqliteDb.cpp b/tddb/td/db/SqliteDb.cpp index 6c7671288..6fd98a9bf 100644 --- a/tddb/td/db/SqliteDb.cpp +++ b/tddb/td/db/SqliteDb.cpp @@ -8,6 +8,7 @@ #include "td/utils/common.h" #include "td/utils/format.h" +#include "td/utils/logging.h" #include "td/utils/port/path.h" #include "td/utils/port/Stat.h" #include "td/utils/SliceBuilder.h" @@ -70,17 +71,13 @@ string db_key_to_sqlcipher_key(const DbKey &db_key) { SqliteDb::~SqliteDb() = default; -Status SqliteDb::init(CSlice path, bool *was_created) { - // If database does not exist, delete all other files which may left - // from older database +Status SqliteDb::init(CSlice path) { + // if database does not exist, delete all other files which could have been left from the old database bool is_db_exists = stat(path).is_ok(); if (!is_db_exists) { TRY_STATUS(destroy(path)); } - if (was_created != nullptr) { - *was_created = !is_db_exists; - } sqlite3 *db; CHECK(sqlite3_threadsafe() != 0); int rc = sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE /*| SQLITE_OPEN_SHAREDCACHE*/, @@ -196,7 +193,7 @@ Status SqliteDb::check_encryption() { Result SqliteDb::open_with_key(CSlice path, const DbKey &db_key, optional cipher_version) { auto res = do_open_with_key(path, db_key, cipher_version ? cipher_version.value() : 0); - if (res.is_error() && !cipher_version) { + if (res.is_error() && !cipher_version && !db_key.is_empty()) { return do_open_with_key(path, db_key, 3); } return res; @@ -217,7 +214,7 @@ Result SqliteDb::do_open_with_key(CSlice path, const DbKey &db_key, in } db.set_cipher_version(cipher_version); } - TRY_STATUS_PREFIX(db.check_encryption(), "Can't open database: "); + TRY_STATUS_PREFIX(db.check_encryption(), "Can't check database: "); return std::move(db); } diff --git a/tddb/td/db/SqliteDb.h b/tddb/td/db/SqliteDb.h index 39455db4c..fbd31fcae 100644 --- a/tddb/td/db/SqliteDb.h +++ b/tddb/td/db/SqliteDb.h @@ -11,7 +11,6 @@ #include "td/db/detail/RawSqliteDb.h" -#include "td/utils/logging.h" #include "td/utils/optional.h" #include "td/utils/Slice.h" #include "td/utils/Status.h" @@ -25,10 +24,6 @@ namespace td { class SqliteDb { public: SqliteDb() = default; - explicit SqliteDb(CSlice path) { - auto status = init(path); - LOG_IF(FATAL, status.is_error()) << status; - } SqliteDb(SqliteDb &&) = default; SqliteDb &operator=(SqliteDb &&) = default; SqliteDb(const SqliteDb &) = delete; @@ -47,7 +42,6 @@ class SqliteDb { *this = SqliteDb(); } - Status init(CSlice path, bool *was_created = nullptr) TD_WARN_UNUSED_RESULT; Status exec(CSlice cmd) TD_WARN_UNUSED_RESULT; Result has_table(Slice table); Result get_pragma(Slice name); @@ -61,7 +55,7 @@ class SqliteDb { static Status destroy(Slice path) TD_WARN_UNUSED_RESULT; - // Anyway we can't change the key on the fly, so having static functions is more than enough + // we can't change the key on the fly, so static functions are more than enough static Result open_with_key(CSlice path, const DbKey &db_key, optional cipher_version = {}); static Result change_key(CSlice path, const DbKey &new_db_key, const DbKey &old_db_key); @@ -86,6 +80,8 @@ class SqliteDb { std::shared_ptr raw_; bool enable_logging_ = false; + Status init(CSlice path) TD_WARN_UNUSED_RESULT; + Status check_encryption(); static Result do_open_with_key(CSlice path, const DbKey &db_key, int32 cipher_version); void set_cipher_version(int32 cipher_version); diff --git a/tddb/td/db/SqliteKeyValue.cpp b/tddb/td/db/SqliteKeyValue.cpp index 7426816d3..6095a0b21 100644 --- a/tddb/td/db/SqliteKeyValue.cpp +++ b/tddb/td/db/SqliteKeyValue.cpp @@ -11,19 +11,6 @@ namespace td { -Result SqliteKeyValue::init(string path) { - path_ = std::move(path); - bool is_created = false; - SqliteDb db; - TRY_STATUS(db.init(path, &is_created)); - TRY_STATUS(db.exec("PRAGMA encoding=\"UTF-8\"")); - TRY_STATUS(db.exec("PRAGMA synchronous=NORMAL")); - TRY_STATUS(db.exec("PRAGMA journal_mode=WAL")); - TRY_STATUS(db.exec("PRAGMA temp_store=MEMORY")); - TRY_STATUS(init_with_connection(std::move(db), "KV")); - return is_created; -} - Status SqliteKeyValue::init_with_connection(SqliteDb connection, string table_name) { auto init_guard = ScopeExit() + [&] { close(); diff --git a/tddb/td/db/SqliteKeyValue.h b/tddb/td/db/SqliteKeyValue.h index cee14a1c4..a10654c52 100644 --- a/tddb/td/db/SqliteKeyValue.h +++ b/tddb/td/db/SqliteKeyValue.h @@ -33,8 +33,6 @@ class SqliteKeyValue { return db_.empty(); } - Result init(string path) TD_WARN_UNUSED_RESULT; - Status init_with_connection(SqliteDb connection, string table_name) TD_WARN_UNUSED_RESULT; Result try_regenerate_index() TD_WARN_UNUSED_RESULT { @@ -106,7 +104,6 @@ class SqliteKeyValue { } private: - string path_; string table_name_; SqliteDb db_; SqliteStatement get_stmt_; diff --git a/test/db.cpp b/test/db.cpp index 3bec137d0..59a3c8ed4 100644 --- a/test/db.cpp +++ b/test/db.cpp @@ -137,8 +137,7 @@ TEST(DB, binlog_encryption) { TEST(DB, sqlite_lfs) { string path = "test_sqlite_db"; SqliteDb::destroy(path).ignore(); - SqliteDb db; - db.init(path).ensure(); + auto db = SqliteDb::open_with_key(path, DbKey::empty()).move_as_ok(); db.exec("PRAGMA journal_mode=WAL").ensure(); db.exec("PRAGMA user_version").ensure(); } @@ -380,7 +379,8 @@ TEST(DB, key_value) { QueryHandler sqlite_kv; CSlice name = "test_sqlite_kv"; SqliteDb::destroy(name).ignore(); - sqlite_kv.impl().init(name.str()).ensure(); + auto db = SqliteDb::open_with_key(name, DbKey::empty()).move_as_ok(); + sqlite_kv.impl().init_with_connection(std::move(db), "KV").ensure(); int cnt = 0; for (auto &q : queries) {