1#pragma once
2
3#include <IO/ReadBuffer.h>
4#include <IO/HashingWriteBuffer.h>
5
6namespace DB
7{
8/*
9 * Calculates the hash from the read data. When reading, the data is read from the nested ReadBuffer.
10 * Small pieces are copied into its own memory.
11 */
12class HashingReadBuffer : public IHashingBuffer<ReadBuffer>
13{
14public:
15 HashingReadBuffer(ReadBuffer & in_, size_t block_size_ = DBMS_DEFAULT_HASHING_BLOCK_SIZE) :
16 IHashingBuffer<ReadBuffer>(block_size_), in(in_)
17 {
18 working_buffer = in.buffer();
19 pos = in.position();
20
21 /// calculate hash from the data already read
22 if (working_buffer.size())
23 {
24 calculateHash(pos, working_buffer.end() - pos);
25 }
26 }
27
28private:
29 bool nextImpl() override
30 {
31 in.position() = pos;
32 bool res = in.next();
33 working_buffer = in.buffer();
34 pos = in.position();
35
36 calculateHash(working_buffer.begin(), working_buffer.size());
37
38 return res;
39 }
40
41private:
42 ReadBuffer & in;
43};
44}
45