179 lines
5.2 KiB
C++
179 lines
5.2 KiB
C++
//
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
|
|
//
|
|
// 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/Promise.h"
|
|
#include "td/utils/Slice.h"
|
|
#include "td/utils/Status.h"
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
|
|
namespace td {
|
|
|
|
class Binlog;
|
|
template <class BinlogT>
|
|
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 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<TdDb> database;
|
|
|
|
vector<BinlogEvent> to_secret_chats_manager;
|
|
vector<BinlogEvent> user_events;
|
|
vector<BinlogEvent> chat_events;
|
|
vector<BinlogEvent> channel_events;
|
|
vector<BinlogEvent> secret_chat_events;
|
|
vector<BinlogEvent> web_page_events;
|
|
vector<BinlogEvent> save_app_log_events;
|
|
vector<BinlogEvent> to_poll_manager;
|
|
vector<BinlogEvent> to_messages_manager;
|
|
vector<BinlogEvent> to_notification_manager;
|
|
vector<BinlogEvent> to_notification_settings_manager;
|
|
|
|
int64 since_last_open = 0;
|
|
};
|
|
static void open(int32 scheduler_id, Parameters parameters, Promise<OpenedDatabase> &&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_;
|
|
}
|
|
|
|
std::shared_ptr<FileDbInterface> get_file_db_shared();
|
|
std::shared_ptr<SqliteConnectionSafe> &get_sqlite_connection_safe();
|
|
#define get_binlog() get_binlog_impl(__FILE__, __LINE__)
|
|
BinlogInterface *get_binlog_impl(const char *file, int line);
|
|
|
|
std::shared_ptr<KeyValueSyncInterface> get_binlog_pmc_shared();
|
|
std::shared_ptr<KeyValueSyncInterface> 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_all(Promise<> on_finished);
|
|
void close_and_destroy_all(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();
|
|
|
|
void change_key(DbKey key, Promise<> promise);
|
|
|
|
void with_db_path(const std::function<void(CSlice)> &callback);
|
|
|
|
Result<string> get_stats();
|
|
|
|
private:
|
|
Parameters parameters_;
|
|
|
|
std::shared_ptr<SqliteConnectionSafe> sql_connection_;
|
|
|
|
std::shared_ptr<FileDbInterface> file_db_;
|
|
|
|
std::shared_ptr<SqliteKeyValueSafe> common_kv_safe_;
|
|
unique_ptr<SqliteKeyValueAsyncInterface> common_kv_async_;
|
|
|
|
std::shared_ptr<MessageDbSyncSafeInterface> message_db_sync_safe_;
|
|
std::shared_ptr<MessageDbAsyncInterface> message_db_async_;
|
|
|
|
std::shared_ptr<MessageThreadDbSyncSafeInterface> message_thread_db_sync_safe_;
|
|
std::shared_ptr<MessageThreadDbAsyncInterface> message_thread_db_async_;
|
|
|
|
std::shared_ptr<DialogDbSyncSafeInterface> dialog_db_sync_safe_;
|
|
std::shared_ptr<DialogDbAsyncInterface> dialog_db_async_;
|
|
|
|
std::shared_ptr<BinlogKeyValue<ConcurrentBinlog>> binlog_pmc_;
|
|
std::shared_ptr<BinlogKeyValue<ConcurrentBinlog>> config_pmc_;
|
|
std::shared_ptr<ConcurrentBinlog> binlog_;
|
|
|
|
static void open_impl(Parameters parameters, Promise<OpenedDatabase> &&promise);
|
|
|
|
static Status check_parameters(Parameters ¶meters);
|
|
|
|
Status init_sqlite(const Parameters ¶meters, const DbKey &key, const DbKey &old_key,
|
|
BinlogKeyValue<Binlog> &binlog_pmc);
|
|
|
|
void do_close(Promise<> on_finished, bool destroy_flag);
|
|
};
|
|
|
|
} // namespace td
|