file-v-xattr

Created Diff never expires
17 删除
总计
删除
单词
总计
删除
要继续使用此功能,请升级到
Diffchecker logo
Diffchecker Pro
66
13 添加
总计
添加
单词
总计
添加
要继续使用此功能,请升级到
Diffchecker logo
Diffchecker Pro
62
QueryData genXattr(QueryContext& context) {
QueryData genFileImpl(QueryContext& context, Logger& logger) {
QueryData results;
QueryData results;

// Resolve file paths for EQUALS and LIKE operations.
// Resolve file paths for EQUALS and LIKE operations.
auto paths = context.constraints["path"].getAll(EQUALS);
auto paths = context.constraints["path"].getAll(EQUALS);
context.expandConstraints(
context.expandConstraints(
"path",
"path",
LIKE,
LIKE,
paths,
paths,
([&](const std::string& pattern, std::set<std::string>& out) {
([&](const std::string& pattern, std::set<std::string>& out) {
std::vector<std::string> patterns;
std::vector<std::string> patterns;
auto status =
auto status =
resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON);
resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON);
if (status.ok()) {
if (status.ok()) {
for (const auto& resolved : patterns) {
for (const auto& resolved : patterns) {
out.insert(resolved);
out.insert(resolved);
}
}
}
}
return status;
return status;
}));
}));


// Iterate through each of the resolved/supplied paths.
for (const auto& path_string : paths) {
for (const auto& path_string : paths) {
boost::filesystem::path path = path_string;
fs::path path = path_string;
boost::system::error_code ec;
genFileInfo(path, path.parent_path(), "", results);
// Folders can have extended attributes too
if (!(boost::filesystem::is_regular_file(path, ec) ||
boost::filesystem::is_directory(path, ec))) {
continue;
}
getFileData(results, path.string());
}
}


// Resolve directories for EQUALS and LIKE operations.
// Resolve directories for EQUALS and LIKE operations.
auto directories = context.constraints["directory"].getAll(EQUALS);
auto directories = context.constraints["directory"].getAll(EQUALS);
context.expandConstraints(
context.expandConstraints(
"directory",
"directory",
LIKE,
LIKE,
directories,
directories,
([&](const std::string& pattern, std::set<std::string>& out) {
([&](const std::string& pattern, std::set<std::string>& out) {
std::vector<std::string> patterns;
std::vector<std::string> patterns;
auto status =
auto status =
resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON);
resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON);
if (status.ok()) {
if (status.ok()) {
for (const auto& resolved : patterns) {
for (const auto& resolved : patterns) {
out.insert(resolved);
out.insert(resolved);
}
}
}
}
return status;
return status;
}));
}));


// Now loop through constraints using the directory column constraint.
// Now loop through constraints using the directory column constraint.
for (const auto& directory_string : directories) {
for (const auto& directory_string : directories) {
if (!isReadable(directory_string) || !isDirectory(directory_string)) {
if (!isReadable(directory_string) || !isDirectory(directory_string)) {
continue;
continue;
}
}


std::vector<std::string> files;
try {
if (listFilesInDirectory(directory_string, files).ok()) {
// Iterate over the directory and generate info for each regular file.
for (const auto& file : files) {
fs::directory_iterator begin(directory_string), end;
getFileData(results, file);
for (; begin != end; ++begin) {
genFileInfo(begin->path(), directory_string, "", results);
}
}
} catch (const fs::filesystem_error& /* e */) {
continue;
}
}
}
}
return results;

}
}
}