mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-03 13:02:00 +00:00
dbms: IO: modified count() and next() methods. [#CONV-2546].
This commit is contained in:
parent
61149dd093
commit
36e74d86b3
@ -33,7 +33,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
bool next()
|
||||
bool nextImpl()
|
||||
{
|
||||
if (in.eof())
|
||||
return false;
|
||||
@ -59,7 +59,6 @@ public:
|
||||
|
||||
qlz_decompress(&compressed_buffer[0], &internal_buffer[0], scratch);
|
||||
|
||||
pos = working_buffer.begin();
|
||||
working_buffer = Buffer(working_buffer.begin(), working_buffer.begin() + size_decompressed);
|
||||
|
||||
return true;
|
||||
|
@ -26,7 +26,7 @@ private:
|
||||
public:
|
||||
CompressedWriteBuffer(WriteBuffer & out_) : out(out_), compressed_bytes(0) {}
|
||||
|
||||
void next()
|
||||
void nextImpl()
|
||||
{
|
||||
size_t uncompressed_size = pos - working_buffer.begin();
|
||||
compressed_buffer.resize(uncompressed_size + QUICKLZ_ADDITIONAL_SPACE);
|
||||
@ -41,11 +41,10 @@ public:
|
||||
out.write(reinterpret_cast<const char *>(&checksum), sizeof(checksum));
|
||||
|
||||
out.write(&compressed_buffer[0], compressed_size);
|
||||
pos = working_buffer.begin();
|
||||
compressed_bytes += compressed_size;
|
||||
}
|
||||
|
||||
/// Объём данных, которые были сжаты
|
||||
/// Объём сжатых данных
|
||||
size_t getCompressedBytes()
|
||||
{
|
||||
nextIfAtEnd();
|
||||
|
@ -18,7 +18,7 @@ namespace DB
|
||||
* В отличие от std::istream, предоставляет доступ к внутреннему буферу,
|
||||
* а также позволяет вручную управлять позицией внутри буфера.
|
||||
*
|
||||
* Наследники должны реализовать метод next().
|
||||
* Наследники должны реализовать метод nextImpl().
|
||||
*/
|
||||
class ReadBuffer
|
||||
{
|
||||
@ -53,7 +53,13 @@ public:
|
||||
/** прочитать следующие данные и заполнить ими буфер; переместить позицию в начало;
|
||||
* вернуть false в случае конца, true иначе; кинуть исключение, если что-то не так
|
||||
*/
|
||||
virtual bool next() { return false; }
|
||||
inline bool next()
|
||||
{
|
||||
bytes_read += pos - working_buffer.begin();
|
||||
bool res = nextImpl();
|
||||
pos = working_buffer.begin();
|
||||
return res;
|
||||
}
|
||||
|
||||
virtual ~ReadBuffer() {}
|
||||
|
||||
@ -73,10 +79,7 @@ public:
|
||||
void ignore()
|
||||
{
|
||||
if (!eof())
|
||||
{
|
||||
++pos;
|
||||
++bytes_read;
|
||||
}
|
||||
else
|
||||
throw Exception("Attempt to read after eof", ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF);
|
||||
}
|
||||
@ -88,7 +91,6 @@ public:
|
||||
size_t bytes_to_ignore = std::min(static_cast<size_t>(working_buffer.end() - pos), n);
|
||||
pos += bytes_to_ignore;
|
||||
n -= bytes_to_ignore;
|
||||
bytes_read += bytes_to_ignore;
|
||||
}
|
||||
|
||||
if (n)
|
||||
@ -108,7 +110,6 @@ public:
|
||||
bytes_copied += bytes_to_copy;
|
||||
}
|
||||
|
||||
bytes_read += bytes_copied;
|
||||
return bytes_copied;
|
||||
}
|
||||
|
||||
@ -120,9 +121,10 @@ public:
|
||||
}
|
||||
|
||||
|
||||
/** Сколько байт было прочитано из буфера. */
|
||||
size_t count()
|
||||
{
|
||||
return bytes_read;
|
||||
return bytes_read + pos - working_buffer.begin();
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -132,6 +134,13 @@ protected:
|
||||
|
||||
private:
|
||||
size_t bytes_read;
|
||||
|
||||
|
||||
/** Прочитать следующие данные и заполнить ими буфер.
|
||||
* Вернуть false в случае конца, true иначе.
|
||||
* Кинуть исключение, если что-то не так.
|
||||
*/
|
||||
virtual bool nextImpl() { return false; };
|
||||
};
|
||||
|
||||
|
||||
|
@ -20,11 +20,10 @@ private:
|
||||
public:
|
||||
ReadBufferFromIStream(std::istream & istr_) : istr(istr_) {}
|
||||
|
||||
bool next()
|
||||
bool nextImpl()
|
||||
{
|
||||
istr.read(working_buffer.begin(), DEFAULT_READ_BUFFER_SIZE);
|
||||
|
||||
pos = working_buffer.begin();
|
||||
working_buffer = Buffer(working_buffer.begin(), working_buffer.begin() + istr.gcount());
|
||||
|
||||
if (working_buffer.end() == working_buffer.begin())
|
||||
|
@ -15,7 +15,7 @@ namespace DB
|
||||
* В отличие от std::ostream, предоставляет доступ к внутреннему буферу,
|
||||
* а также позволяет вручную управлять позицией внутри буфера.
|
||||
*
|
||||
* Наследники должны реализовать метод next().
|
||||
* Наследники должны реализовать метод nextImpl().
|
||||
*/
|
||||
class WriteBuffer
|
||||
{
|
||||
@ -51,7 +51,12 @@ public:
|
||||
/** записать данные, находящиеся в буфере (от начала буфера до текущей позиции);
|
||||
* переместить позицию в начало; кинуть исключение, если что-то не так
|
||||
*/
|
||||
virtual void next() {}
|
||||
inline void next()
|
||||
{
|
||||
bytes_written += pos - working_buffer.begin();
|
||||
nextImpl();
|
||||
pos = working_buffer.begin();
|
||||
}
|
||||
|
||||
/** желательно в наследниках поместить в деструктор вызов next(),
|
||||
* чтобы последние данные записались
|
||||
@ -78,8 +83,6 @@ public:
|
||||
pos += bytes_to_copy;
|
||||
bytes_copied += bytes_to_copy;
|
||||
}
|
||||
|
||||
bytes_written += n;
|
||||
}
|
||||
|
||||
|
||||
@ -88,13 +91,13 @@ public:
|
||||
nextIfAtEnd();
|
||||
*pos = x;
|
||||
++pos;
|
||||
++bytes_written;
|
||||
}
|
||||
|
||||
|
||||
/** Сколько байт было записано в буфер. */
|
||||
size_t count()
|
||||
{
|
||||
return bytes_written;
|
||||
return bytes_written + pos - working_buffer.begin();
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -104,6 +107,12 @@ protected:
|
||||
|
||||
private:
|
||||
size_t bytes_written;
|
||||
|
||||
|
||||
/** Записать данные, находящиеся в буфере (от начала буфера до текущей позиции).
|
||||
* Кинуть исключение, если что-то не так.
|
||||
*/
|
||||
virtual void nextImpl() = 0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -20,11 +20,10 @@ private:
|
||||
public:
|
||||
WriteBufferFromOStream(std::ostream & ostr_) : ostr(ostr_) {}
|
||||
|
||||
void next()
|
||||
void nextImpl()
|
||||
{
|
||||
ostr.write(working_buffer.begin(), pos - working_buffer.begin());
|
||||
ostr.flush();
|
||||
pos = working_buffer.begin();
|
||||
|
||||
if (!ostr.good())
|
||||
throw Exception("Cannot write to ostream", ErrorCodes::CANNOT_WRITE_TO_OSTREAM);
|
||||
|
Loading…
Reference in New Issue
Block a user