diff -r 489e52138771 -r c87e9c84f7aa src/StringDataTypeReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/StringDataTypeReader.h Sun Jul 15 00:15:09 2018 +0200 @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "../include/typedefs.h" +#include "../include/DataTypeReader.h" +#include "../include/DataTypeReader.h" +#include "format.h" + +namespace relpipe { +namespace reader { + +/** + * The prototype does not recognize any encoding, + * it just works with c++ strings in encoding default to given platform. + * In the real implementation of relational pipes, there will be DataTypes for particular encodings. + */ +class StringDataTypeReader : public DataTypeReader { +private: + IntegerDataTypeReader integerType; + std::wstring_convert> convertor; // TODO: support also other encodings. +public: + + StringDataTypeReader() : DataTypeReader(DATA_TYPE_ID_STRING, DATA_TYPE_CODE_STRING) { + } + + string_t readValue(std::istream &input) override { + integer_t length = integerType.readValue(input); + // TODO: check maximum length of single field + // if (length > 4000) throw RelpipeException("data too long", EXIT_CODE_DATA_ERROR); + std::vector buf(length); + input.read(buf.data(), length); + if (input.good()) { + return convertor.from_bytes(std::string(buf.data(), length)); + } else { + throw RelpipeReaderException(L"Error while reading string from the stream."); + } + } + + string_t toString(const string_t &value) override { + return value; + } + +}; + +} +} \ No newline at end of file