2010-05-13 16:13:38 +00:00
|
|
|
#include <Poco/SharedPtr.h>
|
|
|
|
|
|
|
|
#include <DB/Columns/ColumnArray.h>
|
|
|
|
#include <DB/Columns/ColumnString.h>
|
|
|
|
#include <DB/Columns/ColumnsNumber.h>
|
2011-08-12 18:27:39 +00:00
|
|
|
#include <DB/Columns/ColumnConst.h>
|
2010-05-13 16:13:38 +00:00
|
|
|
|
|
|
|
#include <DB/DataTypes/DataTypeString.h>
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
#include <DB/IO/ReadHelpers.h>
|
|
|
|
#include <DB/IO/WriteHelpers.h>
|
|
|
|
#include <DB/IO/VarInt.h>
|
|
|
|
|
2011-10-02 08:34:43 +00:00
|
|
|
#define DBMS_APPROX_STRING_SIZE 64
|
|
|
|
|
2010-05-13 16:13:38 +00:00
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
using Poco::SharedPtr;
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::serializeBinary(const Field & field, WriteBuffer & ostr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
|
|
|
const String & s = boost::get<String>(field);
|
|
|
|
writeVarUInt(s.size(), ostr);
|
2010-06-04 18:25:25 +00:00
|
|
|
writeString(s, ostr);
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::deserializeBinary(Field & field, ReadBuffer & istr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
|
|
|
UInt64 size;
|
|
|
|
readVarUInt(size, istr);
|
2011-08-07 02:08:22 +00:00
|
|
|
field = String();
|
2010-05-13 16:13:38 +00:00
|
|
|
String & s = boost::get<String>(field);
|
|
|
|
s.resize(size);
|
|
|
|
/// непереносимо, но (действительно) быстрее
|
2010-06-04 19:06:32 +00:00
|
|
|
istr.readStrict(const_cast<char*>(s.data()), size);
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
void DataTypeString::serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset, size_t limit) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
|
|
|
const ColumnArray & column_array = dynamic_cast<const ColumnArray &>(column);
|
|
|
|
const ColumnUInt8::Container_t & data = dynamic_cast<const ColumnUInt8 &>(column_array.getData()).getData();
|
|
|
|
const ColumnArray::Offsets_t & offsets = column_array.getOffsets();
|
|
|
|
|
2012-12-12 17:16:44 +00:00
|
|
|
size_t array_size = column_array.size();
|
|
|
|
size_t size = column.size();
|
|
|
|
if (!array_size)
|
2010-05-13 16:13:38 +00:00
|
|
|
return;
|
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
size_t end = limit && offset + limit < size
|
|
|
|
? offset + limit
|
|
|
|
: size;
|
2010-05-13 16:13:38 +00:00
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
for (size_t i = offset; i < end; ++i)
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-06-04 19:06:32 +00:00
|
|
|
UInt64 str_size = offsets[i] - offsets[i - 1] - 1;
|
2010-05-13 16:13:38 +00:00
|
|
|
writeVarUInt(str_size, ostr);
|
|
|
|
ostr.write(reinterpret_cast<const char *>(&data[offsets[i - 1]]), str_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
|
|
|
ColumnArray & column_array = dynamic_cast<ColumnArray &>(column);
|
|
|
|
ColumnUInt8::Container_t & data = dynamic_cast<ColumnUInt8 &>(column_array.getData()).getData();
|
|
|
|
ColumnArray::Offsets_t & offsets = column_array.getOffsets();
|
|
|
|
|
2011-10-02 08:34:43 +00:00
|
|
|
data.reserve(limit * DBMS_APPROX_STRING_SIZE);
|
2010-05-13 16:13:38 +00:00
|
|
|
offsets.reserve(limit);
|
|
|
|
|
|
|
|
size_t offset = 0;
|
|
|
|
for (size_t i = 0; i < limit; ++i)
|
|
|
|
{
|
2010-06-04 18:38:56 +00:00
|
|
|
if (istr.eof())
|
|
|
|
break;
|
|
|
|
|
2010-05-13 16:13:38 +00:00
|
|
|
UInt64 size;
|
|
|
|
readVarUInt(size, istr);
|
|
|
|
|
2010-06-07 17:50:50 +00:00
|
|
|
offset += size + 1;
|
2010-05-13 16:13:38 +00:00
|
|
|
offsets.push_back(offset);
|
|
|
|
|
|
|
|
if (data.size() < offset)
|
|
|
|
data.resize(offset);
|
|
|
|
|
2010-06-07 17:50:50 +00:00
|
|
|
istr.readStrict(reinterpret_cast<char*>(&data[offset - size - 1]), sizeof(ColumnUInt8::value_type) * size);
|
2010-06-04 19:06:32 +00:00
|
|
|
data[offset - 1] = 0;
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::serializeText(const Field & field, WriteBuffer & ostr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-06-04 18:25:25 +00:00
|
|
|
writeString(boost::get<const String &>(field), ostr);
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::deserializeText(Field & field, ReadBuffer & istr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-05-21 19:52:50 +00:00
|
|
|
String s;
|
2010-06-04 18:25:25 +00:00
|
|
|
readString(s, istr);
|
2010-05-21 19:52:50 +00:00
|
|
|
field = s;
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::serializeTextEscaped(const Field & field, WriteBuffer & ostr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-06-04 18:25:25 +00:00
|
|
|
writeEscapedString(boost::get<const String &>(field), ostr);
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
void DataTypeString::deserializeTextEscaped(Field & field, ReadBuffer & istr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-05-21 19:52:50 +00:00
|
|
|
String s;
|
2010-06-04 18:25:25 +00:00
|
|
|
readEscapedString(s, istr);
|
2010-05-21 19:52:50 +00:00
|
|
|
field = s;
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-08-26 06:48:39 +00:00
|
|
|
void DataTypeString::serializeTextQuoted(const Field & field, WriteBuffer & ostr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-06-04 18:25:25 +00:00
|
|
|
writeQuotedString(boost::get<const String &>(field), ostr);
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-08-26 06:48:39 +00:00
|
|
|
void DataTypeString::deserializeTextQuoted(Field & field, ReadBuffer & istr) const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
2010-05-21 19:52:50 +00:00
|
|
|
String s;
|
2010-06-04 18:25:25 +00:00
|
|
|
readQuotedString(s, istr);
|
2010-05-21 19:52:50 +00:00
|
|
|
field = s;
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-08-09 19:19:00 +00:00
|
|
|
ColumnPtr DataTypeString::createColumn() const
|
2010-05-13 16:13:38 +00:00
|
|
|
{
|
|
|
|
return new ColumnString;
|
|
|
|
}
|
|
|
|
|
2011-08-12 18:27:39 +00:00
|
|
|
|
|
|
|
ColumnPtr DataTypeString::createConstColumn(size_t size, const Field & field) const
|
|
|
|
{
|
|
|
|
return new ColumnConst<String>(size, boost::get<String>(field));
|
|
|
|
}
|
|
|
|
|
2010-05-13 16:13:38 +00:00
|
|
|
}
|