#pragma once
#include <string>
#include <iostream>
#include <vector>
#include "../include/typedefs.h"
#include "../include/RelationalWriter.h"
#include "DataTypeWriterBase.h"
#include "types/BooleanDataTypeWriter.h"
#include "types/IntegerDataTypeWriter.h"
#include "types/StringDataTypeWriter.h"
namespace relpipe {
namespace writer {
class StreamRelationalWriter : public RelationalWriter {
private:
std::ostream &output;
types::BooleanDataTypeWriter booleanWriter;
types::IntegerDataTypeWriter integerWriter;
types::StringDataTypeWriter stringWriter;
vector<DataTypeWriterBase*> writers = {&booleanWriter, &integerWriter, &stringWriter};
void writeString(const string_t &stringValue, const integer_t typeId) {
for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->writeString(output, stringValue);
throw RelpipeWriterException(L"Unsupported data type: " + typeId);
}
public:
StreamRelationalWriter(std::ostream &output) :
output(output) {
}
integer_t toTypeId(const string_t typeCode) override {
for (DataTypeWriterBase* writer : writers) if (writer->supports(typeCode)) return writer->getTypeId();
throw RelpipeWriterException(L"Unsupported data type: " + typeCode);
}
string_t toTypeCode(const integer_t typeId) override {
for (DataTypeWriterBase* writer : writers) if (writer->supports(typeId)) return writer->getTypeCode();
throw RelpipeWriterException(L"Unsupported data type: " + typeId);
}
void startRelation(std::vector<std::pair<string_t, string_t> > attributes, boolean_t writeHeader) override {
output << "startRelation(…)" << std::endl;
}
void writeRecord(std::vector<string_t> attributes) override {
output << "writeRecord(…)" << std::endl;
}
};
}
}