35 |
35 |
36 #include "Configuration.h" |
36 #include "Configuration.h" |
37 #include "AttributeFinder.h" |
37 #include "AttributeFinder.h" |
38 #include "FileAttributeFinder.h" |
38 #include "FileAttributeFinder.h" |
39 #include "XattrAttributeFinder.h" |
39 #include "XattrAttributeFinder.h" |
40 #include "HashAttributeFinder.h" |
40 #include "ExecAttributeFinder.h" |
41 #include "ScriptAttributeFinder.h" |
|
42 |
41 |
43 namespace relpipe { |
42 namespace relpipe { |
44 namespace in { |
43 namespace in { |
45 namespace filesystem { |
44 namespace filesystem { |
46 |
45 |
50 class FilesystemCommand { |
49 class FilesystemCommand { |
51 private: |
50 private: |
52 std::wstring_convert<codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings. |
51 std::wstring_convert<codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings. |
53 |
52 |
54 FileAttributeFinder fileAttributeFinder; |
53 FileAttributeFinder fileAttributeFinder; |
55 HashAttributeFinder hashAttributeFinder; |
54 ExecAttributeFinder execAttributeFinder; |
56 ScriptAttributeFinder scriptAttributeFinder; |
|
57 XattrAttributeFinder xattrAttributeFinder; |
55 XattrAttributeFinder xattrAttributeFinder; |
58 |
56 |
59 std::map<string_t, AttributeFinder*> attributeFinders{ |
57 std::map<string_t, AttributeFinder*> attributeFinders{ |
60 {RequestedField::GROUP_FILE, &fileAttributeFinder}, |
58 {RequestedField::GROUP_FILE, &fileAttributeFinder}, |
61 {RequestedField::GROUP_HASH, &hashAttributeFinder}, |
59 {RequestedField::GROUP_EXEC, &execAttributeFinder}, |
62 {RequestedField::GROUP_SCRIPT, &scriptAttributeFinder}, |
|
63 {RequestedField::GROUP_XATTR, &xattrAttributeFinder}}; |
60 {RequestedField::GROUP_XATTR, &xattrAttributeFinder}}; |
64 |
61 |
65 void reset(std::stringstream& stream) { |
62 void reset(std::stringstream& stream) { |
66 stream.str(""); |
63 stream.str(""); |
67 stream.clear(); |
64 stream.clear(); |
81 std::shared_ptr<RelationalWriter> writer(Factory::create(output)); |
78 std::shared_ptr<RelationalWriter> writer(Factory::create(output)); |
82 |
79 |
83 std::vector<AttributeMetadata> attributesMetadata; |
80 std::vector<AttributeMetadata> attributesMetadata; |
84 for (RequestedField field : configuration.fields) { |
81 for (RequestedField field : configuration.fields) { |
85 AttributeFinder* finder = attributeFinders[field.group]; |
82 AttributeFinder* finder = attributeFinders[field.group]; |
86 if (finder) for (AttributeMetadata m : finder->toMetadata(field)) attributesMetadata.push_back(m); |
83 if (finder) for (AttributeMetadata m : finder->toMetadata(writer.get(), field)) attributesMetadata.push_back(m); |
87 else throw RelpipeWriterException(L"Unsupported field group: " + field.group); |
84 else throw RelpipeWriterException(L"Unsupported field group: " + field.group); |
88 } |
85 } |
89 |
86 |
90 string_t relationName = configuration.relation.empty() ? L"filesystem" : configuration.relation; |
87 string_t relationName = configuration.relation.empty() ? L"filesystem" : configuration.relation; |
91 writer->startRelation(relationName, attributesMetadata, true); |
88 writer->startRelation(relationName, attributesMetadata, true); |