# HG changeset patch # User František Kučera # Date 1554592231 -7200 # Node ID 891fe13d73979a6d69dfac0949bcd07933d1b207 # Parent 2390e2949a3643bdb2c5b9af875e19a029a54bd7 handler logic structure diff -r 2390e2949a36 -r 891fe13d7397 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 #include #include +#include #include +#include +#include namespace relpipe { namespace in { @@ -44,25 +47,77 @@ class RecfileHandler { private: RelationalWriter* writer; + string_t currentRelationName; + std::vector currentRecord; + std::vector> currentRecords; + size_t prefetchCount = 1; + bool headerWritten = false; + + void writeHeader() { + if (headerWritten) return; + + std::vector attributeMetadata; + + // TODO: writer->startRelation(currentRelationName, attributeMetadata, true); + + headerWritten = true; + } + + void writeRecords() { + for (int i = 0; i < currentRecords.size(); i++) { + std::vector 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);