X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=store.h;h=0bc21717dae7f9d63a2e5ba53beb6bf2415b80b6;hb=25b6639fb1783e0061affa177e6d6d2131c457f5;hp=0cd2c4baef790b4f25828c0da24215e52db65fe9;hpb=4a6945983fa171fa843c6f8955ba601f733f3ca5;p=cumulus.git diff --git a/store.h b/store.h index 0cd2c4b..0bc2171 100644 --- a/store.h +++ b/store.h @@ -16,6 +16,8 @@ #include #include +#include "sha1.h" + /* In memory datatype to represent key/value pairs of information, such as file * metadata. Currently implemented as map. */ typedef std::map dictionary; @@ -112,6 +114,26 @@ private: OutputStream ℜ }; +/* Like WrapperOutputStream, but additionally computes a checksum of data as it + * is written. */ +class ChecksumOutputStream : public OutputStream { +public: + explicit ChecksumOutputStream(OutputStream &o); + virtual ~ChecksumOutputStream() { } + + /* Once a checksum is computed, no further data should be written to the + * stream. */ + const uint8_t *finish_and_checksum(); + size_t checksum_size() const { return csum.checksum_size(); } + +protected: + virtual void write_internal(const void *data, size_t len); + +private: + OutputStream ℜ + SHA1Checksum csum; +}; + /* Simple wrappers that encode integers using a StringOutputStream and return * the encoded result. */ std::string encode_u16(uint16_t val); @@ -146,7 +168,8 @@ public: private: typedef std::vector > object_table; - OutputStream *out; + ChecksumOutputStream *out; // Output stream with checksumming enabled + OutputStream *raw_out; // Raw output stream, without checksumming struct uuid id; int64_t object_start_offset;