2011-05-16 16:31:19 +00:00
|
|
|
#include <DB/IO/copyData.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
void copyData(ReadBuffer & from, WriteBuffer & to)
|
|
|
|
{
|
2012-02-02 23:44:59 +00:00
|
|
|
/// Если дочитали до конца буфера, eof() либо заполнит буфер новыми данными и переместит курсор в начало, либо вернёт false.
|
2011-05-16 16:31:19 +00:00
|
|
|
while (!from.eof())
|
|
|
|
{
|
2012-02-02 23:44:59 +00:00
|
|
|
/// buffer() - кусок данных, доступных для чтения; position() - курсор места, до которого уже дочитали.
|
|
|
|
to.write(from.position(), from.buffer().end() - from.position());
|
2011-05-16 16:31:19 +00:00
|
|
|
from.position() = from.buffer().end();
|
|
|
|
}
|
|
|
|
}
|
2014-04-02 13:45:39 +00:00
|
|
|
|
|
|
|
void copyData(ReadBuffer & from, WriteBuffer & to, size_t bytes)
|
|
|
|
{
|
|
|
|
while (bytes > 0 && !from.eof())
|
|
|
|
{
|
|
|
|
size_t count = std::min(bytes, static_cast<size_t>(from.buffer().end() - from.position()));
|
|
|
|
to.write(from.position(), count);
|
|
|
|
from.position() += count;
|
|
|
|
bytes -= count;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bytes > 0)
|
|
|
|
throw Exception("Attempt to read after EOF.", ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF);
|
|
|
|
}
|
2011-05-16 16:31:19 +00:00
|
|
|
|
|
|
|
}
|