2010-05-18 18:51:51 +00:00
|
|
|
|
#ifndef DBMS_DATA_TYPES_IDATATYPE_NUMBER_VARIABLE_H
|
|
|
|
|
#define DBMS_DATA_TYPES_IDATATYPE_NUMBER_VARIABLE_H
|
|
|
|
|
|
|
|
|
|
#include <DB/Core/Exception.h>
|
|
|
|
|
#include <DB/Core/ErrorCodes.h>
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
#include <DB/IO/VarInt.h>
|
|
|
|
|
|
2010-05-18 18:51:51 +00:00
|
|
|
|
#include <DB/DataTypes/IDataTypeNumber.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Реализует часть интерфейса IDataType, общую для знаковых и беззнаковых чисел переменной длины
|
|
|
|
|
* - ввод и вывод в текстовом и бинарном виде.
|
|
|
|
|
* Остаётся лишь чисто виртуальный метод getName().
|
|
|
|
|
*
|
|
|
|
|
* Параметры: FieldType - тип единичного значения, ColumnType - тип столбца со значениями.
|
|
|
|
|
* (см. Core/Field.h, Columns/IColumn.h)
|
|
|
|
|
*/
|
|
|
|
|
template <typename FieldType, typename ColumnType>
|
|
|
|
|
class IDataTypeNumberVariable : public IDataTypeNumber<FieldType>
|
|
|
|
|
{
|
|
|
|
|
public:
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void serializeBinary(const Field & field, WriteBuffer & ostr) const
|
2010-05-18 18:51:51 +00:00
|
|
|
|
{
|
2010-06-01 14:12:28 +00:00
|
|
|
|
writeVarT(static_cast<typename ColumnType::value_type>(boost::get<FieldType>(field)), ostr);
|
2010-05-18 18:51:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void deserializeBinary(Field & field, ReadBuffer & istr) const
|
2010-05-18 18:51:51 +00:00
|
|
|
|
{
|
2010-06-04 18:25:25 +00:00
|
|
|
|
readVarT(static_cast<typename ColumnType::value_type &>(boost::get<FieldType &>(field)), istr);
|
2010-05-18 18:51:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void serializeBinary(const IColumn & column, WriteBuffer & ostr) const
|
2010-05-18 18:51:51 +00:00
|
|
|
|
{
|
|
|
|
|
const typename ColumnType::Container_t & x = dynamic_cast<const ColumnType &>(column).getData();
|
|
|
|
|
size_t size = x.size();
|
|
|
|
|
for (size_t i = 0; i < size; ++i)
|
2010-06-01 14:12:28 +00:00
|
|
|
|
writeVarT(x[i], ostr);
|
2010-05-18 18:51:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const
|
2010-05-18 18:51:51 +00:00
|
|
|
|
{
|
|
|
|
|
typename ColumnType::Container_t & x = dynamic_cast<ColumnType &>(column).getData();
|
|
|
|
|
x.resize(limit);
|
|
|
|
|
for (size_t i = 0; i < limit; ++i)
|
|
|
|
|
{
|
2010-06-01 14:12:28 +00:00
|
|
|
|
readVarT(x[i], istr);
|
2010-05-18 18:51:51 +00:00
|
|
|
|
|
|
|
|
|
if (istr.eof())
|
|
|
|
|
{
|
|
|
|
|
x.resize(i);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SharedPtr<IColumn> createColumn() const
|
|
|
|
|
{
|
|
|
|
|
return new ColumnType;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|