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;

}
}
}