2018-12-31 20:04:05 +01:00
|
|
|
//
|
2024-01-01 01:07:21 +01:00
|
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
|
2018-12-31 20:04:05 +01:00
|
|
|
//
|
|
|
|
// 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"
|
2019-01-19 18:19:29 +01:00
|
|
|
#include "td/db/binlog/BinlogInterface.h"
|
2018-12-31 20:04:05 +01:00
|
|
|
#include "td/db/DbKey.h"
|
2019-01-06 22:06:52 +01:00
|
|
|
#include "td/db/KeyValueSyncInterface.h"
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2023-08-05 15:09:36 +02:00
|
|
|
#include "td/utils/common.h"
|
2022-06-27 12:30:18 +02:00
|
|
|
#include "td/utils/Promise.h"
|
2018-12-31 20:04:05 +01:00
|
|
|
#include "td/utils/Slice.h"
|
|
|
|
#include "td/utils/Status.h"
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace td {
|
|
|
|
|
2019-01-07 00:49:49 +01:00
|
|
|
class Binlog;
|
2019-01-07 00:44:29 +01:00
|
|
|
template <class BinlogT>
|
|
|
|
class BinlogKeyValue;
|
|
|
|
class ConcurrentBinlog;
|
2018-12-31 20:04:05 +01:00
|
|
|
class DialogDbSyncInterface;
|
|
|
|
class DialogDbSyncSafeInterface;
|
|
|
|
class DialogDbAsyncInterface;
|
|
|
|
class FileDbInterface;
|
2022-11-09 18:35:22 +01:00
|
|
|
class MessageDbSyncInterface;
|
|
|
|
class MessageDbSyncSafeInterface;
|
|
|
|
class MessageDbAsyncInterface;
|
2022-11-10 17:46:17 +01:00
|
|
|
class MessageThreadDbSyncInterface;
|
|
|
|
class MessageThreadDbSyncSafeInterface;
|
|
|
|
class MessageThreadDbAsyncInterface;
|
2019-01-07 00:44:29 +01:00
|
|
|
class SqliteConnectionSafe;
|
|
|
|
class SqliteKeyValueSafe;
|
|
|
|
class SqliteKeyValueAsyncInterface;
|
|
|
|
class SqliteKeyValue;
|
2023-07-10 12:18:32 +02:00
|
|
|
class StoryDbSyncInterface;
|
|
|
|
class StoryDbSyncSafeInterface;
|
|
|
|
class StoryDbAsyncInterface;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
class TdDb {
|
|
|
|
public:
|
|
|
|
TdDb();
|
|
|
|
TdDb(const TdDb &) = delete;
|
|
|
|
TdDb &operator=(const TdDb &) = delete;
|
|
|
|
TdDb(TdDb &&) = delete;
|
|
|
|
TdDb &operator=(TdDb &&) = delete;
|
|
|
|
~TdDb();
|
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
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;
|
|
|
|
};
|
2022-06-21 01:02:48 +02:00
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
struct OpenedDatabase {
|
2022-06-10 15:44:53 +02:00
|
|
|
unique_ptr<TdDb> database;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
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;
|
2022-07-18 18:21:47 +02:00
|
|
|
vector<BinlogEvent> save_app_log_events;
|
2023-09-22 13:22:24 +02:00
|
|
|
vector<BinlogEvent> to_account_manager;
|
2018-12-31 20:04:05 +01:00
|
|
|
vector<BinlogEvent> to_messages_manager;
|
2019-03-31 03:30:25 +02:00
|
|
|
vector<BinlogEvent> to_notification_manager;
|
2022-04-11 11:45:52 +02:00
|
|
|
vector<BinlogEvent> to_notification_settings_manager;
|
2023-09-22 13:22:24 +02:00
|
|
|
vector<BinlogEvent> to_poll_manager;
|
2023-06-01 16:41:46 +02:00
|
|
|
vector<BinlogEvent> to_story_manager;
|
2023-01-29 23:29:33 +01:00
|
|
|
|
|
|
|
int64 since_last_open = 0;
|
2018-12-31 20:04:05 +01:00
|
|
|
};
|
2023-03-13 20:29:56 +01:00
|
|
|
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_;
|
|
|
|
}
|
2019-01-06 20:59:17 +01:00
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
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_;
|
|
|
|
}
|
|
|
|
|
2023-03-13 23:41:04 +01:00
|
|
|
bool use_sqlite_pmc() const {
|
|
|
|
return parameters_.use_file_database_;
|
|
|
|
}
|
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
bool use_chat_info_database() const {
|
|
|
|
return parameters_.use_chat_info_database_;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool use_message_database() const {
|
|
|
|
return parameters_.use_message_database_;
|
|
|
|
}
|
2019-01-06 20:11:02 +01:00
|
|
|
|
2023-05-15 17:16:55 +02:00
|
|
|
bool was_dialog_db_created() const {
|
|
|
|
return was_dialog_db_created_;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::shared_ptr<FileDbInterface> get_file_db_shared();
|
|
|
|
std::shared_ptr<SqliteConnectionSafe> &get_sqlite_connection_safe();
|
2019-04-03 11:26:20 +02:00
|
|
|
#define get_binlog() get_binlog_impl(__FILE__, __LINE__)
|
|
|
|
BinlogInterface *get_binlog_impl(const char *file, int line);
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2019-01-06 22:06:52 +01:00
|
|
|
std::shared_ptr<KeyValueSyncInterface> get_binlog_pmc_shared();
|
2019-01-06 23:58:09 +01:00
|
|
|
std::shared_ptr<KeyValueSyncInterface> get_config_pmc_shared();
|
2022-10-21 23:38:04 +02:00
|
|
|
|
|
|
|
#define get_binlog_pmc() get_binlog_pmc_impl(__FILE__, __LINE__)
|
|
|
|
KeyValueSyncInterface *get_binlog_pmc_impl(const char *file, int line);
|
2019-01-07 00:44:29 +01:00
|
|
|
KeyValueSyncInterface *get_config_pmc();
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2018-07-18 03:11:48 +02:00
|
|
|
SqliteKeyValue *get_sqlite_sync_pmc();
|
2018-12-31 20:04:05 +01:00
|
|
|
SqliteKeyValueAsyncInterface *get_sqlite_pmc();
|
2019-01-06 20:59:17 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void flush_all();
|
2019-01-06 20:59:17 +01:00
|
|
|
|
2023-10-05 20:50:53 +02:00
|
|
|
void close(int32 scheduler_id, bool destroy_flag, Promise<Unit> on_finished);
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2022-11-09 18:35:22 +01:00
|
|
|
MessageDbSyncInterface *get_message_db_sync();
|
|
|
|
MessageDbAsyncInterface *get_message_db_async();
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2022-11-10 17:46:17 +01:00
|
|
|
MessageThreadDbSyncInterface *get_message_thread_db_sync();
|
|
|
|
MessageThreadDbAsyncInterface *get_message_thread_db_async();
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
DialogDbSyncInterface *get_dialog_db_sync();
|
|
|
|
DialogDbAsyncInterface *get_dialog_db_async();
|
|
|
|
|
2023-07-10 12:18:32 +02:00
|
|
|
StoryDbSyncInterface *get_story_db_sync();
|
|
|
|
StoryDbAsyncInterface *get_story_db_async();
|
|
|
|
|
2024-08-01 09:23:18 +02:00
|
|
|
static DbKey as_db_key(string key);
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void change_key(DbKey key, Promise<> promise);
|
|
|
|
|
2021-10-19 17:11:16 +02:00
|
|
|
void with_db_path(const std::function<void(CSlice)> &callback);
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2019-04-17 11:17:51 +02:00
|
|
|
Result<string> get_stats();
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
private:
|
2023-03-13 20:29:56 +01:00
|
|
|
Parameters parameters_;
|
|
|
|
|
2023-05-15 17:16:55 +02:00
|
|
|
bool was_dialog_db_created_ = false;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::shared_ptr<SqliteConnectionSafe> sql_connection_;
|
|
|
|
|
|
|
|
std::shared_ptr<FileDbInterface> file_db_;
|
|
|
|
|
|
|
|
std::shared_ptr<SqliteKeyValueSafe> common_kv_safe_;
|
2018-09-27 03:19:03 +02:00
|
|
|
unique_ptr<SqliteKeyValueAsyncInterface> common_kv_async_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2022-11-09 18:35:22 +01:00
|
|
|
std::shared_ptr<MessageDbSyncSafeInterface> message_db_sync_safe_;
|
|
|
|
std::shared_ptr<MessageDbAsyncInterface> message_db_async_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2022-11-10 17:46:17 +01:00
|
|
|
std::shared_ptr<MessageThreadDbSyncSafeInterface> message_thread_db_sync_safe_;
|
|
|
|
std::shared_ptr<MessageThreadDbAsyncInterface> message_thread_db_async_;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::shared_ptr<DialogDbSyncSafeInterface> dialog_db_sync_safe_;
|
|
|
|
std::shared_ptr<DialogDbAsyncInterface> dialog_db_async_;
|
|
|
|
|
2023-07-10 12:18:32 +02:00
|
|
|
std::shared_ptr<StoryDbSyncSafeInterface> story_db_sync_safe_;
|
|
|
|
std::shared_ptr<StoryDbAsyncInterface> story_db_async_;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::shared_ptr<BinlogKeyValue<ConcurrentBinlog>> binlog_pmc_;
|
|
|
|
std::shared_ptr<BinlogKeyValue<ConcurrentBinlog>> config_pmc_;
|
|
|
|
std::shared_ptr<ConcurrentBinlog> binlog_;
|
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
static void open_impl(Parameters parameters, Promise<OpenedDatabase> &&promise);
|
2022-06-29 23:28:25 +02:00
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
static Status check_parameters(Parameters ¶meters);
|
2022-06-29 23:28:25 +02:00
|
|
|
|
2023-03-13 20:29:56 +01:00
|
|
|
Status init_sqlite(const Parameters ¶meters, const DbKey &key, const DbKey &old_key,
|
2018-12-31 20:04:05 +01:00
|
|
|
BinlogKeyValue<Binlog> &binlog_pmc);
|
|
|
|
|
2023-10-05 20:50:53 +02:00
|
|
|
void do_close(bool destroy_flag, Promise<Unit> on_finished);
|
2018-12-31 20:04:05 +01:00
|
|
|
};
|
2019-10-03 19:38:47 +02:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
} // namespace td
|