DownloadManager: store FileInfo in unique_ptr.
This commit is contained in:
parent
1f300c50e0
commit
3c54e37402
|
@ -83,7 +83,7 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
TRY_STATUS(check_is_active());
|
TRY_STATUS(check_is_active());
|
||||||
|
|
||||||
for (auto &it : files_) {
|
for (auto &it : files_) {
|
||||||
toggle_is_paused(it.second, is_paused);
|
toggle_is_paused(*it.second, is_paused);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
|
@ -121,7 +121,7 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
TRY_STATUS(check_is_active());
|
TRY_STATUS(check_is_active());
|
||||||
vector<FileId> to_remove;
|
vector<FileId> to_remove;
|
||||||
for (auto &it : files_) {
|
for (auto &it : files_) {
|
||||||
FileInfo &file_info = it.second;
|
FileInfo &file_info = *it.second;
|
||||||
if (only_active && !is_active(file_info)) {
|
if (only_active && !is_active(file_info)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -143,22 +143,22 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
|
|
||||||
auto download_id = next_download_id();
|
auto download_id = next_download_id();
|
||||||
|
|
||||||
FileInfo file_info;
|
auto file_info = make_unique<FileInfo>();
|
||||||
file_info.download_id = download_id;
|
file_info->download_id = download_id;
|
||||||
file_info.file_id = file_id;
|
file_info->file_id = file_id;
|
||||||
file_info.internal_file_id = callback_->dup_file_id(file_id);
|
file_info->internal_file_id = callback_->dup_file_id(file_id);
|
||||||
file_info.file_source_id = file_source_id;
|
file_info->file_source_id = file_source_id;
|
||||||
file_info.is_paused = false;
|
file_info->is_paused = false;
|
||||||
file_info.priority = priority;
|
file_info->priority = priority;
|
||||||
file_info.created_at = G()->unix_time();
|
file_info->created_at = G()->unix_time();
|
||||||
file_info.need_save_to_db = true;
|
file_info->need_save_to_db = true;
|
||||||
by_internal_file_id_[file_info.internal_file_id] = download_id;
|
by_internal_file_id_[file_info->internal_file_id] = download_id;
|
||||||
by_file_id_[file_info.file_id] = download_id;
|
by_file_id_[file_info->file_id] = download_id;
|
||||||
hints_.add(download_id, search_by);
|
hints_.add(download_id, search_by);
|
||||||
|
|
||||||
auto it = files_.emplace(download_id, std::move(file_info)).first;
|
auto it = files_.emplace(download_id, std::move(file_info)).first;
|
||||||
register_file_info(it->second);
|
register_file_info(*it->second);
|
||||||
callback_->start_file(it->second.internal_file_id, it->second.priority);
|
callback_->start_file(it->second->internal_file_id, it->second->priority);
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +199,9 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
ids.resize(limit);
|
ids.resize(limit);
|
||||||
}
|
}
|
||||||
auto file_downloads = transform(ids, [&](auto id) {
|
auto file_downloads = transform(ids, [&](auto id) {
|
||||||
FileInfo &file_info = files_[id];
|
auto it = files_.find(id);
|
||||||
|
CHECK(it != files_.end());
|
||||||
|
const FileInfo &file_info = *it->second;
|
||||||
return callback_->get_file_download_object(file_info.file_id, file_info.file_source_id, file_info.created_at,
|
return callback_->get_file_download_object(file_info.file_id, file_info.file_source_id, file_info.created_at,
|
||||||
file_info.completed_at, file_info.is_paused);
|
file_info.completed_at, file_info.is_paused);
|
||||||
});
|
});
|
||||||
|
@ -263,7 +265,7 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
|
|
||||||
FlatHashMap<FileId, int64, FileIdHash> by_file_id_;
|
FlatHashMap<FileId, int64, FileIdHash> by_file_id_;
|
||||||
FlatHashMap<FileId, int64, FileIdHash> by_internal_file_id_;
|
FlatHashMap<FileId, int64, FileIdHash> by_internal_file_id_;
|
||||||
FlatHashMap<int64, FileInfo> files_;
|
FlatHashMap<int64, unique_ptr<FileInfo>> files_;
|
||||||
// size_t active_file_count_{};
|
// size_t active_file_count_{};
|
||||||
Hints hints_;
|
Hints hints_;
|
||||||
|
|
||||||
|
@ -357,25 +359,25 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto download_id = in_db.download_id;
|
auto download_id = in_db.download_id;
|
||||||
FileInfo file_info;
|
auto file_info = make_unique<FileInfo>();
|
||||||
file_info.download_id = download_id;
|
file_info->download_id = download_id;
|
||||||
file_info.file_id = file_search_info.file_id;
|
file_info->file_id = file_search_info.file_id;
|
||||||
file_info.internal_file_id = callback_->dup_file_id(file_info.file_id);
|
file_info->internal_file_id = callback_->dup_file_id(file_info->file_id);
|
||||||
file_info.file_source_id = in_db.file_source_id;
|
file_info->file_source_id = in_db.file_source_id;
|
||||||
file_info.is_paused = in_db.is_paused;
|
file_info->is_paused = in_db.is_paused;
|
||||||
file_info.priority = narrow_cast<int8>(in_db.priority);
|
file_info->priority = narrow_cast<int8>(in_db.priority);
|
||||||
file_info.completed_at = in_db.completed_at;
|
file_info->completed_at = in_db.completed_at;
|
||||||
file_info.created_at = in_db.created_at;
|
file_info->created_at = in_db.created_at;
|
||||||
by_internal_file_id_[file_info.internal_file_id] = download_id;
|
by_internal_file_id_[file_info->internal_file_id] = download_id;
|
||||||
by_file_id_[file_info.file_id] = download_id;
|
by_file_id_[file_info->file_id] = download_id;
|
||||||
hints_.add(download_id, file_search_info.search_text);
|
hints_.add(download_id, file_search_info.search_text);
|
||||||
|
|
||||||
if (file_info.completed_at > 0) {
|
if (file_info->completed_at > 0) {
|
||||||
// file must be removed from the list if it isn't fully downloaded
|
// file must be removed from the list if it isn't fully downloaded
|
||||||
} else {
|
} else {
|
||||||
auto it = files_.emplace(download_id, file_info).first;
|
auto it = files_.emplace(download_id, std::move(file_info)).first;
|
||||||
register_file_info(it->second);
|
register_file_info(*it->second);
|
||||||
callback_->start_file(it->second.internal_file_id, it->second.priority);
|
callback_->start_file(it->second->internal_file_id, it->second->priority);
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -439,10 +441,10 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
if (it == files_.end()) {
|
if (it == files_.end()) {
|
||||||
return Status::Error(400, "Can't find file");
|
return Status::Error(400, "Can't find file");
|
||||||
}
|
}
|
||||||
if (file_source_id.is_valid() && file_source_id != it->second.file_source_id) {
|
if (file_source_id.is_valid() && file_source_id != it->second->file_source_id) {
|
||||||
return Status::Error(400, "Can't find file with such source");
|
return Status::Error(400, "Can't find file with such source");
|
||||||
}
|
}
|
||||||
return &it->second;
|
return it->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void unregister_file_info(const FileInfo &file_info) {
|
void unregister_file_info(const FileInfo &file_info) {
|
||||||
|
@ -473,7 +475,7 @@ class DownloadManagerImpl final : public DownloadManager {
|
||||||
register_file_info(file_info);
|
register_file_info(file_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status check_is_active() {
|
Status check_is_active() const {
|
||||||
if (!callback_) {
|
if (!callback_) {
|
||||||
LOG(ERROR) << "DownloadManager wasn't initialized";
|
LOG(ERROR) << "DownloadManager wasn't initialized";
|
||||||
return Status::Error(500, "DownloadManager isn't initialized");
|
return Status::Error(500, "DownloadManager isn't initialized");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user