#pragma once
#include <string>
#include <iostream>
#include <vector>
#include <relpipe/protocol/constants.h>
#include "../include/relpipe/reader/typedefs.h"
#include "../include/relpipe/reader/RelationalReader.h"
#include "../include/relpipe/reader/TypeId.h"
#include "../include/relpipe/reader/handlers/RelationalReaderBaseHandler.h"
#include "../include/relpipe/reader/handlers/RelationalReaderStringHandler.h"
#include "../include/relpipe/reader/handlers/RelationalReaderValueHandler.h"
#include "DataTypeReaderBase.h"
#include "types/BooleanDataTypeReader.h"
#include "types/IntegerDataTypeReader.h"
#include "types/StringDataTypeReader.h"
namespace relpipe {
namespace reader {
using namespace relpipe::protocol;
class StreamRelationalReader : public RelationalReader {
private:
std::istream &input;
types::BooleanDataTypeReader booleanReader;
types::IntegerDataTypeReader integerReader;
types::StringDataTypeReader stringReader;
std::vector<DataTypeReaderBase*> readers = {&booleanReader, &integerReader, &stringReader};
std::vector<handlers::RelationalReaderStringHadler*> stringHandlers;
std::vector<handlers::RelationalReaderValueHadler*> valueHandlers;
/**
* 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
*/
std::vector<TypeId> columnTypes;
public:
StreamRelationalReader(std::istream &input) :
input(input) {
}
string_t toTypeCode(const TypeId typeId) override {
for (DataTypeReaderBase* reader : readers) if (reader->supports(typeId)) return reader->getTypeCode();
throw RelpipeReaderException(L"Unsupported data type: " + static_cast<integer_t> (typeId));
}
void addHandler(handlers::RelationalReaderStringHadler* handler) override {
stringHandlers.push_back(handler);
}
void addHandler(handlers::RelationalReaderValueHadler* handler) override {
valueHandlers.push_back(handler);
}
void process() override {
for (int i = 0; i < stringHandlers.size(); i++) {
// FIXME: parse and call methods
stringHandlers[i]->startRelation(L"TODO: table",{
{L"a", TypeId::STRING},
{L"b", TypeId::STRING},
{L"c", TypeId::STRING}
});
}
for (int i = 0; i < valueHandlers.size(); i++) {
// FIXME: parse and call methods
valueHandlers[i]->startRelation(L"TODO: table value",{
{L"av", TypeId::STRING},
{L"bv", TypeId::STRING},
{L"cv", TypeId::STRING}
});
}
// FIXME: parse and call methods
for (int row = 0; row < 3; row++) {
for (int i = 0; i < stringHandlers.size(); i++) stringHandlers[i]->attribute(L"x");
}
}
};
}
}