提交 19f86146 编写于 作者: A Alexey Milovidov

Moving code [#METR-2944].

上级 af7e4a0c
#pragma once
#include <DB/Core/Block.h>
#include <DB/IO/WriteBuffer.h>
#include <DB/DataStreams/IRowOutputStream.h>
namespace DB
{
class IColumn;
class IDataType;
class WriteBuffer;
/** Поток для вывода данных в бинарном построчном формате.
*/
class BinaryRowOutputStream : public IRowOutputStream
......@@ -17,7 +20,7 @@ public:
void writeField(const IColumn & column, const IDataType & type, size_t row_num) override;
void flush() override { ostr.next(); }
void flush() override;
String getContentType() const override { return "application/octet-stream"; }
......
#pragma once
#include <DB/IO/WriteBuffer.h>
#include <DB/Core/Block.h>
#include <DB/DataStreams/IRowOutputStream.h>
namespace DB
{
class WriteBuffer;
/** Поток для вывода данных в формате csv.
* Не соответствует https://tools.ietf.org/html/rfc4180 потому что использует LF, а не CR LF.
*/
......@@ -24,7 +27,7 @@ public:
void writePrefix() override;
void writeSuffix() override;
void flush() override { ostr.next(); }
void flush() override;
void setTotals(const Block & totals_) override { totals = totals_; }
void setExtremes(const Block & extremes_) override { extremes = extremes_; }
......
#pragma once
#include <boost/noncopyable.hpp>
#include <DB/Core/Block.h>
#include <DB/Core/Row.h>
#include <DB/Storages/IStorage.h>
namespace DB
{
class Block;
/** Интерфейс потока для записи данных в БД или в сеть, или в консоль и т. п.
/** Interface of stream for writing data (into table, filesystem, network, terminal, etc.)
*/
class IBlockOutputStream : private boost::noncopyable
{
public:
IBlockOutputStream() {}
/** Записать блок.
/** Write block.
*/
virtual void write(const Block & block) = 0;
/** Записать что-нибудь перед началом всех данных или после конца всех данных.
/** Write or do something before all data or after all data.
*/
virtual void writePrefix() {}
virtual void writeSuffix() {}
/** Сбросить имеющиеся буферы для записи.
/** Flush output buffers if any.
*/
virtual void flush() {}
/** Методы для установки дополнительной информации для вывода в поддерживающих её форматах.
/** Methods to set additional information for output in formats, that support it.
*/
virtual void setRowsBeforeLimit(size_t rows_before_limit) {}
virtual void setTotals(const Block & totals) {}
virtual void setExtremes(const Block & extremes) {}
/** Выставлять такой Content-Type при отдаче по HTTP.
/** Content-Type to set when sending HTTP response.
*/
virtual String getContentType() const { return "text/plain; charset=UTF-8"; }
virtual ~IBlockOutputStream() {}
/** Не давать изменить таблицу, пока жив поток блоков.
/** Don't let to alter table while instance of stream is alive.
*/
void addTableLock(const IStorage::TableStructureReadLockPtr & lock) { table_locks.push_back(lock); }
......
#pragma once
#include <boost/noncopyable.hpp>
#include <memory>
#include <DB/Core/Block.h>
#include <cstdint>
#include <boost/noncopyable.hpp>
#include <DB/Core/Types.h>
namespace DB
{
/** Интерфейс потока для записи данных по строкам (например, для вывода в консоль).
class Block;
class IColumn;
class IDataType;
/** Interface of stream for writing data by rows (for example: for output to terminal).
*/
class IRowOutputStream : private boost::noncopyable
{
public:
/** Записать строку.
* Есть реализация по умолчанию, которая использует методы для записи одиночных значений и разделителей
* (кроме разделителя между строк (writeRowBetweenDelimiter())).
/** Write a row.
* Default implementation calls methods to write single values and delimiters
* (except delimiter between rows (writeRowBetweenDelimiter())).
*/
virtual void write(const Block & block, size_t row_num);
/** Записать значение. */
/** Write single value. */
virtual void writeField(const IColumn & column, const IDataType & type, size_t row_num) = 0;
/** Записать разделитель. */
virtual void writeFieldDelimiter() {}; /// разделитель между значениями
virtual void writeRowStartDelimiter() {}; /// разделитель перед каждой строкой
virtual void writeRowEndDelimiter() {}; /// разделитель после каждой строки
virtual void writeRowBetweenDelimiter() {}; /// разделитель между строками
virtual void writePrefix() {}; /// разделитель перед началом результата
virtual void writeSuffix() {}; /// разделитель после конца результата
/** Write delimiter. */
virtual void writeFieldDelimiter() {}; /// delimiter between values
virtual void writeRowStartDelimiter() {}; /// delimiter before each row
virtual void writeRowEndDelimiter() {}; /// delimiter after each row
virtual void writeRowBetweenDelimiter() {}; /// delimiter between rows
virtual void writePrefix() {}; /// delimiter before resultset
virtual void writeSuffix() {}; /// delimiter after resultset
/** Сбросить имеющиеся буферы для записи. */
/** Flush output buffers if any. */
virtual void flush() {}
/** Методы для установки дополнительной информации для вывода в поддерживающих её форматах.
/** Methods to set additional information for output in formats, that support it.
*/
virtual void setRowsBeforeLimit(size_t rows_before_limit) {}
virtual void setTotals(const Block & totals) {}
virtual void setExtremes(const Block & extremes) {}
/** Выставлять такой Content-Type при отдаче по HTTP. */
/** Content-Type to set when sending HTTP response. */
virtual String getContentType() const { return "text/plain; charset=UTF-8"; }
virtual ~IRowOutputStream() {}
......
......@@ -27,7 +27,7 @@ public:
WriteBuffer * index_ostr_ = nullptr, size_t initial_size_of_file_ = 0);
void write(const Block & block) override;
void flush() override { ostr.next(); }
void flush() override;
static void writeData(const IDataType & type, const ColumnPtr & column, WriteBuffer & ostr, size_t offset, size_t limit);
......
......@@ -6,6 +6,9 @@
namespace DB
{
class WriteBuffer;
/** Формат данных, предназначенный для упрощения реализации ODBC драйвера.
* ODBC драйвер предназначен для сборки под разные платформы без зависимостей от основного кода,
* поэтому формат сделан так, чтобы в нём можно было как можно проще его распарсить.
......@@ -19,7 +22,7 @@ public:
void write(const Block & block) override;
void flush() override { out.next(); }
void flush() override;
String getContentType() const override { return "application/octet-stream"; }
private:
......
......@@ -8,6 +8,9 @@
namespace DB
{
class WriteBuffer;
/** Выводит результат в виде красивых таблиц.
*/
class PrettyBlockOutputStream : public IBlockOutputStream
......@@ -19,7 +22,7 @@ public:
void write(const Block & block) override;
void writeSuffix() override;
void flush() override { ostr.next(); }
void flush() override;
void setTotals(const Block & totals_) override { totals = totals_; }
void setExtremes(const Block & extremes_) override { extremes = extremes_; }
......
......@@ -6,6 +6,10 @@
namespace DB
{
class Block;
class WriteBuffer;
/** Пишет данные в tab-separated файл, но по столбцам, блоками.
* Блоки разделены двойным переводом строки.
* На каждой строке блока - данные одного столбца.
......@@ -16,7 +20,7 @@ public:
TabSeparatedBlockOutputStream(WriteBuffer & ostr_) : ostr(ostr_) {}
void write(const Block & block) override;
void flush() override { ostr.next(); }
void flush() override;
private:
WriteBuffer & ostr;
......
#pragma once
#include <DB/Core/Block.h>
#include <DB/IO/WriteBuffer.h>
#include <DB/DataStreams/IRowOutputStream.h>
namespace DB
{
class WriteBuffer;
/** Поток для вывода данных в формате tsv.
*/
class TabSeparatedRowOutputStream : public IRowOutputStream
......@@ -24,7 +25,7 @@ public:
void writePrefix() override;
void writeSuffix() override;
void flush() override { ostr.next(); }
void flush() override;
void setTotals(const Block & totals_) override { totals = totals_; }
void setExtremes(const Block & extremes_) override { extremes = extremes_; }
......
#pragma once
#include <DB/IO/WriteBuffer.h>
#include <DB/DataStreams/IRowOutputStream.h>
namespace DB
{
class WriteBuffer;
/** Поток для вывода данных в формате VALUES (как в INSERT запросе).
*/
......@@ -20,8 +21,7 @@ public:
void writeRowStartDelimiter() override;
void writeRowEndDelimiter() override;
void writeRowBetweenDelimiter() override;
void flush() override { ostr.next(); }
void flush() override;
private:
WriteBuffer & ostr;
......
......@@ -2,13 +2,15 @@
#include <DB/Core/Block.h>
#include <DB/Core/Names.h>
#include <DB/IO/WriteBuffer.h>
#include <DB/DataStreams/IRowOutputStream.h>
namespace DB
{
class WriteBuffer;
/** Поток для вывода данных в формате "каждое значение на своей строке".
*/
class VerticalRowOutputStream : public IRowOutputStream
......@@ -20,7 +22,7 @@ public:
void writeRowStartDelimiter() override;
void writeRowBetweenDelimiter() override;
void flush() override { ostr.next(); }
void flush() override;
protected:
virtual void writeValue(const IColumn & column, const IDataType & type, size_t row_num) const;
......
#include <DB/IO/WriteBuffer.h>
#include <DB/Columns/IColumn.h>
#include <DB/DataTypes/IDataType.h>
#include <DB/DataStreams/BinaryRowOutputStream.h>
......@@ -9,6 +12,11 @@ BinaryRowOutputStream::BinaryRowOutputStream(WriteBuffer & ostr_)
{
}
void BinaryRowOutputStream::flush()
{
ostr.next();
}
void BinaryRowOutputStream::writeField(const IColumn & column, const IDataType & type, size_t row_num)
{
type.serializeBinary(column, row_num, ostr);
......
#include <DB/DataStreams/BlockOutputStreamFromRowOutputStream.h>
#include <DB/DataStreams/JSONRowOutputStream.h>
namespace DB
{
......
......@@ -17,6 +17,12 @@ CSVRowOutputStream::CSVRowOutputStream(WriteBuffer & ostr_, const Block & sample
}
void CSVRowOutputStream::flush()
{
ostr.next();
}
void CSVRowOutputStream::writePrefix()
{
size_t columns = sample.columns();
......
......@@ -58,7 +58,7 @@ size_t IBlockInputStream::checkDepthImpl(size_t max_depth, size_t level) const
return res + 1;
}
void IBlockInputStream::dumpTree(std::ostream & ostr, size_t indent, size_t multiplier)
{
/// Не будем отображать в дереве обёртку потока блоков в AsynchronousBlockInputStream.
......
#include <DB/Core/Block.h>
#include <DB/DataStreams/IRowOutputStream.h>
......
......@@ -32,6 +32,12 @@ NativeBlockOutputStream::NativeBlockOutputStream(
}
void NativeBlockOutputStream::flush()
{
ostr.next();
}
void NativeBlockOutputStream::writeData(const IDataType & type, const ColumnPtr & column, WriteBuffer & ostr, size_t offset, size_t limit)
{
/** Если есть столбцы-константы - то материализуем их.
......
......@@ -6,6 +6,10 @@ namespace DB
ODBCDriverBlockOutputStream::ODBCDriverBlockOutputStream(WriteBuffer & out_)
: out(out_) {}
void ODBCDriverBlockOutputStream::flush()
{
out.next();
}
void ODBCDriverBlockOutputStream::write(const Block & block)
{
......
......@@ -18,6 +18,12 @@ PrettyBlockOutputStream::PrettyBlockOutputStream(WriteBuffer & ostr_, bool no_es
}
void PrettyBlockOutputStream::flush()
{
ostr.next();
}
void PrettyBlockOutputStream::calculateWidths(Block & block, Widths_t & max_widths, Widths_t & name_widths)
{
size_t rows = block.rows();
......
......@@ -4,6 +4,11 @@
namespace DB
{
void TabSeparatedBlockOutputStream::flush()
{
ostr.next();
}
void TabSeparatedBlockOutputStream::write(const Block & block)
{
size_t columns = block.columns();
......
......@@ -12,6 +12,12 @@ TabSeparatedRowOutputStream::TabSeparatedRowOutputStream(WriteBuffer & ostr_, co
}
void TabSeparatedRowOutputStream::flush()
{
ostr.next();
}
void TabSeparatedRowOutputStream::writePrefix()
{
size_t columns = sample.columns();
......
#include <DB/DataStreams/ValuesRowOutputStream.h>
#include <DB/IO/WriteHelpers.h>
#include <DB/Columns/IColumn.h>
#include <DB/DataTypes/IDataType.h>
namespace DB
......@@ -12,6 +14,11 @@ ValuesRowOutputStream::ValuesRowOutputStream(WriteBuffer & ostr_)
{
}
void ValuesRowOutputStream::flush()
{
ostr.next();
}
void ValuesRowOutputStream::writeField(const IColumn & column, const IDataType & type, size_t row_num)
{
type.serializeTextQuoted(column, row_num, ostr);
......
......@@ -31,6 +31,12 @@ VerticalRowOutputStream::VerticalRowOutputStream(WriteBuffer & ostr_, const Bloc
}
void VerticalRowOutputStream::flush()
{
ostr.next();
}
void VerticalRowOutputStream::writeField(const IColumn & column, const IDataType & type, size_t row_num)
{
writeEscapedString(names[field_number], ostr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册