summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h')
-rw-r--r--protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h b/protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h
new file mode 100644
index 0000000000..40137464ce
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/tddb/td/db/SqliteDb.h
@@ -0,0 +1,86 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// 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/logging.h"
+#include "td/utils/Slice.h"
+#include "td/utils/Status.h"
+
+#include <memory>
+
+struct sqlite3;
+
+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;
+ SqliteDb &operator=(const SqliteDb &) = delete;
+ ~SqliteDb();
+
+ // dangerous
+ SqliteDb clone() const {
+ return SqliteDb(raw_);
+ }
+
+ bool empty() const {
+ return !raw_;
+ }
+ void close() {
+ *this = SqliteDb();
+ }
+
+ Status init(CSlice path, bool *was_created = nullptr) TD_WARN_UNUSED_RESULT;
+ Status exec(CSlice cmd) TD_WARN_UNUSED_RESULT;
+ Result<bool> has_table(Slice table);
+ Result<string> get_pragma(Slice name);
+ Status begin_transaction();
+ Status commit_transaction();
+
+ Result<int32> user_version();
+ Status set_user_version(int32 version);
+ void trace(bool flag);
+
+ static Status destroy(Slice path) TD_WARN_UNUSED_RESULT;
+
+ // Anyway we can't change the key on the fly, so static functions is more than enough
+ static Result<SqliteDb> open_with_key(CSlice path, const DbKey &db_key);
+ static Status change_key(CSlice path, const DbKey &new_db_key, const DbKey &old_db_key);
+
+ Status last_error();
+
+ sqlite3 *get_native() const {
+ return raw_->db();
+ }
+
+ Result<SqliteStatement> get_statement(CSlice statement) TD_WARN_UNUSED_RESULT;
+
+ template <class F>
+ static void with_db_path(Slice main_path, F &&f) {
+ detail::RawSqliteDb::with_db_path(main_path, f);
+ }
+
+ private:
+ explicit SqliteDb(std::shared_ptr<detail::RawSqliteDb> raw) : raw_(std::move(raw)) {
+ }
+ std::shared_ptr<detail::RawSqliteDb> raw_;
+
+ bool is_encrypted();
+};
+} // namespace td