diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a46f27ff..ec4ce0df3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -748,7 +748,6 @@ set(TDLIB_SOURCE td/telegram/Td.h td/telegram/TdCallback.h td/telegram/TdDb.h - td/telegram/TdParameters.h td/telegram/TermsOfService.h td/telegram/ThemeManager.h td/telegram/TopDialogCategory.h diff --git a/td/telegram/Global.cpp b/td/telegram/Global.cpp index 837274825..584f33971 100644 --- a/td/telegram/Global.cpp +++ b/td/telegram/Global.cpp @@ -85,9 +85,7 @@ struct ServerTimeDiff { } }; -Status Global::init(const TdParameters ¶meters, ActorId td, unique_ptr td_db_ptr) { - parameters_ = parameters; - +Status Global::init(ActorId td, unique_ptr td_db_ptr) { gc_scheduler_id_ = min(Scheduler::instance()->sched_id() + 2, Scheduler::instance()->sched_count() - 1); slow_net_scheduler_id_ = min(Scheduler::instance()->sched_id() + 3, Scheduler::instance()->sched_count() - 1); @@ -135,6 +133,30 @@ Status Global::init(const TdParameters ¶meters, ActorId td, unique_ptrget_database_directory(); +} + +Slice Global::get_files_dir() const { + return td_db_->get_files_directory(); +} + +bool Global::is_test_dc() const { + return td_db_->is_test_dc(); +} + +bool Global::use_file_database() const { + return td_db_->use_file_database(); +} + +bool Global::use_chat_info_database() const { + return td_db_->use_chat_info_database(); +} + +bool Global::use_message_database() const { + return td_db_->use_message_database(); +} + int32 Global::get_retry_after(int32 error_code, Slice error_message) { if (error_code != 429) { return 0; diff --git a/td/telegram/Global.h b/td/telegram/Global.h index ba0072487..83f5460ab 100644 --- a/td/telegram/Global.h +++ b/td/telegram/Global.h @@ -10,7 +10,6 @@ #include "td/telegram/net/DcId.h" #include "td/telegram/net/MtprotoHeader.h" #include "td/telegram/net/NetQueryCreator.h" -#include "td/telegram/TdParameters.h" #include "td/net/NetStats.h" @@ -92,23 +91,20 @@ class Global final : public ActorContext { void close_all(Promise<> on_finished); void close_and_destroy_all(Promise<> on_finished); - Status init(const TdParameters ¶meters, ActorId td, unique_ptr td_db_ptr) TD_WARN_UNUSED_RESULT; + Status init(ActorId td, unique_ptr td_db_ptr) TD_WARN_UNUSED_RESULT; + + Slice get_dir() const; - Slice get_dir() const { - return parameters_.database_directory; - } Slice get_secure_files_dir() const { if (store_all_files_in_files_directory_) { return get_files_dir(); } return get_dir(); } - Slice get_files_dir() const { - return parameters_.files_directory; - } - bool is_test_dc() const { - return parameters_.use_test_dc; - } + + Slice get_files_dir() const; + + bool is_test_dc() const; NetQueryCreator &net_query_creator() { return *net_query_creator_.get(); @@ -394,17 +390,11 @@ class Global final : public ActorContext { return mtproto_header_ != nullptr; } - bool use_file_database() const { - return parameters_.use_file_db; - } + bool use_file_database() const; - bool use_chat_info_database() const { - return parameters_.use_chat_info_db; - } + bool use_chat_info_database() const; - bool use_message_database() const { - return parameters_.use_message_db; - } + bool use_message_database() const; int32 get_gc_scheduler_id() const { return gc_scheduler_id_; @@ -528,7 +518,6 @@ class Global final : public ActorContext { OptionManager *option_manager_ = nullptr; - TdParameters parameters_; int32 gc_scheduler_id_ = 0; int32 slow_net_scheduler_id_ = 0; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index ca2552ba2..8feae8b9f 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -2957,23 +2957,23 @@ void Td::run_request(uint64 id, tl_object_ptr function) { case State::WaitParameters: { switch (function_id) { case td_api::setTdlibParameters::ID: { - auto parameters = move_tl_object_as(function); - auto database_encryption_key = as_db_key(std::move(parameters->database_encryption_key_)); - auto r_parameters = set_parameters(std::move(parameters)); + auto r_parameters = get_parameters(move_tl_object_as(function)); if (r_parameters.is_error()) { return send_closure(actor_id(this), &Td::send_error, id, r_parameters.move_as_error()); } + auto parameters = r_parameters.move_as_ok(); VLOG(td_init) << "Begin to open database"; set_parameters_request_id_ = id; - can_ignore_background_updates_ = !r_parameters.ok().use_file_db && !r_parameters.ok().use_secret_chats; + can_ignore_background_updates_ = + !parameters.second.use_file_database_ && !parameters.second.use_chat_info_database_ && + !parameters.second.use_message_database_ && !parameters.first.use_secret_chats_; - auto promise = - PromiseCreator::lambda([actor_id = actor_id(this)](Result r_opened_database) { - send_closure(actor_id, &Td::init, std::move(r_opened_database)); - }); - return TdDb::open(get_database_scheduler_id(), r_parameters.move_as_ok(), std::move(database_encryption_key), - std::move(promise)); + auto promise = PromiseCreator::lambda([actor_id = actor_id(this), parameters = std::move(parameters.first)]( + Result r_opened_database) mutable { + send_closure(actor_id, &Td::init, std::move(parameters), std::move(r_opened_database)); + }); + return TdDb::open(get_database_scheduler_id(), std::move(parameters.second), std::move(promise)); } default: if (is_preinitialization_request(function_id)) { @@ -3545,7 +3545,7 @@ void Td::finish_set_parameters() { CHECK(pending_set_parameters_requests_.size() < requests.size()); } -void Td::init(Result r_opened_database) { +void Td::init(Parameters parameters, Result r_opened_database) { CHECK(set_parameters_request_id_ != 0); if (r_opened_database.is_error()) { LOG(WARNING) << "Failed to open database: " << r_opened_database.error(); @@ -3554,16 +3554,14 @@ void Td::init(Result r_opened_database) { } auto events = r_opened_database.move_as_ok(); - LOG(INFO) << "Successfully inited database in " << tag("database_directory", events.parameters.database_directory) - << " and " << tag("files_directory", events.parameters.files_directory); VLOG(td_init) << "Successfully inited database"; - G()->init(events.parameters, actor_id(this), std::move(events.database)).ensure(); + G()->init(actor_id(this), std::move(events.database)).ensure(); init_options_and_network(); - option_manager_->set_option_boolean("use_storage_optimizer", events.parameters.enable_storage_optimizer); - option_manager_->set_option_boolean("ignore_file_names", events.parameters.ignore_file_names); + option_manager_->set_option_boolean("use_storage_optimizer", parameters.enable_storage_optimizer_); + option_manager_->set_option_boolean("ignore_file_names", parameters.ignore_file_names_); // we need to process td_api::getOption along with td_api::setOption for consistency // we need to process td_api::setOption before managers and MTProto header are created, @@ -3627,8 +3625,7 @@ void Td::init(Result r_opened_database) { }); VLOG(td_init) << "Create AuthManager"; - auth_manager_ = - td::make_unique(events.parameters.api_id, events.parameters.api_hash, create_reference()); + auth_manager_ = td::make_unique(parameters.api_id_, parameters.api_hash_, create_reference()); auth_manager_actor_ = register_actor("AuthManager", auth_manager_.get()); G()->set_auth_manager(auth_manager_actor_.get()); @@ -3637,7 +3634,7 @@ void Td::init(Result r_opened_database) { init_managers(); secret_chats_manager_ = - create_actor("SecretChatsManager", create_reference(), events.parameters.use_secret_chats); + create_actor("SecretChatsManager", create_reference(), parameters.use_secret_chats_); G()->set_secret_chats_manager(secret_chats_manager_.get()); storage_manager_ = create_actor("StorageManager", create_reference(), G()->get_gc_scheduler_id()); @@ -4078,7 +4075,8 @@ Promise Td::create_ok_request_promise(uint64 id) { static_assert(std::is_same::ReturnType, td_api::object_ptr>::value, ""); \ auto promise = create_ok_request_promise(id) -Result Td::set_parameters(td_api::object_ptr parameters) { +Result> Td::get_parameters( + td_api::object_ptr parameters) { VLOG(td_init) << "Begin to set TDLib parameters"; if (!clean_input_string(parameters->api_hash_) || !clean_input_string(parameters->system_language_code_) || !clean_input_string(parameters->device_model_) || !clean_input_string(parameters->system_version_) || @@ -4094,18 +4092,20 @@ Result Td::set_parameters(td_api::object_ptrdatabase_directory_); - result.files_directory = std::move(parameters->files_directory_); - result.api_id = parameters->api_id_; - result.api_hash = std::move(parameters->api_hash_); - result.use_test_dc = parameters->use_test_dc_; - result.use_file_db = parameters->use_file_database_; - result.use_chat_info_db = parameters->use_chat_info_database_; - result.use_message_db = parameters->use_message_database_; - result.use_secret_chats = parameters->use_secret_chats_; - result.enable_storage_optimizer = parameters->enable_storage_optimizer_; - result.ignore_file_names = parameters->ignore_file_names_; + std::pair result; + result.first.api_id_ = parameters->api_id_; + result.first.api_hash_ = std::move(parameters->api_hash_); + result.first.use_secret_chats_ = parameters->use_secret_chats_; + result.first.enable_storage_optimizer_ = parameters->enable_storage_optimizer_; + result.first.ignore_file_names_ = parameters->ignore_file_names_; + + result.second.encryption_key_ = as_db_key(std::move(parameters->database_encryption_key_)); + result.second.database_directory_ = std::move(parameters->database_directory_); + result.second.files_directory_ = std::move(parameters->files_directory_); + result.second.is_test_dc_ = parameters->use_test_dc_; + result.second.use_file_database_ = parameters->use_file_database_; + result.second.use_chat_info_database_ = parameters->use_chat_info_database_; + result.second.use_message_database_ = parameters->use_message_database_; VLOG(td_init) << "Create MtprotoHeader::Options"; options_.api_id = parameters->api_id_; diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 8195c6100..961b241b7 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -14,7 +14,6 @@ #include "td/telegram/td_api.h" #include "td/telegram/TdCallback.h" #include "td/telegram/TdDb.h" -#include "td/telegram/TdParameters.h" #include "td/telegram/telegram_api.h" #include "td/telegram/TermsOfService.h" @@ -1598,9 +1597,19 @@ class Td final : public Actor { static int32 get_database_scheduler_id(); + struct Parameters { + int32 api_id_ = 0; + string api_hash_; + bool use_secret_chats_ = false; + + // TODO move to options and remove + bool enable_storage_optimizer_ = false; + bool ignore_file_names_ = false; + }; + void finish_set_parameters(); - void init(Result r_opened_database); + void init(Parameters parameters, Result r_opened_database); void init_options_and_network(); @@ -1612,7 +1621,8 @@ class Td final : public Actor { void close_impl(bool destroy_flag); - Result set_parameters(td_api::object_ptr parameters) TD_WARN_UNUSED_RESULT; + Result> get_parameters( + td_api::object_ptr parameters) TD_WARN_UNUSED_RESULT; static td_api::object_ptr make_error(int32 code, CSlice error) { return td_api::make_object(code, error.str()); diff --git a/td/telegram/TdDb.cpp b/td/telegram/TdDb.cpp index e53314f65..14a7fc870 100644 --- a/td/telegram/TdDb.cpp +++ b/td/telegram/TdDb.cpp @@ -45,13 +45,13 @@ namespace td { namespace { -std::string get_binlog_path(const TdParameters ¶meters) { - return PSTRING() << parameters.database_directory << "td" << (parameters.use_test_dc ? "_test" : "") << ".binlog"; +std::string get_binlog_path(const TdDb::Parameters ¶meters) { + return PSTRING() << parameters.database_directory_ << "td" << (parameters.is_test_dc_ ? "_test" : "") << ".binlog"; } -std::string get_sqlite_path(const TdParameters ¶meters) { - const string db_name = "db" + (parameters.use_test_dc ? string("_test") : string()); - return parameters.database_directory + db_name + ".sqlite"; +std::string get_sqlite_path(const TdDb::Parameters ¶meters) { + const string db_name = "db" + (parameters.is_test_dc_ ? string("_test") : string()); + return parameters.database_directory_ + db_name + ".sqlite"; } Status init_binlog(Binlog &binlog, string path, BinlogKeyValue &binlog_pmc, BinlogKeyValue &config_pmc, @@ -317,18 +317,18 @@ void TdDb::do_close(Promise<> on_finished, bool destroy_flag) { lock.set_value(Unit()); } -Status TdDb::init_sqlite(const TdParameters ¶meters, const DbKey &key, const DbKey &old_key, +Status TdDb::init_sqlite(const Parameters ¶meters, const DbKey &key, const DbKey &old_key, BinlogKeyValue &binlog_pmc) { - CHECK(!parameters.use_message_db || parameters.use_chat_info_db); - CHECK(!parameters.use_chat_info_db || parameters.use_file_db); + CHECK(!parameters.use_message_database_ || parameters.use_chat_info_database_); + CHECK(!parameters.use_chat_info_database_ || parameters.use_file_database_); const string sql_database_path = get_sqlite_path(parameters); - bool use_sqlite = parameters.use_file_db; - bool use_file_db = parameters.use_file_db; - bool use_dialog_db = parameters.use_message_db; - bool use_message_thread_db = parameters.use_message_db && false; - bool use_message_db = parameters.use_message_db; + bool use_sqlite = parameters.use_file_database_; + bool use_file_database_ = parameters.use_file_database_; + bool use_dialog_db = parameters.use_message_database_; + bool use_message_thread_db = parameters.use_message_database_ && false; + bool use_message_database_ = parameters.use_message_database_; if (!use_sqlite) { SqliteDb::destroy(sql_database_path).ignore(); return Status::OK(); @@ -369,14 +369,14 @@ Status TdDb::init_sqlite(const TdParameters ¶meters, const DbKey &key, const } // init MessageDb - if (use_message_db) { + if (use_message_database_) { TRY_STATUS(init_message_db(db, user_version)); } else { TRY_STATUS(drop_message_db(db, user_version)); } // init filesDb - if (use_file_db) { + if (use_file_database_) { TRY_STATUS(init_file_db(db, user_version)); } else { TRY_STATUS(drop_file_db(db, user_version)); @@ -425,7 +425,7 @@ Status TdDb::init_sqlite(const TdParameters ¶meters, const DbKey &key, const message_thread_db_async_ = create_message_thread_db_async(message_thread_db_sync_safe_); } - if (use_message_db) { + if (use_message_database_) { message_db_sync_safe_ = create_message_db_sync(sql_connection_); message_db_async_ = create_message_db_async(message_db_sync_safe_); } @@ -433,13 +433,14 @@ Status TdDb::init_sqlite(const TdParameters ¶meters, const DbKey &key, const return Status::OK(); } -void TdDb::open(int32 scheduler_id, TdParameters parameters, DbKey key, Promise &&promise) { +void TdDb::open(int32 scheduler_id, Parameters parameters, Promise &&promise) { Scheduler::instance()->run_on_scheduler( - scheduler_id, [parameters = std::move(parameters), key = std::move(key), promise = std::move(promise)]( - Unit) mutable { TdDb::open_impl(std::move(parameters), std::move(key), std::move(promise)); }); + scheduler_id, [parameters = std::move(parameters), promise = std::move(promise)](Unit) mutable { + TdDb::open_impl(std::move(parameters), std::move(promise)); + }); } -void TdDb::open_impl(TdParameters parameters, DbKey key, Promise &&promise) { +void TdDb::open_impl(Parameters parameters, Promise &&promise) { TRY_STATUS_PROMISE(promise, check_parameters(parameters)); OpenedDatabase result; @@ -453,10 +454,10 @@ void TdDb::open_impl(TdParameters parameters, DbKey key, Promise binlog_pmc->external_init_begin(static_cast(LogEvent::HandlerType::BinlogPmcMagic)); config_pmc->external_init_begin(static_cast(LogEvent::HandlerType::ConfigPmcMagic)); - bool encrypt_binlog = !key.is_empty(); + bool encrypt_binlog = !parameters.encryption_key_.is_empty(); VLOG(td_init) << "Start binlog loading"; - TRY_STATUS_PROMISE( - promise, init_binlog(*binlog, get_binlog_path(parameters), *binlog_pmc, *config_pmc, result, std::move(key))); + TRY_STATUS_PROMISE(promise, init_binlog(*binlog, get_binlog_path(parameters), *binlog_pmc, *config_pmc, result, + std::move(parameters.encryption_key_))); VLOG(td_init) << "Finish binlog loading"; binlog_pmc->external_init_finish(binlog); @@ -464,7 +465,7 @@ void TdDb::open_impl(TdParameters parameters, DbKey key, Promise config_pmc->external_init_finish(binlog); VLOG(td_init) << "Finish initialization of config PMC"; - if (parameters.use_file_db && binlog_pmc->get("auth").empty()) { + if (parameters.use_file_database_ && binlog_pmc->get("auth").empty()) { LOG(INFO) << "Destroy SQLite database, because wasn't authorized yet"; SqliteDb::destroy(get_sqlite_path(parameters)).ignore(); } @@ -531,11 +532,14 @@ void TdDb::open_impl(TdParameters parameters, DbKey key, Promise VLOG(td_init) << "Init concurrent_config_pmc"; concurrent_config_pmc->external_init_finish(concurrent_binlog); + LOG(INFO) << "Successfully inited database in directory " << parameters.database_directory_ << " and files directory " + << parameters.files_directory_; + + db->parameters_ = std::move(parameters); db->binlog_pmc_ = std::move(concurrent_binlog_pmc); db->config_pmc_ = std::move(concurrent_config_pmc); db->binlog_ = std::move(concurrent_binlog); - result.parameters = std::move(parameters); result.database = std::move(db); promise.set_value(std::move(result)); @@ -544,18 +548,15 @@ void TdDb::open_impl(TdParameters parameters, DbKey key, Promise TdDb::TdDb() = default; TdDb::~TdDb() = default; -Status TdDb::check_parameters(TdParameters ¶meters) { - if (parameters.database_directory.empty()) { - VLOG(td_init) << "Fix database_directory"; - parameters.database_directory = "."; +Status TdDb::check_parameters(Parameters ¶meters) { + if (parameters.database_directory_.empty()) { + parameters.database_directory_ = "."; } - if (parameters.use_message_db && !parameters.use_chat_info_db) { - VLOG(td_init) << "Fix use_chat_info_db"; - parameters.use_chat_info_db = true; + if (parameters.use_message_database_ && !parameters.use_chat_info_database_) { + parameters.use_chat_info_database_ = true; } - if (parameters.use_chat_info_db && !parameters.use_file_db) { - VLOG(td_init) << "Fix use_file_db"; - parameters.use_file_db = true; + if (parameters.use_chat_info_database_ && !parameters.use_file_database_) { + parameters.use_file_database_ = true; } auto prepare_dir = [](string dir) -> Result { @@ -574,24 +575,24 @@ Status TdDb::check_parameters(TdParameters ¶meters) { return real_dir; }; - auto r_database_directory = prepare_dir(parameters.database_directory); + auto r_database_directory = prepare_dir(parameters.database_directory_); if (r_database_directory.is_error()) { - VLOG(td_init) << "Invalid database_directory"; - return Status::Error(400, PSLICE() << "Can't init database in the directory \"" << parameters.database_directory + VLOG(td_init) << "Invalid database directory"; + return Status::Error(400, PSLICE() << "Can't init database in the directory \"" << parameters.database_directory_ << "\": " << r_database_directory.error()); } - parameters.database_directory = r_database_directory.move_as_ok(); + parameters.database_directory_ = r_database_directory.move_as_ok(); - if (parameters.files_directory.empty()) { - parameters.files_directory = parameters.database_directory; + if (parameters.files_directory_.empty()) { + parameters.files_directory_ = parameters.database_directory_; } else { - auto r_files_directory = prepare_dir(parameters.files_directory); + auto r_files_directory = prepare_dir(parameters.files_directory_); if (r_files_directory.is_error()) { - VLOG(td_init) << "Invalid files_directory"; - return Status::Error(400, PSLICE() << "Can't init files directory \"" << parameters.files_directory + VLOG(td_init) << "Invalid files directory"; + return Status::Error(400, PSLICE() << "Can't init files directory \"" << parameters.files_directory_ << "\": " << r_files_directory.error()); } - parameters.files_directory = r_files_directory.move_as_ok(); + parameters.files_directory_ = r_files_directory.move_as_ok(); } return Status::OK(); @@ -601,7 +602,7 @@ void TdDb::change_key(DbKey key, Promise<> promise) { get_binlog()->change_key(std::move(key), std::move(promise)); } -Status TdDb::destroy(const TdParameters ¶meters) { +Status TdDb::destroy(const Parameters ¶meters) { SqliteDb::destroy(get_sqlite_path(parameters)).ignore(); Binlog::destroy(get_binlog_path(parameters)).ignore(); return Status::OK(); diff --git a/td/telegram/TdDb.h b/td/telegram/TdDb.h index e1f4df5b8..ef0fe5e47 100644 --- a/td/telegram/TdDb.h +++ b/td/telegram/TdDb.h @@ -6,8 +6,6 @@ // #pragma once -#include "td/telegram/TdParameters.h" - #include "td/db/binlog/BinlogEvent.h" #include "td/db/binlog/BinlogInterface.h" #include "td/db/DbKey.h" @@ -50,9 +48,17 @@ class TdDb { TdDb &operator=(TdDb &&) = delete; ~TdDb(); - struct OpenedDatabase { - TdParameters parameters; + 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; @@ -69,9 +75,33 @@ class TdDb { int64 since_last_open = 0; }; - static void open(int32 scheduler_id, TdParameters parameters, DbKey key, Promise &&promise); + static void open(int32 scheduler_id, Parameters parameters, Promise &&promise); - static Status destroy(const TdParameters ¶meters); + 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_chat_info_database() const { + return parameters_.use_chat_info_database_; + } + + bool use_message_database() const { + return parameters_.use_message_database_; + } std::shared_ptr get_file_db_shared(); std::shared_ptr &get_sqlite_connection_safe(); @@ -112,6 +142,8 @@ class TdDb { Result get_stats(); private: + Parameters parameters_; + string sqlite_path_; std::shared_ptr sql_connection_; @@ -133,11 +165,11 @@ class TdDb { std::shared_ptr> config_pmc_; std::shared_ptr binlog_; - static void open_impl(TdParameters parameters, DbKey key, Promise &&promise); + static void open_impl(Parameters parameters, Promise &&promise); - static Status check_parameters(TdParameters ¶meters); + static Status check_parameters(Parameters ¶meters); - Status init_sqlite(const TdParameters ¶meters, const DbKey &key, const DbKey &old_key, + Status init_sqlite(const Parameters ¶meters, const DbKey &key, const DbKey &old_key, BinlogKeyValue &binlog_pmc); void do_close(Promise<> on_finished, bool destroy_flag); diff --git a/td/telegram/TdParameters.h b/td/telegram/TdParameters.h deleted file mode 100644 index 0875adf28..000000000 --- a/td/telegram/TdParameters.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// 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/utils/common.h" - -namespace td { - -struct TdParameters { - string database_directory; - string files_directory; - int32 api_id = 0; - string api_hash; - bool use_test_dc = false; - bool use_file_db = false; - bool use_chat_info_db = false; - bool use_message_db = false; - bool use_secret_chats = false; - - // TODO move to options - bool enable_storage_optimizer = false; - bool ignore_file_names = false; -}; - -} // namespace td