From 51859528c5de1c90c553d1f174869005711f162a Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Thu, 3 May 2007 15:56:04 -0700 Subject: [PATCH] Start work on a more object-oriented interface for creating objects. --- scandir.cc | 25 +++++++++++++++++++------ store.cc | 26 ++++++++++++++++++++++++++ store.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/scandir.cc b/scandir.cc index f3bf302..223a99c 100644 --- a/scandir.cc +++ b/scandir.cc @@ -92,8 +92,12 @@ void dumpfile(int fd, dictionary &file_info, ostream &metadata) hash.process(block_buf, bytes); // tarstore processing - string blockid = tss->write_object(block_buf, bytes, "data"); - segment_list.push_back(blockid); + LbsObject *o = new LbsObject; + o->set_group("data"); + o->set_data(block_buf, bytes); + o->write(tss); + segment_list.push_back(o->get_name()); + delete o; size += bytes; } @@ -118,9 +122,13 @@ void dumpfile(int fd, dictionary &file_info, ostream &metadata) i != segment_list.end(); ++i) { blocklist += *i + "\n"; } - string indirect = tss->write_object(blocklist.data(), blocklist.size(), - "indirect"); - file_info["data"] = "@" + indirect; + + LbsObject *i = new LbsObject; + i->set_group("indirect"); + i->set_data(blocklist.data(), blocklist.size()); + i->write(tss); + file_info["data"] = "@" + i->get_name(); + delete i; } } @@ -279,7 +287,12 @@ int main(int argc, char *argv[]) } const string md = metadata.str(); - string root = tss->write_object(md.data(), md.size(), "root"); + + LbsObject *r = new LbsObject; + r->set_group("root"); + r->set_data(md.data(), md.size()); + r->write(tss); + delete r; tss->sync(); delete tss; diff --git a/store.cc b/store.cc index 00fd26c..804992f 100644 --- a/store.cc +++ b/store.cc @@ -6,6 +6,7 @@ * is built on top of libtar, and represents segments as TAR files and objects * as files within them. */ +#include #include #include #include @@ -183,3 +184,28 @@ string TarSegmentStore::object_reference_to_segment(const string &object) { return object; } + +LbsObject::LbsObject() + : group(""), data(NULL), data_len(0), written(false) +{ +} + +LbsObject::~LbsObject() +{ +} + +void LbsObject::add_reference(const LbsObject *o) +{ + // TODO: Implement +} + +void LbsObject::write(TarSegmentStore *store) +{ + assert(data != NULL); + assert(!written); + + name = store->write_object(data, data_len, group); + + written = true; + data = NULL; +} diff --git a/store.h b/store.h index 6acee7f..516a20c 100644 --- a/store.h +++ b/store.h @@ -21,6 +21,8 @@ #include "sha1.h" +class LbsObject; + /* In memory datatype to represent key/value pairs of information, such as file * metadata. Currently implemented as map. */ typedef std::map dictionary; @@ -101,4 +103,48 @@ private: std::string object_reference_to_segment(const std::string &object); }; +/* An in-memory representation of an object, which can be incrementally built + * before it is written out to a segment. */ +class LbsObject { +public: + LbsObject(); + ~LbsObject(); + + // If an object is placed in a group, it will be written out to segments + // only containing other objects in the same group. A group name is simply + // a string. + //std::string get_group() const { return group; } + void set_group(const std::string &g) { group = g; } + + // Data in an object must be written all at once, and cannot be generated + // incrementally. Data can be an arbitrary block of binary data of any + // size. The pointer to the data need only remain valid until write() is + // called. + //const char *get_data() const { return data; } + //size_t get_data_len() const { return data_len; } + void set_data(const char *d, size_t len) { data = d; data_len = len; } + + // Write an object to a segment, thus making it permanent. This function + // can be called at most once. + void write(TarSegmentStore *store); + + // An object is assigned a permanent name once it has been written to a + // segment. Until that time, its name cannot be determined. + std::string get_name() const { return name; } + + // Logically, one object may reference other objects (such as a metadata + // listing referncing actual file data blocks). Such references should be + // noted explicitly. It may eventually be used to build up a tree of + // checksums for later verifying integrity. + void add_reference(const LbsObject *o); + +private: + std::string group; + const char *data; + size_t data_len; + + bool written; + std::string name; +}; + #endif // _LBS_TARSTORE_H -- 2.20.1