+
+string TarSegmentStore::write_object(const char *data, size_t len, const
+ std::string &group)
+{
+ struct segment_info *segment;
+
+ // Find the segment into which the object should be written, looking up by
+ // group. If no segment exists yet, create one.
+ if (segments.find(group) == segments.end()) {
+ segment = new segment_info;
+
+ uint8_t uuid[16];
+ char uuid_buf[40];
+ uuid_generate(uuid);
+ uuid_unparse_lower(uuid, uuid_buf);
+ segment->name = uuid_buf;
+
+ string filename = path + "/" + segment->name + ".tar";
+ segment->file = new Tarfile(filename, segment->name);
+
+ segment->count = 0;
+
+ segments[group] = segment;
+ } else {
+ segment = segments[group];
+ }
+
+ int id = segment->count;
+ char id_buf[64];
+ sprintf(id_buf, "%08x", id);
+
+ segment->file->write_object(id, data, len);
+ segment->count++;
+
+ return segment->name + "/" + id_buf;
+}
+
+void TarSegmentStore::sync()
+{
+ while (!segments.empty()) {
+ const string &name = segments.begin()->first;
+ struct segment_info *segment = segments[name];
+
+ fprintf(stderr, "Closing segment group %s (%s)\n",
+ name.c_str(), segment->name.c_str());
+
+ delete segment->file;
+ segments.erase(segments.begin());
+ delete segment;
+ }
+}