Comments [#METR-20000].

This commit is contained in:
Alexey Milovidov 2016-10-21 03:19:49 +03:00
parent f373b500d4
commit 0a318a5f16

View File

@ -36,7 +36,7 @@ namespace ErrorCodes
extern const int CANNOT_READ_ARRAY_FROM_TEXT;
}
/// Функции-помошники для форматированного чтения
/// Helper functions for formatted input.
inline char parseEscapeSequence(char c)
{
@ -79,7 +79,7 @@ inline char unhex(char c)
}
/// Эти функции находятся в VarInt.h
/// These functions are located in VarInt.h
/// inline void throwReadAfterEOF()
@ -95,7 +95,7 @@ inline void readChar(char & x, ReadBuffer & buf)
}
/// Чтение POD-типа в native формате
/// Read POD-type in native format
template <typename T>
inline void readPODBinary(T & x, ReadBuffer & buf)
{
@ -250,11 +250,11 @@ bool tryReadIntText(T & x, ReadBuffer & buf)
return readIntTextImpl<T, bool>(x, buf);
}
/** Более оптимизированная версия (примерно в 1.5 раза на реальных данных).
* Отличается тем, что:
* - из чисел, начинающихся на ноль, парсится только ноль;
* - не поддерживается символ '+' перед числом;
* - символы :;<=>? парсятся, как некоторые цифры.
/** More efficient variant (about 1.5 times on real dataset).
* Differs in following:
* - for numbers starting with zero, parsed only zero;
* - symbol '+' before number is not supported;
* - symbols :;<=>? are parsed as some numbers.
*/
template <typename T, bool throw_on_error = true>
void readIntTextUnsafe(T & x, ReadBuffer & buf)
@ -279,7 +279,7 @@ void readIntTextUnsafe(T & x, ReadBuffer & buf)
return on_error();
}
if (*buf.position() == '0') /// В реальных данных много нулей.
if (*buf.position() == '0') /// There are many zeros in real datasets.
{
++buf.position();
return;
@ -287,7 +287,7 @@ void readIntTextUnsafe(T & x, ReadBuffer & buf)
while (!buf.eof())
{
if ((*buf.position() & 0xF0) == 0x30) /// Имеет смысл, что это условие находится внутри цикла.
if ((*buf.position() & 0xF0) == 0x30) /// It makes sense to have this condition inside loop.
{
x *= 10;
x += *buf.position() & 0x0F;
@ -451,7 +451,7 @@ inline void readFloatText(T & x, ReadBuffer & buf)
readFloatTextImpl<T, void>(x, buf);
}
/// грубо; всё до '\n' или '\t'
/// rough; all until '\n' or '\t'
void readString(String & s, ReadBuffer & buf);
void readEscapedString(String & s, ReadBuffer & buf);
@ -467,21 +467,21 @@ void readBackQuotedString(String & s, ReadBuffer & buf);
void readStringUntilEOF(String & s, ReadBuffer & buf);
/** Прочитать строку в формате CSV.
* Правила:
* - строка может быть заключена в кавычки; кавычки могут быть одинарными: ' или двойными: ";
* - а может быть не заключена в кавычки - это определяется по первому символу;
* - если строка не заключена в кавычки, то она читается до следующего разделителя,
* либо до перевода строки (CR или LF),
* либо до конца потока;
* при этом, пробелы и табы на конце строки съедаются, но игнорируются.
* - если строка заключена в кавычки, то она читается до закрывающей кавычки,
* но при этом, последовательность двух подряд идущих кавычек, считается одной кавычкой внутри строки;
/** Read string in CSV format.
* Parsing rules:
* - string could be placed in quotes; quotes could be single: ' or double: ";
* - or string could be unquoted - this is determined by first character;
* - if string is unquoted, then it is read until next delimiter,
* either until end of line (CR or LF),
* or until end of stream;
* but spaces and tabs at begin and end of unquoted string are consumed but ignored (note that this behaviour differs from RFC).
* - if string is in quotes, then it will be read until closing quote,
* but sequences of two consecutive quotes are parsed as single quote inside string;
*/
void readCSVString(String & s, ReadBuffer & buf, const char delimiter = ',');
/// Добавляют прочитанный результат в массив символов.
/// Read and append result to array of characters.
template <typename Vector>
void readStringInto(Vector & s, ReadBuffer & buf);
@ -506,7 +506,7 @@ void readCSVStringInto(Vector & s, ReadBuffer & buf, const char delimiter = ',')
template <typename Vector>
void readJSONStringInto(Vector & s, ReadBuffer & buf);
/// Это можно использовать в качестве параметра шаблона для функций выше, если данные не надо никуда считывать, но нужно просто пропустить.
/// This could be used as template parameter for functions above, if you want to just skip data.
struct NullSink
{
void append(const char *, size_t) {};
@ -514,7 +514,7 @@ struct NullSink
};
/// в формате YYYY-MM-DD
/// In YYYY-MM-DD format
inline void readDateText(DayNum_t & date, ReadBuffer & buf)
{
char s[10];
@ -554,18 +554,18 @@ inline T parse(const char * data, size_t size);
void readDateTimeTextFallback(time_t & datetime, ReadBuffer & buf);
/** В формате YYYY-MM-DD hh:mm:ss, согласно текущему часовому поясу
* В качестве исключения, также поддерживается парсинг из десятичного числа - unix timestamp.
/** In YYYY-MM-DD hh:mm:ss format, according to current time zone.
* As an exception, also supported parsing of unix timestamp in form of decimal number.
*/
inline void readDateTimeText(time_t & datetime, ReadBuffer & buf)
{
/** Считываем 10 символов, которые могут быть unix timestamp.
* При этом, поддерживается только unix timestamp из 5-10 символов.
* Потом смотрим на пятый символ. Если это число - парсим unix timestamp.
* Если это не число - парсим YYYY-MM-DD hh:mm:ss.
/** Read 10 characters, that could represent unix timestamp.
* Only unix timestamp of 5-10 characters is supported.
* Then look at 5th charater. If it is a number - treat whole as unix timestamp.
* If it is not a number - then parse datetime in YYYY-MM-DD hh:mm:ss format.
*/
/// Оптимистичный вариант, когда всё значение точно лежит в буфере.
/// Optimistic path, when whole value are in buffer.
const char * s = buf.position();
if (s + 19 < buf.buffer().end())
{
@ -587,7 +587,7 @@ inline void readDateTimeText(time_t & datetime, ReadBuffer & buf)
buf.position() += 19;
}
else
/// Почему не readIntTextUnsafe? Дело в том, что для нужд AdFox, поддерживается парсинг unix timestamp с отбивкой нулями: 000...NNNN.
/// Why not readIntTextUnsafe? Because for needs of AdFox, parsing of unix timestamp with leading zeros is supported: 000...NNNN.
readIntText(datetime, buf);
}
else
@ -614,7 +614,7 @@ inline void readDateTimeText(LocalDateTime & datetime, ReadBuffer & buf)
}
/// Общие методы для чтения значения в бинарном формате.
/// Generic methods to read value in native binary format.
inline void readBinary(UInt8 & x, ReadBuffer & buf) { readPODBinary(x, buf); }
inline void readBinary(UInt16 & x, ReadBuffer & buf) { readPODBinary(x, buf); }
inline void readBinary(UInt32 & x, ReadBuffer & buf) { readPODBinary(x, buf); }
@ -634,7 +634,7 @@ inline void readBinary(LocalDate & x, ReadBuffer & buf) { readPODBinary(x, buf
inline void readBinary(LocalDateTime & x, ReadBuffer & buf) { readPODBinary(x, buf); }
/// Общие методы для чтения значения в текстовом виде из tab-separated формата.
/// Generic methods to read value in text tab-separated format.
inline void readText(UInt8 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readText(UInt16 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readText(UInt32 & x, ReadBuffer & buf) { readIntText(x, buf); }
@ -653,7 +653,8 @@ inline void readText(LocalDate & x, ReadBuffer & buf) { readDateText(x, buf); }
inline void readText(LocalDateTime & x, ReadBuffer & buf) { readDateTimeText(x, buf); }
/// Общие методы для чтения значения в текстовом виде, при необходимости, в кавычках.
/// Generic methods to read value in text format,
/// possibly in single quotes (only for data types that use quotes in VALUES format of INSERT statement in SQL).
inline void readQuoted(UInt8 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readQuoted(UInt16 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readQuoted(UInt32 & x, ReadBuffer & buf) { readIntText(x, buf); }
@ -684,7 +685,7 @@ inline void readQuoted(LocalDateTime & x, ReadBuffer & buf)
}
/// В двойных кавычках
/// Same as above, but in double quotes.
inline void readDoubleQuoted(UInt8 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readDoubleQuoted(UInt16 & x, ReadBuffer & buf) { readIntText(x, buf); }
inline void readDoubleQuoted(UInt32 & x, ReadBuffer & buf) { readIntText(x, buf); }
@ -715,7 +716,7 @@ inline void readDoubleQuoted(LocalDateTime & x, ReadBuffer & buf)
}
/// CSV, для чисел, дат, дат-с-временем: кавычки не обязательны, специального эскейпинга нет.
/// CSV, for numbers, dates, datetimes: quotes are optional, no special escaping rules.
template <typename T>
inline void readCSVSimple(T & x, ReadBuffer & buf)
{
@ -817,7 +818,7 @@ void readText(std::vector<T> & x, ReadBuffer & buf)
}
/// Пропустить пробельные символы.
/// Skip whitespace characters.
inline void skipWhitespaceIfAny(ReadBuffer & buf)
{
while (!buf.eof() && isWhitespaceASCII(*buf.position()))
@ -828,16 +829,16 @@ inline void skipWhitespaceIfAny(ReadBuffer & buf)
void skipJSONFieldPlain(ReadBuffer & buf, const StringRef & name_of_filed);
/** Прочитать сериализованный эксепшен.
* При сериализации/десериализации часть информации теряется
* (тип обрезается до базового, message заменяется на displayText, и stack trace дописывается в message)
* К нему может быть добавлено дополнительное сообщение (например, вы можете указать, откуда оно было прочитано).
/** Read serialized exception.
* During serialization/deserialization some information is lost
* (type is cut to base class, 'message' replaced by 'displayText', and stack trace is appended to 'message')
* Some additional message could be appended to exception (example: you could add information about from where it was received).
*/
void readException(Exception & e, ReadBuffer & buf, const String & additional_message = "");
void readAndThrowException(ReadBuffer & buf, const String & additional_message = "");
/** Вспомогательная функция
/** Helper function for implementation.
*/
template <typename T>
static inline const char * tryReadIntText(T & x, const char * pos, const char * end)
@ -885,7 +886,7 @@ static inline const char * tryReadIntText(T & x, const char * pos, const char *
}
/// Простые для использования методы чтения чего-либо из строки в текстовом виде.
/// Convenient methods for reading something from string in text format.
template <typename T>
inline T parse(const char * data, size_t size)
{