// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024 // // 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/binlog/BinlogEvent.h" #include "td/db/binlog/BinlogInterface.h" #include "td/db/DbKey.h" #include "td/db/KeyValueSyncInterface.h" #include "td/utils/common.h" #include "td/utils/Promise.h" #include "td/utils/Slice.h" #include "td/utils/Status.h" #include #include namespace td { class Binlog; template class BinlogKeyValue; class ConcurrentBinlog; class DialogDbSyncInterface; class DialogDbSyncSafeInterface; class DialogDbAsyncInterface; class FileDbInterface; class MessageDbSyncInterface; class MessageDbSyncSafeInterface; class MessageDbAsyncInterface; class MessageThreadDbSyncInterface; class MessageThreadDbSyncSafeInterface; class MessageThreadDbAsyncInterface; class SqliteConnectionSafe; class SqliteKeyValueSafe; class SqliteKeyValueAsyncInterface; class SqliteKeyValue; class StoryDbSyncInterface; class StoryDbSyncSafeInterface; class StoryDbAsyncInterface; class TdDb { public: TdDb(); TdDb(const TdDb &) = delete; TdDb &operator=(const TdDb &) = delete; TdDb(TdDb &&) = delete; TdDb &operator=(TdDb &&) = delete; ~TdDb(); struct Parameters { DbKey encryption_key_; string database_directory_; string files_directory_; bool is_test_dc_ = false; bool use_file_database_ = false; bool use_chat_info_database_ = false; bool use_message_database_ = false; }; struct OpenedDatabase { unique_ptr database; vector to_secret_chats_manager; vector user_events; vector chat_events; vector channel_events; vector secret_chat_events; vector web_page_events; vector save_app_log_events; vector to_account_manager; vector to_messages_manager; vector to_notification_manager; vector to_notification_settings_manager; vector to_poll_manager; vector to_story_manager; int64 since_last_open = 0; }; static void open(int32 scheduler_id, Parameters parameters, Promise &&promise); static Status destroy(const Parameters ¶meters); Slice get_database_directory() const { return parameters_.database_directory_; } Slice get_files_directory() const { return parameters_.files_directory_; } bool is_test_dc() const { return parameters_.is_test_dc_; } bool use_file_database() const { return parameters_.use_file_database_; } bool use_sqlite_pmc() const { return parameters_.use_file_database_; } bool use_chat_info_database() const { return parameters_.use_chat_info_database_; } bool use_message_database() const { return parameters_.use_message_database_; } bool was_dialog_db_created() const { return was_dialog_db_created_; } std::shared_ptr get_file_db_shared(); std::shared_ptr &get_sqlite_connection_safe(); #define get_binlog() get_binlog_impl(__FILE__, __LINE__) BinlogInterface *get_binlog_impl(const char *file, int line); std::shared_ptr get_binlog_pmc_shared(); std::shared_ptr get_config_pmc_shared(); #define get_binlog_pmc() get_binlog_pmc_impl(__FILE__, __LINE__) KeyValueSyncInterface *get_binlog_pmc_impl(const char *file, int line); KeyValueSyncInterface *get_config_pmc(); SqliteKeyValue *get_sqlite_sync_pmc(); SqliteKeyValueAsyncInterface *get_sqlite_pmc(); void flush_all(); void close(int32 scheduler_id, bool destroy_flag, Promise on_finished); MessageDbSyncInterface *get_message_db_sync(); MessageDbAsyncInterface *get_message_db_async(); MessageThreadDbSyncInterface *get_message_thread_db_sync(); MessageThreadDbAsyncInterface *get_message_thread_db_async(); DialogDbSyncInterface *get_dialog_db_sync(); DialogDbAsyncInterface *get_dialog_db_async(); StoryDbSyncInterface *get_story_db_sync(); StoryDbAsyncInterface *get_story_db_async(); void change_key(DbKey key, Promise<> promise); void with_db_path(const std::function &callback); Result get_stats(); private: Parameters parameters_; bool was_dialog_db_created_ = false; std::shared_ptr sql_connection_; std::shared_ptr file_db_; std::shared_ptr common_kv_safe_; unique_ptr common_kv_async_; std::shared_ptr message_db_sync_safe_; std::shared_ptr message_db_async_; std::shared_ptr message_thread_db_sync_safe_; std::shared_ptr message_thread_db_async_; std::shared_ptr dialog_db_sync_safe_; std::shared_ptr dialog_db_async_; std::shared_ptr story_db_sync_safe_; std::shared_ptr story_db_async_; std::shared_ptr> binlog_pmc_; std::shared_ptr> config_pmc_; std::shared_ptr binlog_; static void open_impl(Parameters parameters, Promise &&promise); static Status check_parameters(Parameters ¶meters); Status init_sqlite(const Parameters ¶meters, const DbKey &key, const DbKey &old_key, BinlogKeyValue &binlog_pmc); void do_close(bool destroy_flag, Promise on_finished); }; } // namespace td