QueryData genFile(QueryContext& context) { QueryData results; // Resolve file paths for EQUALS and LIKE operations. auto paths = context.constraints["path"].getAll(EQUALS); context.expandConstraints( "path", LIKE, paths, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); // Iterate through each of the resolved/supplied paths. for (const auto& path_string : paths) { fs::path path = path_string; genFileInfo(path, path.parent_path(), "", results); } // Resolve directories for EQUALS and LIKE operations. auto directories = context.constraints["directory"].getAll(EQUALS); context.expandConstraints( "directory", LIKE, directories, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); // Now loop through constraints using the directory column constraint. for (const auto& directory_string : directories) { if (!isReadable(directory_string) || !isDirectory(directory_string)) { continue; } try { // Iterate over the directory and generate info for each regular file. fs::directory_iterator begin(directory_string), end; for (; begin != end; ++begin) { genFileInfo(begin->path(), directory_string, "", results); } } catch (const fs::filesystem_error& e) { continue; } } return results; }
QueryData genFile(QueryContext& context) { QueryData results; auto paths = context.constraints["path"].getAll(EQUALS); for (const auto& path_string : paths) { fs::path path = path_string; genFileInfo(path_string, path.filename().string(), path.parent_path().string(), "", results); } // Now loop through constraints using the directory column constraint. auto directories = context.constraints["directory"].getAll(EQUALS); for (const auto& directory_string : directories) { if (!isReadable(directory_string) || !isDirectory(directory_string)) { continue; } try { // Iterate over the directory and generate info for each regular file. fs::directory_iterator begin(directory_string), end; for (; begin != end; ++begin) { genFileInfo(begin->path().string(), begin->path().filename().string(), directory_string, "", results); } } catch (const fs::filesystem_error& e) { continue; } } // Now loop through constraints using the pattern column constraint. auto patterns = context.constraints["pattern"].getAll(EQUALS); if (patterns.size() != 1) { return results; } for (const auto& pattern : patterns) { std::vector<std::string> expanded_patterns; auto status = resolveFilePattern(pattern, expanded_patterns); if (!status.ok()) { VLOG(1) << "Could not expand pattern properly: " << status.toString(); return results; } for (const auto& resolved : expanded_patterns) { fs::path path = resolved; genFileInfo(resolved, path.filename().string(), path.parent_path().string(), pattern, results); } } return results; }