handler logic structure v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 07 Apr 2019 01:10:31 +0200
branchv_0
changeset 3 891fe13d7397
parent 2 2390e2949a36
child 4 b5239b4b345b
handler logic structure
src/RecfileCommand.h
--- a/src/RecfileCommand.h	Sat Apr 06 18:25:14 2019 +0200
+++ b/src/RecfileCommand.h	Sun Apr 07 01:10:31 2019 +0200
@@ -21,8 +21,11 @@
 #include <string>
 #include <sstream>
 #include <vector>
+#include <set>
 
 #include <relpipe/writer/typedefs.h>
+#include <relpipe/writer/RelationalWriter.h>
+#include <relpipe/writer/AttributeMetadata.h>
 
 namespace relpipe {
 namespace in {
@@ -44,25 +47,77 @@
 	class RecfileHandler {
 	private:
 		RelationalWriter* writer;
+		string_t currentRelationName;
+		std::vector<string_t> currentRecord;
+		std::vector<std::vector<string_t>> currentRecords;
+		size_t prefetchCount = 1;
+		bool headerWritten = false;
+
+		void writeHeader() {
+			if (headerWritten) return;
+
+			std::vector<AttributeMetadata> attributeMetadata;
+
+			// TODO: writer->startRelation(currentRelationName, attributeMetadata, true);
+
+			headerWritten = true;
+		}
+
+		void writeRecords() {
+			for (int i = 0; i < currentRecords.size(); i++) {
+				std::vector<string_t> record = currentRecords[i];
+				std::wcerr << L"record: " << std::endl;
+				for (int j = 0; j < record.size(); j += 2) {
+					std::wcerr << L"  '" << record[j] << L"': '" << record[j + 1] << L"'" << std::endl;
+					// TODO: writer->writeAttribute()
+				}
+			}
+			currentRecords.clear();
+		}
 
 		void metadata(const string_t& name, const string_t& value) {
 			std::wcerr << L"metadata(" << name << L", " << value << L");" << std::endl; // TODO: remove debug
+
+			if (name == L"rec") {
+				currentRelationName = value;
+				currentRecord.clear();
+				currentRecords.clear();
+				headerWritten = false;
+			} else if (name == L"type") {
+				// TODO: save type hint
+			} else {
+				// ignore – other recfile metadata like keys or auto-increments
+			}
 		}
 
 		void data(const string_t& name, const string_t& value) {
 			std::wcerr << L"data(" << name << L", " << value << L");" << std::endl; // TODO: remove debug
+			currentRecord.push_back(name);
+			currentRecord.push_back(value);
 		}
 
 		void comment(const string_t& value) {
-			std::wcerr << L"comment(" << value << L");" << std::endl; // TODO: remove debug
+			// ignore comments
 		}
 
 		void separator() {
 			std::wcerr << L"separator()" << std::endl; // TODO: remove debug
+			if (currentRecord.size()) {
+				currentRecords.push_back(currentRecord);
+				currentRecord.clear();
+			}
+
+			if (prefetchCount > 0 && currentRecords.size() >= prefetchCount) {
+				writeHeader();
+				writeRecords();
+			}
 		}
 
 		void end() {
-			std::wcerr << L"end()" << std::endl; // TODO: remove debug
+			std::wcerr << L"end();" << std::endl; // TODO: remove debug
+			if (currentRecord.size()) currentRecords.push_back(currentRecord);
+			writeHeader();
+			writeRecords();
 		}
 
 	public:
@@ -74,8 +129,6 @@
 		}
 
 		void logicalLine(RecfileLineType type, const string_t& name = L"", const string_t& value = L"") {
-			// TODO: writer->startRelation()
-			// TODO: writer->writeAttribute()
 			switch (type) {
 				case RecfileLineType::METADATA: return metadata(name, value);
 				case RecfileLineType::DATA: return data(name, value);