code for table generation ported from the prototype: RelationalGenerator.h v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 21 Jul 2018 23:01:47 +0200
branchv_0
changeset 12 640e88aedf8f
parent 11 27bc67e7c80f
child 13 e7234dd45166
code for table generation ported from the prototype: RelationalGenerator.h
src/StreamRelationalWriter.h
--- a/src/StreamRelationalWriter.h	Sat Jul 21 22:37:25 2018 +0200
+++ b/src/StreamRelationalWriter.h	Sat Jul 21 23:01:47 2018 +0200
@@ -6,6 +6,7 @@
 
 #include "../include/typedefs.h"
 #include "../include/RelationalWriter.h"
+#include "format.h"
 #include "DataTypeWriterBase.h"
 #include "types/BooleanDataTypeWriter.h"
 #include "types/IntegerDataTypeWriter.h"
@@ -21,6 +22,16 @@
 	types::IntegerDataTypeWriter integerWriter;
 	types::StringDataTypeWriter stringWriter;
 	vector<DataTypeWriterBase*> writers = {&booleanWriter, &integerWriter, &stringWriter};
+	
+	/**
+	 * count of columns in the current table
+	 */
+	integer_t columnCount;
+	
+	/**
+	 * types of columns in the current table
+	 */
+	vector<integer_t> columnTypes;
 
 	void writeString(const string_t &stringValue, const integer_t typeId) {
 		for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->writeString(output, stringValue);
@@ -44,11 +55,45 @@
 	}
 
 	void startRelation(string_t name, std::vector<std::pair<string_t, string_t> > attributes, boolean_t writeHeader) override {
-		output << "startRelation(…)" << std::endl;
+		string_t tableName = name;
+		columnCount = attributes.size();
+
+		// Write table name and column count:
+		integerWriter.writeValue(output, DATA_PART_START);
+		stringWriter.writeValue(output, tableName);
+		integerWriter.writeValue(output, columnCount);
+
+		columnTypes.clear();
+		columnTypes.resize(columnCount);
+
+		// Write column names:
+		for (size_t c = 0; c < columnCount; c++) {
+			wstring columnName = attributes[c].first;
+			stringWriter.writeValue(output, columnName);
+		}
+
+		// Write column types:
+		for (size_t c = 0; c < columnCount; c++) {
+			wstring typeCode = attributes[c].second;
+			integer_t typeId = toTypeId(typeCode);
+			integerWriter.writeValue(output, typeId);
+			columnTypes[c] = typeId;
+		}
+
 	}
 
 	void writeRecord(std::vector<string_t> attributes) override {
-		output << "writeRecord(…)" << std::endl;
+		// FIXME: check vector size
+		for (size_t c = 0; c < columnCount; c++) {
+			// TODO: support multiple rows in a single method call?
+			if (c % columnCount == 0) {
+				integerWriter.writeValue(output, DATA_PART_ROW);
+			}
+
+			wstring stringValue = attributes[c];
+			integer_t typeId = columnTypes[c % columnCount];
+			writeString(stringValue, typeId);
+		}
 	}
 
 };