diff -r 4679f67a8324 -r 7471529c0d11 src/FilesystemCommand.h --- a/src/FilesystemCommand.h Fri Jan 24 16:53:31 2020 +0100 +++ b/src/FilesystemCommand.h Fri Jan 24 21:05:10 2020 +0100 @@ -75,7 +75,7 @@ return configuration->relation.empty() ? L"filesystem" : configuration->relation; } - void writeHeader(RelationalWriter* writer, std::map> attributeFinders, string_t relationName, std::vector* fields) { + void writeHeader(RelationalWriter* writer, std::map> attributeFinders, string_t relationName, std::vector* fields, bool writeHeader = true) { std::vector attributesMetadata; for (RequestedField field : *fields) { std::shared_ptr finder = attributeFinders[field.group]; @@ -83,7 +83,27 @@ else throw RelpipeWriterException(L"Unsupported field group: " + field.group); } - writer->startRelation(relationName, attributesMetadata, true); + writer->startRelation(relationName, attributesMetadata, writeHeader); + } + + void processSingleFile(std::shared_ptr writer, std::stringstream& originalName, std::map>&attributeFinders, Configuration& configuration, string_t relationName) { + fs::path file(originalName.str().empty() ? "." : originalName.str()); // interpret empty string as current directory (e.g. result of: find -printf '%P\0') + bool exists = false; + + try { + exists = fs::exists(file); + } catch (const fs::filesystem_error& e) { + // we probably do not have permissions to given directory → pretend that the file does not exist + } + + for (auto& finder : attributeFinders) finder.second->startFile(file, originalName.str(), exists); + + for (RequestedField field : configuration.fields) { + std::shared_ptr finder = attributeFinders[field.group]; // should not be nullptr, because already checked while writing the relation metadata + finder->writeField(writer.get(), relationName, field); + } + + for (auto& finder : attributeFinders) finder.second->endFile(); } public: