// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "td/db/DbKey.h" #include "td/db/SqliteStatement.h" #include "td/db/detail/RawSqliteDb.h" #include "td/utils/optional.h" #include "td/utils/Slice.h" #include "td/utils/Status.h" #include struct sqlite3; namespace td { class SqliteDb { public: SqliteDb() = default; SqliteDb(SqliteDb &&) = default; SqliteDb &operator=(SqliteDb &&) = default; SqliteDb(const SqliteDb &) = delete; SqliteDb &operator=(const SqliteDb &) = delete; ~SqliteDb(); // dangerous SqliteDb clone() const { return SqliteDb(raw_); } bool empty() const { return !raw_; } void close() { *this = SqliteDb(); } Status exec(CSlice cmd) TD_WARN_UNUSED_RESULT; Result has_table(Slice table); Result get_pragma(Slice name); Result get_pragma_string(Slice name); Status begin_read_transaction() TD_WARN_UNUSED_RESULT; Status begin_write_transaction() TD_WARN_UNUSED_RESULT; Status commit_transaction() TD_WARN_UNUSED_RESULT; Result user_version(); Status set_user_version(int32 version) TD_WARN_UNUSED_RESULT; void trace(bool flag); static Status destroy(Slice path) TD_WARN_UNUSED_RESULT; // we can't change the key on the fly, so static functions are more than enough static Result open_with_key(CSlice path, bool allow_creation, const DbKey &db_key, optional cipher_version = {}); static Result change_key(CSlice path, bool allow_creation, const DbKey &new_db_key, const DbKey &old_db_key); sqlite3 *get_native() const { return raw_->db(); } Result get_statement(CSlice statement) TD_WARN_UNUSED_RESULT; template static void with_db_path(Slice main_path, F &&f) { detail::RawSqliteDb::with_db_path(main_path, f); } optional get_cipher_version() const; private: explicit SqliteDb(std::shared_ptr raw) : raw_(std::move(raw)) { } std::shared_ptr raw_; bool enable_logging_ = false; Status init(CSlice path, bool allow_creation) TD_WARN_UNUSED_RESULT; Status check_encryption(); static Result do_open_with_key(CSlice path, bool allow_creation, const DbKey &db_key, int32 cipher_version); void set_cipher_version(int32 cipher_version); }; } // namespace td