file-v-xattr

Created Diff never expires
17 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
66 lines
13 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
62 lines
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;

}
}
}