Open language database.
GitOrigin-RevId: 9765471da4bae835d7159ca90aa99106a251b654
This commit is contained in:
parent
92c04286e3
commit
e8f4c31586
@ -12,14 +12,36 @@
|
|||||||
#include "td/telegram/net/NetQueryDispatcher.h"
|
#include "td/telegram/net/NetQueryDispatcher.h"
|
||||||
#include "td/telegram/Td.h"
|
#include "td/telegram/Td.h"
|
||||||
|
|
||||||
#include "td/utils/logging.h"
|
|
||||||
#include "td/utils/Status.h"
|
|
||||||
|
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
|
|
||||||
|
#include "td/db/SqliteKeyValue.h"
|
||||||
|
|
||||||
|
#include "td/utils/logging.h"
|
||||||
|
#include "td/utils/Status.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
|
struct LanguagePackManager::LanguageDatabase {
|
||||||
|
std::mutex mutex_;
|
||||||
|
string path_;
|
||||||
|
SqliteKeyValue kv_;
|
||||||
|
std::unordered_map<string, std::unique_ptr<LanguagePack>> language_packs_;
|
||||||
|
};
|
||||||
|
|
||||||
|
LanguagePackManager::~LanguagePackManager() = default;
|
||||||
|
|
||||||
|
static Result<SqliteKeyValue> open_database(const string &path) {
|
||||||
|
TRY_RESULT(db, SqliteDb::open_with_key(path, DbKey::empty()));
|
||||||
|
TRY_STATUS(db.exec("PRAGMA synchronous=NORMAL"));
|
||||||
|
TRY_STATUS(db.exec("PRAGMA temp_store=MEMORY"));
|
||||||
|
TRY_STATUS(db.exec("PRAGMA encoding=\"UTF-8\""));
|
||||||
|
TRY_STATUS(db.exec("PRAGMA journal_mode=WAL"));
|
||||||
|
SqliteKeyValue kv;
|
||||||
|
TRY_STATUS(kv.init_with_connection(std::move(db), "lang"));
|
||||||
|
return std::move(kv);
|
||||||
|
}
|
||||||
|
|
||||||
void LanguagePackManager::start_up() {
|
void LanguagePackManager::start_up() {
|
||||||
std::lock_guard<std::mutex> lock(language_database_mutex_);
|
std::lock_guard<std::mutex> lock(language_database_mutex_);
|
||||||
manager_count_++;
|
manager_count_++;
|
||||||
@ -28,11 +50,23 @@ void LanguagePackManager::start_up() {
|
|||||||
|
|
||||||
string database_path = G()->shared_config().get_option_string("language_database_path");
|
string database_path = G()->shared_config().get_option_string("language_database_path");
|
||||||
auto it = language_databases_.find(database_path);
|
auto it = language_databases_.find(database_path);
|
||||||
|
if (it == language_databases_.end()) {
|
||||||
|
SqliteKeyValue kv;
|
||||||
|
if (!database_path.empty()) {
|
||||||
|
auto r_kv = open_database(database_path);
|
||||||
|
if (r_kv.is_error()) {
|
||||||
|
LOG(ERROR) << "Can't open language database " << database_path << ": " << r_kv.error();
|
||||||
|
database_path = string();
|
||||||
|
it = language_databases_.find(database_path);
|
||||||
|
} else {
|
||||||
|
kv = r_kv.move_as_ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (it == language_databases_.end()) {
|
if (it == language_databases_.end()) {
|
||||||
it = language_databases_.emplace(database_path, make_unique<LanguageDatabase>()).first;
|
it = language_databases_.emplace(database_path, make_unique<LanguageDatabase>()).first;
|
||||||
it->second->path_ = std::move(database_path);
|
it->second->path_ = std::move(database_path);
|
||||||
|
}
|
||||||
// TODO open database
|
|
||||||
}
|
}
|
||||||
database_ = it->second.get();
|
database_ = it->second.get();
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "td/actor/PromiseFuture.h"
|
#include "td/actor/PromiseFuture.h"
|
||||||
|
|
||||||
#include "td/utils/Container.h"
|
#include "td/utils/Container.h"
|
||||||
|
#include "td/utils/Status.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@ -28,6 +29,11 @@ class LanguagePackManager : public NetQueryCallback {
|
|||||||
public:
|
public:
|
||||||
explicit LanguagePackManager(ActorShared<> parent) : parent_(std::move(parent)) {
|
explicit LanguagePackManager(ActorShared<> parent) : parent_(std::move(parent)) {
|
||||||
}
|
}
|
||||||
|
LanguagePackManager(const LanguagePackManager &) = delete;
|
||||||
|
LanguagePackManager &operator=(const LanguagePackManager &) = delete;
|
||||||
|
LanguagePackManager(LanguagePackManager &&) = delete;
|
||||||
|
LanguagePackManager &operator=(LanguagePackManager &&) = delete;
|
||||||
|
~LanguagePackManager() override;
|
||||||
|
|
||||||
void on_language_pack_changed();
|
void on_language_pack_changed();
|
||||||
|
|
||||||
@ -66,11 +72,7 @@ class LanguagePackManager : public NetQueryCallback {
|
|||||||
std::unordered_map<string, std::unique_ptr<Language>> languages_;
|
std::unordered_map<string, std::unique_ptr<Language>> languages_;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LanguageDatabase {
|
struct LanguageDatabase;
|
||||||
std::mutex mutex_;
|
|
||||||
string path_;
|
|
||||||
std::unordered_map<string, std::unique_ptr<LanguagePack>> language_packs_;
|
|
||||||
};
|
|
||||||
|
|
||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
|
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
#include "td/utils/Random.h"
|
#include "td/utils/Random.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
std::string get_binlog_path(const TdParameters ¶meters) {
|
std::string get_binlog_path(const TdParameters ¶meters) {
|
||||||
return PSTRING() << parameters.database_directory << "td" << (parameters.use_test_dc ? "_test" : "") << ".binlog";
|
return PSTRING() << parameters.database_directory << "td" << (parameters.use_test_dc ? "_test" : "") << ".binlog";
|
||||||
}
|
}
|
||||||
@ -434,4 +436,5 @@ void TdDb::with_db_path(std::function<void(CSlice)> callback) {
|
|||||||
SqliteDb::with_db_path(sqlite_path(), callback);
|
SqliteDb::with_db_path(sqlite_path(), callback);
|
||||||
callback(binlog_path());
|
callback(binlog_path());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -184,6 +184,9 @@ class SqliteKeyValue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool empty() const {
|
||||||
|
return db_.empty();
|
||||||
|
}
|
||||||
void clear() {
|
void clear() {
|
||||||
*this = SqliteKeyValue();
|
*this = SqliteKeyValue();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user