2011-10-10 06:10:49 +00:00
|
|
|
|
#pragma once
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <cstdio>
|
|
|
|
|
#include <limits>
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
2012-02-26 01:52:43 +00:00
|
|
|
|
#include <Yandex/Common.h>
|
2011-05-05 19:10:17 +00:00
|
|
|
|
#include <Yandex/DateLUT.h>
|
|
|
|
|
|
2011-11-21 10:09:22 +00:00
|
|
|
|
#include <mysqlxx/Row.h>
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
#include <DB/Core/Types.h>
|
|
|
|
|
#include <DB/Core/Exception.h>
|
|
|
|
|
#include <DB/Core/ErrorCodes.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/IO/WriteBuffer.h>
|
2011-08-19 18:31:14 +00:00
|
|
|
|
#include <DB/IO/VarInt.h>
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
2010-06-07 17:14:13 +00:00
|
|
|
|
#define WRITE_HELPERS_DEFAULT_FLOAT_PRECISION 6U
|
2012-03-19 03:09:40 +00:00
|
|
|
|
/// 20 цифр или 19 цифр и знак
|
2012-03-18 23:17:56 +00:00
|
|
|
|
#define WRITE_HELPERS_MAX_INT_WIDTH 20U
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/// Функции-помошники для форматированной записи
|
|
|
|
|
|
|
|
|
|
inline void writeChar(char x, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
buf.nextIfAtEnd();
|
|
|
|
|
*buf.position() = x;
|
|
|
|
|
++buf.position();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-02-26 01:52:43 +00:00
|
|
|
|
/// Запись POD-типа в native формате
|
2011-07-04 18:22:37 +00:00
|
|
|
|
template <typename T>
|
2012-02-26 01:52:43 +00:00
|
|
|
|
inline void writePODBinary(const T & x, WriteBuffer & buf)
|
2011-07-04 18:22:37 +00:00
|
|
|
|
{
|
|
|
|
|
buf.write(reinterpret_cast<const char *>(&x), sizeof(x));
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-09 17:24:17 +00:00
|
|
|
|
template <typename T>
|
2011-12-02 19:18:04 +00:00
|
|
|
|
inline void writeIntBinary(const T & x, WriteBuffer & buf)
|
2011-08-09 17:24:17 +00:00
|
|
|
|
{
|
2012-02-26 01:52:43 +00:00
|
|
|
|
writePODBinary(x, buf);
|
2011-08-09 17:24:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
2011-12-02 19:18:04 +00:00
|
|
|
|
inline void writeFloatBinary(const T & x, WriteBuffer & buf)
|
2011-08-09 17:24:17 +00:00
|
|
|
|
{
|
2012-02-26 01:52:43 +00:00
|
|
|
|
writePODBinary(x, buf);
|
2011-08-09 17:24:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-04 18:22:37 +00:00
|
|
|
|
|
2011-08-19 18:31:14 +00:00
|
|
|
|
inline void writeStringBinary(const std::string & s, DB::WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeVarUInt(s.size(), buf);
|
|
|
|
|
buf.write(s.data(), s.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-11-21 10:09:22 +00:00
|
|
|
|
inline void writeBoolText(bool x, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeChar(x ? '1' : '0', buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
template <typename T>
|
|
|
|
|
void writeIntText(T x, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
char tmp[WRITE_HELPERS_MAX_INT_WIDTH];
|
2010-06-07 17:14:13 +00:00
|
|
|
|
bool negative = false;
|
|
|
|
|
|
|
|
|
|
if (x == 0)
|
|
|
|
|
{
|
|
|
|
|
writeChar('0', buf);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (x < 0)
|
|
|
|
|
{
|
|
|
|
|
x = -x;
|
|
|
|
|
negative = true;
|
2012-03-18 22:07:58 +00:00
|
|
|
|
|
|
|
|
|
/// Особый случай для самого маленького отрицательного числа
|
|
|
|
|
if (unlikely(x < 0))
|
|
|
|
|
{
|
|
|
|
|
if (sizeof(x) == 1)
|
|
|
|
|
buf.write("-128", 4);
|
|
|
|
|
else if (sizeof(x) == 2)
|
|
|
|
|
buf.write("-32768", 6);
|
|
|
|
|
else if (sizeof(x) == 4)
|
|
|
|
|
buf.write("-2147483648", 11);
|
|
|
|
|
else
|
|
|
|
|
buf.write("-9223372036854775808", 20);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2010-06-07 17:14:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char * pos;
|
|
|
|
|
for (pos = tmp + WRITE_HELPERS_MAX_INT_WIDTH - 1; x != 0; --pos)
|
|
|
|
|
{
|
|
|
|
|
*pos = '0' + x % 10;
|
|
|
|
|
x /= 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (negative)
|
|
|
|
|
*pos = '-';
|
|
|
|
|
else
|
|
|
|
|
++pos;
|
|
|
|
|
|
|
|
|
|
buf.write(pos, tmp + WRITE_HELPERS_MAX_INT_WIDTH - pos);
|
2010-06-04 18:25:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
void writeFloatText(T x, WriteBuffer & buf, unsigned precision = WRITE_HELPERS_DEFAULT_FLOAT_PRECISION)
|
|
|
|
|
{
|
2012-04-13 19:50:42 +00:00
|
|
|
|
char tmp[24];
|
|
|
|
|
int res = std::snprintf(tmp, 24, "%.*g", precision, x);
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
2012-04-13 19:50:42 +00:00
|
|
|
|
if (res >= 24 || res <= 0)
|
2010-06-04 18:25:25 +00:00
|
|
|
|
throw Exception("Cannot print float or double number", ErrorCodes::CANNOT_PRINT_FLOAT_OR_DOUBLE_NUMBER);
|
|
|
|
|
|
2010-06-04 18:34:25 +00:00
|
|
|
|
buf.write(tmp, res);
|
2010-06-04 18:25:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-09 17:24:17 +00:00
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
inline void writeString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
buf.write(s.data(), s.size());
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-01 17:57:37 +00:00
|
|
|
|
|
|
|
|
|
template <char c>
|
2011-11-21 10:09:22 +00:00
|
|
|
|
void writeAnyEscapedString(const char * begin, const char * end, WriteBuffer & buf)
|
2011-11-01 17:57:37 +00:00
|
|
|
|
{
|
2011-11-21 10:09:22 +00:00
|
|
|
|
for (const char * it = begin; it != end; ++it)
|
2011-11-01 17:57:37 +00:00
|
|
|
|
{
|
|
|
|
|
switch (*it)
|
|
|
|
|
{
|
|
|
|
|
case '\b':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('b', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\f':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('f', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\n':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('n', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\r':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('r', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\t':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('t', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\0':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('0', buf);
|
|
|
|
|
break;
|
|
|
|
|
case '\\':
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
break;
|
|
|
|
|
case c:
|
|
|
|
|
writeChar('\\', buf);
|
|
|
|
|
writeChar(c, buf);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
writeChar(*it, buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-11-21 10:09:22 +00:00
|
|
|
|
template <char c>
|
|
|
|
|
void writeAnyEscapedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeAnyEscapedString<c>(s.data(), s.data() + s.size(), buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-11-01 17:57:37 +00:00
|
|
|
|
inline void writeEscapedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
2011-11-21 10:52:05 +00:00
|
|
|
|
/// strpbrk в libc под Linux на процессорах с SSE 4.2 хорошо оптимизирована (этот if ускоряет код в 1.5 раза)
|
2011-11-21 10:50:01 +00:00
|
|
|
|
if (NULL == strpbrk(s.data(), "\b\f\n\r\t\'\\") && strlen(s.data()) == s.size())
|
|
|
|
|
writeString(s, buf);
|
|
|
|
|
else
|
|
|
|
|
writeAnyEscapedString<'\''>(s, buf);
|
2011-11-01 17:57:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <char c>
|
|
|
|
|
void writeAnyQuotedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeChar(c, buf);
|
|
|
|
|
writeAnyEscapedString<c>(s, buf);
|
|
|
|
|
writeChar(c, buf);
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
|
|
|
|
inline void writeQuotedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
2011-11-01 17:57:37 +00:00
|
|
|
|
writeAnyQuotedString<'\''>(s, buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Совместимо с JSON.
|
|
|
|
|
inline void writeDoubleQuotedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeAnyQuotedString<'"'>(s, buf);
|
2010-06-04 18:25:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-11-06 20:47:07 +00:00
|
|
|
|
/// Выводит строку в обратных кавычках, как идентификатор в MySQL.
|
2011-11-01 17:57:37 +00:00
|
|
|
|
inline void writeBackQuotedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
writeAnyQuotedString<'`'>(s, buf);
|
|
|
|
|
}
|
2011-06-15 18:54:18 +00:00
|
|
|
|
|
2011-11-06 20:47:07 +00:00
|
|
|
|
/// То же самое, но обратные кавычки применяются только при наличии символов, не подходящих для идентификатора без обратных кавычек.
|
|
|
|
|
inline void writeProbablyBackQuotedString(const String & s, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
if (s.empty() || !((s[0] >= 'a' && s[0] <= 'z') || (s[0] >= 'A' && s[0] <= 'Z') || s[0] == '_'))
|
|
|
|
|
writeBackQuotedString(s, buf);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
const char * pos = s.data() + 1;
|
|
|
|
|
const char * end = s.data() + s.size();
|
|
|
|
|
for (; pos < end; ++pos)
|
|
|
|
|
if (!((*pos >= 'a' && *pos <= 'z') || (*pos >= 'A' && *pos <= 'Z') || (*pos >= '0' && *pos <= '9') || *pos == '_'))
|
|
|
|
|
break;
|
|
|
|
|
if (pos != end)
|
|
|
|
|
writeBackQuotedString(s, buf);
|
|
|
|
|
else
|
|
|
|
|
writeString(s, buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
|
2011-05-05 19:10:17 +00:00
|
|
|
|
/// в формате YYYY-MM-DD
|
|
|
|
|
inline void writeDateText(Yandex::DayNum_t date, WriteBuffer & buf)
|
|
|
|
|
{
|
2011-08-07 03:42:36 +00:00
|
|
|
|
char s[10] = {'0', '0', '0', '0', '-', '0', '0', '-', '0', '0'};
|
|
|
|
|
|
|
|
|
|
if (unlikely(date > DATE_LUT_MAX_DAY_NUM || date == 0))
|
|
|
|
|
{
|
|
|
|
|
buf.write(s, 10);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-05-05 19:10:17 +00:00
|
|
|
|
|
|
|
|
|
const Yandex::DateLUT::Values & values = Yandex::DateLUTSingleton::instance().getValues(date);
|
|
|
|
|
|
2011-08-07 03:42:36 +00:00
|
|
|
|
s[0] += values.year / 1000;
|
|
|
|
|
s[1] += (values.year / 100) % 10;
|
|
|
|
|
s[2] += (values.year / 10) % 10;
|
|
|
|
|
s[3] += values.year % 10;
|
|
|
|
|
s[5] += values.month / 10;
|
|
|
|
|
s[6] += values.month % 10;
|
|
|
|
|
s[8] += values.day_of_month / 10;
|
|
|
|
|
s[9] += values.day_of_month % 10;
|
2011-05-05 19:10:17 +00:00
|
|
|
|
|
|
|
|
|
buf.write(s, 10);
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-21 10:09:22 +00:00
|
|
|
|
inline void writeDateText(mysqlxx::Date date, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
char s[10] = {'0', '0', '0', '0', '-', '0', '0', '-', '0', '0'};
|
|
|
|
|
|
|
|
|
|
s[0] += date.year() / 1000;
|
|
|
|
|
s[1] += (date.year() / 100) % 10;
|
|
|
|
|
s[2] += (date.year() / 10) % 10;
|
|
|
|
|
s[3] += date.year() % 10;
|
|
|
|
|
s[5] += date.month() / 10;
|
|
|
|
|
s[6] += date.month() % 10;
|
|
|
|
|
s[8] += date.day() / 10;
|
|
|
|
|
s[9] += date.day() % 10;
|
|
|
|
|
|
|
|
|
|
buf.write(s, 10);
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-05 19:10:17 +00:00
|
|
|
|
|
2011-08-07 02:08:22 +00:00
|
|
|
|
/// в формате YYYY-MM-DD HH:MM:SS, согласно текущему часовому поясу
|
|
|
|
|
inline void writeDateTimeText(time_t datetime, WriteBuffer & buf)
|
|
|
|
|
{
|
2011-08-07 03:42:36 +00:00
|
|
|
|
char s[19] = {'0', '0', '0', '0', '-', '0', '0', '-', '0', '0', ' ', '0', '0', ':', '0', '0', ':', '0', '0'};
|
|
|
|
|
|
|
|
|
|
if (unlikely(datetime > DATE_LUT_MAX || datetime == 0))
|
|
|
|
|
{
|
|
|
|
|
buf.write(s, 19);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-08-07 02:08:22 +00:00
|
|
|
|
|
|
|
|
|
Yandex::DateLUTSingleton & date_lut = Yandex::DateLUTSingleton::instance();
|
|
|
|
|
const Yandex::DateLUT::Values & values = date_lut.getValues(datetime);
|
|
|
|
|
|
2011-08-07 03:42:36 +00:00
|
|
|
|
s[0] += values.year / 1000;
|
|
|
|
|
s[1] += (values.year / 100) % 10;
|
|
|
|
|
s[2] += (values.year / 10) % 10;
|
|
|
|
|
s[3] += values.year % 10;
|
|
|
|
|
s[5] += values.month / 10;
|
|
|
|
|
s[6] += values.month % 10;
|
|
|
|
|
s[8] += values.day_of_month / 10;
|
|
|
|
|
s[9] += values.day_of_month % 10;
|
2011-08-07 02:08:22 +00:00
|
|
|
|
|
|
|
|
|
UInt8 hour = date_lut.toHourInaccurate(datetime);
|
2012-08-31 20:38:05 +00:00
|
|
|
|
UInt8 minute = date_lut.toMinuteInaccurate(datetime);
|
|
|
|
|
UInt8 second = date_lut.toSecondInaccurate(datetime);
|
2011-08-07 02:08:22 +00:00
|
|
|
|
|
2011-08-07 03:42:36 +00:00
|
|
|
|
s[11] += hour / 10;
|
|
|
|
|
s[12] += hour % 10;
|
|
|
|
|
s[14] += minute / 10;
|
|
|
|
|
s[15] += minute % 10;
|
|
|
|
|
s[17] += second / 10;
|
|
|
|
|
s[18] += second % 10;
|
2011-08-07 02:08:22 +00:00
|
|
|
|
|
|
|
|
|
buf.write(s, 19);
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-21 10:09:22 +00:00
|
|
|
|
inline void writeDateTimeText(mysqlxx::DateTime datetime, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
char s[19] = {'0', '0', '0', '0', '-', '0', '0', '-', '0', '0', ' ', '0', '0', ':', '0', '0', ':', '0', '0'};
|
|
|
|
|
|
|
|
|
|
s[0] += datetime.year() / 1000;
|
|
|
|
|
s[1] += (datetime.year() / 100) % 10;
|
|
|
|
|
s[2] += (datetime.year() / 10) % 10;
|
|
|
|
|
s[3] += datetime.year() % 10;
|
|
|
|
|
s[5] += datetime.month() / 10;
|
|
|
|
|
s[6] += datetime.month() % 10;
|
|
|
|
|
s[8] += datetime.day() / 10;
|
|
|
|
|
s[9] += datetime.day() % 10;
|
|
|
|
|
|
|
|
|
|
s[11] += datetime.hour() / 10;
|
|
|
|
|
s[12] += datetime.hour() % 10;
|
|
|
|
|
s[14] += datetime.minute() / 10;
|
|
|
|
|
s[15] += datetime.minute() % 10;
|
|
|
|
|
s[17] += datetime.second() / 10;
|
|
|
|
|
s[18] += datetime.second() % 10;
|
|
|
|
|
|
|
|
|
|
buf.write(s, 19);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Вывести mysqlxx::Row в tab-separated виде
|
|
|
|
|
inline void writeEscapedRow(const mysqlxx::Row & row, WriteBuffer & buf)
|
|
|
|
|
{
|
|
|
|
|
for (size_t i = 0; i < row.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (i != 0)
|
|
|
|
|
buf.write('\t');
|
|
|
|
|
|
|
|
|
|
if (unlikely(row[i].isNull()))
|
|
|
|
|
{
|
|
|
|
|
buf.write("\\N", 2);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
writeAnyEscapedString<'\''>(row[i].data(), row[i].data() + row[i].length(), buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-02-26 01:52:43 +00:00
|
|
|
|
/// Методы вывода в бинарном виде
|
|
|
|
|
inline void writeBinary(const UInt8 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const UInt16 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const UInt32 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const UInt64 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Int8 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Int16 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Int32 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Int64 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Float32 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const Float64 & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const String & x, WriteBuffer & buf) { writeStringBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const bool & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
|
|
|
|
|
inline void writeBinary(const Yandex::VisitID_t & x, WriteBuffer & buf) { writePODBinary(static_cast<const UInt64 &>(x), buf); }
|
|
|
|
|
inline void writeBinary(const mysqlxx::Date & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
inline void writeBinary(const mysqlxx::DateTime & x, WriteBuffer & buf) { writePODBinary(x, buf); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Методы для вывода значения в текстовом виде для tab-separated формата.
|
|
|
|
|
inline void writeText(const UInt8 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const UInt16 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const UInt32 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const UInt64 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const Int8 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const Int16 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const Int32 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const Int64 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeText(const Float32 & x, WriteBuffer & buf) { writeFloatText(x, buf); }
|
|
|
|
|
inline void writeText(const Float64 & x, WriteBuffer & buf) { writeFloatText(x, buf); }
|
|
|
|
|
inline void writeText(const String & x, WriteBuffer & buf) { writeEscapedString(x, buf); }
|
|
|
|
|
inline void writeText(const bool & x, WriteBuffer & buf) { writeBoolText(x, buf); }
|
|
|
|
|
|
|
|
|
|
inline void writeText(const Yandex::VisitID_t & x, WriteBuffer & buf) { writeIntText(static_cast<const UInt64 &>(x), buf); }
|
|
|
|
|
inline void writeText(const mysqlxx::Date & x, WriteBuffer & buf) { writeDateText(x, buf); }
|
|
|
|
|
inline void writeText(const mysqlxx::DateTime & x, WriteBuffer & buf) { writeDateTimeText(x, buf); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Методы для вывода в текстовом виде в кавычках
|
|
|
|
|
inline void writeQuoted(const UInt8 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const UInt16 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const UInt32 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const UInt64 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Int8 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Int16 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Int32 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Int64 & x, WriteBuffer & buf) { writeIntText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Float32 & x, WriteBuffer & buf) { writeFloatText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const Float64 & x, WriteBuffer & buf) { writeFloatText(x, buf); }
|
|
|
|
|
inline void writeQuoted(const String & x, WriteBuffer & buf) { writeQuotedString(x, buf); }
|
|
|
|
|
inline void writeQuoted(const bool & x, WriteBuffer & buf) { writeBoolText(x, buf); }
|
|
|
|
|
|
|
|
|
|
inline void writeQuoted(const Yandex::VisitID_t & x, WriteBuffer & buf)
|
2012-01-24 16:45:50 +00:00
|
|
|
|
{
|
2012-02-26 01:52:43 +00:00
|
|
|
|
writeIntText(static_cast<const UInt64 &>(x), buf);
|
2012-01-24 16:45:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2012-02-26 01:52:43 +00:00
|
|
|
|
inline void writeQuoted(const mysqlxx::Date & x, WriteBuffer & buf)
|
2012-01-24 16:45:50 +00:00
|
|
|
|
{
|
|
|
|
|
writeChar('\'', buf);
|
|
|
|
|
writeDateText(x, buf);
|
|
|
|
|
writeChar('\'', buf);
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-26 01:52:43 +00:00
|
|
|
|
inline void writeQuoted(const mysqlxx::DateTime & x, WriteBuffer & buf)
|
2012-01-24 16:45:50 +00:00
|
|
|
|
{
|
|
|
|
|
writeChar('\'', buf);
|
|
|
|
|
writeDateTimeText(x, buf);
|
|
|
|
|
writeChar('\'', buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-05-08 05:42:05 +00:00
|
|
|
|
/// Сериализация эксепшена (чтобы его можно было передать по сети)
|
|
|
|
|
void writeException(const Exception & e, WriteBuffer & buf);
|
|
|
|
|
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
}
|