113 return result == 1 && event.type != yaml_event_type_e::YAML_NO_EVENT ? new YAMLEvent(event) : nullptr; // 1 = OK in yaml.h; YAML_NO_EVENT = end |
113 return result == 1 && event.type != yaml_event_type_e::YAML_NO_EVENT ? new YAMLEvent(event) : nullptr; // 1 = OK in yaml.h; YAML_NO_EVENT = end |
114 } |
114 } |
115 }; |
115 }; |
116 |
116 |
117 using YAMLEvent_p = std::shared_ptr<YAMLEvent>; |
117 using YAMLEvent_p = std::shared_ptr<YAMLEvent>; |
118 |
118 |
119 YAMLParser parser; |
119 YAMLParser parser; |
120 std::shared_ptr<relpipe::writer::RelationalWriter> writer; |
120 std::shared_ptr<relpipe::writer::RelationalWriter> writer; |
121 |
121 |
122 relpipe::writer::string_t relationName; |
122 relpipe::writer::string_t relationName; |
123 std::vector<relpipe::writer::string_t> record; |
123 std::vector<relpipe::writer::string_t> record; |
143 YAMLEvent_p event = YAMLEvent_p(parser.next()); |
143 YAMLEvent_p event = YAMLEvent_p(parser.next()); |
144 if (event && event->getType() == YAML_SCALAR_EVENT) return fetchScalarValue(event); |
144 if (event && event->getType() == YAML_SCALAR_EVENT) return fetchScalarValue(event); |
145 else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected SCALAR, but got: " + event->getTypeName()); |
145 else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected SCALAR, but got: " + event->getTypeName()); |
146 } |
146 } |
147 |
147 |
|
148 bool until(const yaml_event_type_t until, YAMLEvent_p& event) { |
|
149 event = YAMLEvent_p(parser.next()); |
|
150 return event && event->getType() != until; |
|
151 } |
|
152 |
148 void processRelation() { |
153 void processRelation() { |
149 YAMLEvent_p event = YAMLEvent_p(parser.next()); |
154 YAMLEvent_p event = YAMLEvent_p(parser.next()); |
150 if (event->getType() == YAML_MAPPING_START_EVENT) processRelationWithMetadata(); |
155 if (event->getType() == YAML_MAPPING_START_EVENT) processRelationWithMetadata(); |
151 else if (event->getType() == YAML_SEQUENCE_START_EVENT)processRelationWithoutMetadata(); |
156 else if (event->getType() == YAML_SEQUENCE_START_EVENT)processRelationWithoutMetadata(); |
152 else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING or SEQUENCE, but got: " + event->getTypeName()); |
157 else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING or SEQUENCE, but got: " + event->getTypeName()); |
154 |
159 |
155 void processRelationWithMetadata() { |
160 void processRelationWithMetadata() { |
156 consumeEvent(YAML_SCALAR_EVENT, L"attribute-metadata"); |
161 consumeEvent(YAML_SCALAR_EVENT, L"attribute-metadata"); |
157 consumeEvent(YAML_SEQUENCE_START_EVENT); |
162 consumeEvent(YAML_SEQUENCE_START_EVENT); |
158 |
163 |
159 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) { |
164 for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) { |
160 if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (attribute-metadata), but got: " + event->getTypeName()); |
165 if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (attribute-metadata), but got: " + event->getTypeName()); |
161 relpipe::writer::string_t name; |
166 relpipe::writer::string_t name; |
162 relpipe::writer::string_t type = L"string"; |
167 relpipe::writer::string_t type = L"string"; |
163 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) { |
168 for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) { |
164 auto key = fetchScalarValue(event); |
169 auto key = fetchScalarValue(event); |
165 auto value = consumeScalarEvent(); |
170 auto value = consumeScalarEvent(); |
166 if (key == L"name") name = value; |
171 if (key == L"name") name = value; |
167 else if (key == L"type") type = value; |
172 else if (key == L"type") type = value; |
168 else; // unsupported metadata, later there might be something useful |
173 else; // unsupported metadata, later there might be something useful |
186 |
191 |
187 void processRelationWithoutMetadata() { |
192 void processRelationWithoutMetadata() { |
188 // First record: |
193 // First record: |
189 consumeEvent(YAML_MAPPING_START_EVENT); |
194 consumeEvent(YAML_MAPPING_START_EVENT); |
190 record.clear(); |
195 record.clear(); |
191 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) { |
196 for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) { |
192 auto name = fetchScalarValue(event); |
197 auto name = fetchScalarValue(event); |
193 auto value = consumeScalarEvent(); |
198 auto value = consumeScalarEvent(); |
194 attributesMetadata.push_back({name, relpipe::writer::TypeId::STRING}); |
199 attributesMetadata.push_back({name, relpipe::writer::TypeId::STRING}); |
195 record.push_back(value); |
200 record.push_back(value); |
196 } |
201 } |
200 // Following records: |
205 // Following records: |
201 processRecords(); |
206 processRecords(); |
202 } |
207 } |
203 |
208 |
204 void processRecords() { |
209 void processRecords() { |
205 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) { |
210 for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) { |
206 if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (record), but got: " + event->getTypeName()); |
211 if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (record), but got: " + event->getTypeName()); |
207 record.clear(); |
212 record.clear(); |
208 record.resize(attributesMetadata.size()); |
213 record.resize(attributesMetadata.size()); |
209 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) { |
214 for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) { |
210 auto name = fetchScalarValue(event); |
215 auto name = fetchScalarValue(event); |
211 auto value = consumeScalarEvent(); |
216 auto value = consumeScalarEvent(); |
212 for (int i = 0; i < attributesMetadata.size(); i++) { |
217 for (int i = 0; i < attributesMetadata.size(); i++) { |
213 if (name == attributesMetadata[i].attributeName) { |
218 if (name == attributesMetadata[i].attributeName) { |
214 record[i] = value; |
219 record[i] = value; |
235 |
240 |
236 consumeEvent(YAML_STREAM_START_EVENT); |
241 consumeEvent(YAML_STREAM_START_EVENT); |
237 consumeEvent(YAML_DOCUMENT_START_EVENT); |
242 consumeEvent(YAML_DOCUMENT_START_EVENT); |
238 consumeEvent(YAML_MAPPING_START_EVENT); |
243 consumeEvent(YAML_MAPPING_START_EVENT); |
239 |
244 |
240 for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) { |
245 for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) { |
241 relationName = fetchScalarValue(event); |
246 relationName = fetchScalarValue(event); |
242 attributesMetadata.clear(); |
247 attributesMetadata.clear(); |
243 processRelation(); |
248 processRelation(); |
244 } |
249 } |
245 |
250 |