FileManager: add #mtime#<mtime># prefix to generate conversion

GitOrigin-RevId: 4253d68e4f7878d871f53e0bbcf77633258cc946
This commit is contained in:
Arseny Smirnov 2018-10-30 17:25:31 +03:00
parent bc88b8e951
commit f788c1e917
3 changed files with 42 additions and 2 deletions

View File

@ -20,6 +20,7 @@
#include "td/utils/common.h"
#include "td/utils/logging.h"
#include "td/utils/misc.h"
#include "td/utils/Parser.h"
#include "td/utils/port/path.h"
#include "td/utils/Slice.h"
@ -342,9 +343,39 @@ FileGenerateManager::Query::~Query() = default;
FileGenerateManager::Query::Query(Query &&other) = default;
FileGenerateManager::Query &FileGenerateManager::Query::operator=(Query &&other) = default;
void FileGenerateManager::generate_file(uint64 query_id, const FullGenerateFileLocation &generate_location,
Status check_mtime(std::string &conversion, CSlice original_path) {
if (original_path.empty()) {
return Status::OK();
}
Parser parser(conversion);
if (!parser.skip_start_with("#mtime#")) {
return td::Status::OK();
}
auto mtime_str = parser.read_till('#');
parser.skip('#');
auto r_mtime = to_integer_safe<uint64>(mtime_str);
if (parser.status().is_error() || r_mtime.is_error()) {
return td::Status::OK();
}
auto expected_mtime = r_mtime.move_as_ok();
conversion = parser.read_all().str();
auto r_stat = stat(original_path);
uint64 actual_mtime = r_stat.is_ok() ? r_stat.ok().mtime_nsec_ : 0;
if (expected_mtime == actual_mtime) {
return td::Status::OK();
}
return td::Status::Error(PSLICE() << "mtime changed " << tag("file", original_path)
<< tag("expected mtime", expected_mtime) << tag("actual mtime", actual_mtime));
}
void FileGenerateManager::generate_file(uint64 query_id, FullGenerateFileLocation generate_location,
const LocalFileLocation &local_location, string name,
unique_ptr<FileGenerateCallback> callback) {
auto mtime_status = check_mtime(generate_location.conversion_, generate_location.original_path_);
if (mtime_status.is_error()) {
return callback->on_error(std::move(mtime_status));
}
CHECK(query_id != 0);
auto it_flag = query_id_to_query_.insert(std::make_pair(query_id, Query{}));
CHECK(it_flag.second) << "Query id must be unique";

View File

@ -35,7 +35,7 @@ class FileGenerateManager : public Actor {
explicit FileGenerateManager(ActorShared<> parent) : parent_(std::move(parent)) {
}
void generate_file(uint64 query_id, const FullGenerateFileLocation &generate_location,
void generate_file(uint64 query_id, FullGenerateFileLocation generate_location,
const LocalFileLocation &local_location, string name, unique_ptr<FileGenerateCallback> callback);
void cancel(uint64 query_id);

View File

@ -697,6 +697,15 @@ FileId FileManager::register_url(string url, FileType file_type, FileLocationSou
Result<FileId> FileManager::register_generate(FileType file_type, FileLocationSource file_location_source,
string original_path, string conversion, DialogId owner_dialog_id,
int64 expected_size) {
// add #mtime# into conversion
if (!original_path.empty() && !begins_with(conversion, "#mtime#") && !begins_with(conversion, "#file_id#") &&
!begins_with(conversion, "#map#")) {
auto r_stat = stat(original_path);
uint64 mtime = r_stat.is_ok() ? r_stat.ok().mtime_nsec_ : 0;
auto new_conversion = PSTRING() << "#mtime#" << mtime << "#" << conversion;
conversion = std::move(new_conversion);
}
FileData data;
data.generate_ =
td::make_unique<FullGenerateFileLocation>(file_type, std::move(original_path), std::move(conversion));