diff -r 8fd6c4d44071 -r 3613617d3076 src/StreamRelationalWriter.h --- a/src/StreamRelationalWriter.h Sun Jul 22 10:26:22 2018 +0200 +++ b/src/StreamRelationalWriter.h Sun Jul 22 17:19:25 2018 +0200 @@ -28,6 +28,10 @@ * count of columns in the current table */ integer_t columnCount; + /** + * number of column (0 = first) that will be written; after writing, the number is increased and prepared for next one + */ + integer_t currentColumn; /** * types of columns in the current table @@ -36,7 +40,12 @@ void writeString(const string_t &stringValue, const TypeId typeId) { for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->writeString(output, stringValue); - throw RelpipeWriterException(L"Unsupported data type: " + static_cast(typeId)); + throw RelpipeWriterException(L"Unsupported data type: " + static_cast (typeId)); + } + + void writeRaw(const void* value, const type_info& typeInfo, const TypeId typeId) { + for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->writeRaw(output, value, typeInfo); + throw RelpipeWriterException(L"Unsupported data type: " + static_cast (typeId)); } public: @@ -52,12 +61,13 @@ string_t toTypeCode(const TypeId typeId) override { for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->getTypeCode(); - throw RelpipeWriterException(L"Unsupported data type: " + static_cast(typeId)); + throw RelpipeWriterException(L"Unsupported data type: " + static_cast (typeId)); } - + void startRelation(string_t name, std::vector > attributes, boolean_t writeHeader) override { string_t tableName = name; columnCount = attributes.size(); + currentColumn = 0; // Write table name and column count: integerWriter.writeValue(output, DATA_PART_START); @@ -76,7 +86,7 @@ // Write column types: for (size_t c = 0; c < columnCount; c++) { TypeId typeId = attributes[c].second; - integerWriter.writeValue(output, static_cast(typeId)); + integerWriter.writeValue(output, static_cast (typeId)); columnTypes[c] = typeId; } @@ -84,8 +94,9 @@ void writeRecord(std::vector attributes) override { // FIXME: check vector size + // FIXME: check currentColumn == 0 for (size_t c = 0; c < columnCount; c++) { - // TODO: support multiple rows in a single method call? + // TODO: do not support multiple rows in a single method call if (c % columnCount == 0) { integerWriter.writeValue(output, DATA_PART_ROW); } @@ -96,6 +107,12 @@ } } + void writeAttribute(const void* value, const std::type_info& type) override { + if (currentColumn == 0) integerWriter.writeValue(output, DATA_PART_ROW); + writeRaw(value, type, columnTypes[currentColumn]); + if (++currentColumn == columnCount) currentColumn = 0; + } + }; }