ClickHouse/dbms/src/DataTypes/DataTypeString.cpp

155 lines
3.5 KiB
C++
Raw Normal View History

2010-05-13 16:13:38 +00:00
#include <Poco/SharedPtr.h>
#include <DB/Core/Defines.h>
2010-05-13 16:13:38 +00:00
#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>
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 = get<const String &>(field);
2010-05-13 16:13:38 +00:00
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();
String & s = get<String &>(field);
2010-05-13 16:13:38 +00:00
s.resize(size);
/// непереносимо, но (действительно) быстрее
istr.readStrict(&s[0], size);
2010-05-13 16:13:38 +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 ColumnString & column_string = dynamic_cast<const ColumnString &>(column);
const ColumnString::Chars_t & data = column_string.getChars();
const ColumnString::Offsets_t & offsets = column_string.getOffsets();
2010-05-13 16:13:38 +00:00
2012-12-12 17:16:44 +00:00
size_t size = column.size();
if (!size)
2010-05-13 16:13:38 +00:00
return;
size_t end = limit && offset + limit < size
? offset + limit
: size;
2012-12-12 17:46:23 +00:00
if (offset == 0)
{
UInt64 str_size = offsets[0] - 1;
writeVarUInt(str_size, ostr);
ostr.write(reinterpret_cast<const char *>(&data[0]), str_size);
++offset;
}
2010-05-13 16:13:38 +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
{
ColumnString & column_string = dynamic_cast<ColumnString &>(column);
ColumnString::Chars_t & data = column_string.getChars();
ColumnString::Offsets_t & offsets = column_string.getOffsets();
2010-05-13 16:13:38 +00:00
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
{
writeString(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
{
2013-01-07 08:27:39 +00:00
field.assignString("", 0);
readString(get<String &>(field), istr);
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
{
writeEscapedString(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
{
2013-01-07 08:27:39 +00:00
field.assignString("", 0);
readEscapedString(get<String &>(field), istr);
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
{
writeQuotedString(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
{
2013-01-07 08:27:39 +00:00
field.assignString("", 0);
readQuotedString(get<String &>(field), istr);
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, get<const String &>(field));
2011-08-12 18:27:39 +00:00
}
2010-05-13 16:13:38 +00:00
}