src/YAMLCommand.h
branchv_0
changeset 4 c176766462c5
parent 3 64f8f8792470
child 5 399380ea9750
equal deleted inserted replaced
3:64f8f8792470 4:c176766462c5
   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