X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=store.cc;h=e7c373c6abbe839c7f9aff800b35dd6021b7e686;hb=7680a5bda8a87e1f5d02ea07ef767878e3bb143c;hp=06e94534555fdceaff45778fb888489d5cd8aec7;hpb=358b7ac6f741088838fb84979c9127976eb34fdf;p=cumulus.git diff --git a/store.cc b/store.cc index 06e9453..e7c373c 100644 --- a/store.cc +++ b/store.cc @@ -77,6 +77,11 @@ void OutputStream::write_varint(uint64_t val) } while (val); } +void OutputStream::write_uuid(const struct uuid &u) +{ + write(u.bytes, 16); +} + /* Write an arbitrary string by first writing out the length, followed by the * data itself. */ void OutputStream::write_string(const string &s) @@ -183,6 +188,14 @@ string encode_u64(uint64_t val) return s.contents(); } +string encode_objref(const struct uuid &segment, uint32_t object) +{ + StringOutputStream s; + s.write_uuid(segment); + s.write_u32(object); + return s.contents(); +} + SegmentWriter::SegmentWriter(OutputStream *output, struct uuid u) : raw_out(output), id(u), @@ -195,7 +208,7 @@ SegmentWriter::SegmentWriter(OutputStream *output, struct uuid u) /* Write out the segment header first. */ static const char signature[] = "LBSSEG0\n"; out->write(signature, strlen(signature)); - out->write(id.bytes, sizeof(struct uuid)); + out->write_uuid(id); } SegmentWriter::~SegmentWriter() @@ -230,7 +243,7 @@ SegmentWriter::~SegmentWriter() delete raw_out; } -OutputStream *SegmentWriter::new_object() +OutputStream *SegmentWriter::new_object(int *id) { if (object_stream) finish_object(); @@ -238,6 +251,10 @@ OutputStream *SegmentWriter::new_object() object_start_offset = out->get_pos(); object_stream = new WrapperOutputStream(*out); + if (id != NULL) { + *id = objects.size(); + } + return object_stream; } @@ -304,7 +321,7 @@ SegmentPartitioner::~SegmentPartitioner() delete segment; } -OutputStream *SegmentPartitioner::new_object() +OutputStream *SegmentPartitioner::new_object(struct uuid *uuid, int *id) { if (segment != NULL && segment->get_size() > target_size) { delete segment; @@ -314,5 +331,8 @@ OutputStream *SegmentPartitioner::new_object() if (segment == NULL) segment = store->new_segment(); - return segment->new_object(); + if (uuid != NULL) + *uuid = segment->get_uuid(); + + return segment->new_object(id); }