Add checksums to tarstore, and partially migrate to using it for storage.
[cumulus.git] / tarstore.h
1 /* LBS: An LFS-inspired filesystem backup system
2  * Copyright (C) 2006  Michael Vrable
3  *
4  * Backup data is stored in a collection of objects, which are grouped together
5  * into segments for storage purposes.  This implementation of the object store
6  * is built on top of libtar, and represents segments as TAR files and objects
7  * as files within them. */
8
9 #ifndef _LBS_TARSTORE_H
10 #define _LBS_TARSTORE_H
11
12 #include <stdint.h>
13 #include <libtar.h>
14
15 #include <string>
16 #include <iostream>
17 #include <sstream>
18
19 #include "store.h"
20
21 /* A simple wrapper around a single TAR file to represent a segment.  Objects
22  * may only be written out all at once, since the tar header must be written
23  * first; incremental writing is not supported. */
24 class Tarfile {
25 public:
26     Tarfile(const std::string &path, const std::string &segment);
27     ~Tarfile();
28
29     void write_object(int id, const char *data, size_t len);
30
31 private:
32     void internal_write_object(const std::string &path,
33                                const char *data, size_t len);
34
35     std::string segment_name;
36     std::ostringstream checksums;
37     TAR *t;
38 };
39
40 class TarSegmentStore {
41 public:
42     // New segments will be stored in the given directory.
43     TarSegmentStore(const std::string &path) { this->path = path; }
44     ~TarSegmentStore() { sync(); }
45
46     // Writes an object to segment in the store, and returns the name
47     // (segment/object) to refer to it.  The optional parameter group can be
48     // used to control object placement; objects with different group
49     // parameters are kept in separate segments.
50     std::string write_object(const char *data, size_t len,
51                              const std::string &group = "");
52
53     // Ensure all segments have been fully written.
54     void sync();
55
56 private:
57     struct segment_info {
58         Tarfile *file;
59         std::string name;       // UUID
60         int count;              // Objects written to this segment
61     };
62
63     std::string path;
64     std::map<std::string, struct segment_info *> segments;
65 };
66
67 #endif // _LBS_TARSTORE_H