diff options
Diffstat (limited to 'object/store/dual/quarantine.go')
| -rw-r--r-- | object/store/dual/quarantine.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/object/store/dual/quarantine.go b/object/store/dual/quarantine.go new file mode 100644 index 00000000..ff561c7c --- /dev/null +++ b/object/store/dual/quarantine.go @@ -0,0 +1,113 @@ +package dual + +import ( + "io" + + objectid "codeberg.org/lindenii/furgit/object/id" + objectstore "codeberg.org/lindenii/furgit/object/store" + objectmix "codeberg.org/lindenii/furgit/object/store/mix" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + +// quarantine is one coordinated dual quarantine over both stores. +type quarantine struct { + objectQ objectstore.ObjectQuarantine + packQ objectstore.PackQuarantine + reader objectstore.Reader +} + +var ( + _ objectstore.ObjectQuarantine = (*quarantine)(nil) + _ objectstore.PackQuarantine = (*quarantine)(nil) +) + +func newQuarantine( + objectQ objectstore.ObjectQuarantine, + packQ objectstore.PackQuarantine, +) *quarantine { + return &quarantine{ + objectQ: objectQ, + packQ: packQ, + reader: objectmix.New(objectQ, packQ), + } +} + +// ReadBytesFull reads a full serialized object as "type size\0content" from +// either quarantined store. +func (quarantine *quarantine) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { + return quarantine.reader.ReadBytesFull(id) +} + +// ReadBytesContent reads an object's type and content bytes from either +// quarantined store. +func (quarantine *quarantine) ReadBytesContent(id objectid.ObjectID) (objecttype.Type, []byte, error) { + return quarantine.reader.ReadBytesContent(id) +} + +// ReadReaderFull reads a full serialized object stream as +// "type size\0content" from either quarantined store. +func (quarantine *quarantine) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) { + return quarantine.reader.ReadReaderFull(id) +} + +// ReadReaderContent reads an object's type, declared content length, and +// content stream from either quarantined store. +func (quarantine *quarantine) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error) { + return quarantine.reader.ReadReaderContent(id) +} + +// ReadSize reads an object's declared content length from either quarantined +// store. +func (quarantine *quarantine) ReadSize(id objectid.ObjectID) (int64, error) { + return quarantine.reader.ReadSize(id) +} + +// ReadHeader reads an object's type and declared content length from either +// quarantined store. +func (quarantine *quarantine) ReadHeader(id objectid.ObjectID) (objecttype.Type, int64, error) { + return quarantine.reader.ReadHeader(id) +} + +// Refresh refreshes both quarantined stores and the combined quarantined reader. +func (quarantine *quarantine) Refresh() error { + err := quarantine.objectQ.Refresh() + if err != nil { + return err + } + + err = quarantine.packQ.Refresh() + if err != nil { + return err + } + + return quarantine.reader.Refresh() +} + +// WriteReaderContent writes one typed object content stream to the quarantined +// object-wise store. +func (quarantine *quarantine) WriteReaderContent(ty objecttype.Type, size int64, src io.Reader) (objectid.ObjectID, error) { + return quarantine.objectQ.WriteReaderContent(ty, size, src) +} + +// WriteReaderFull writes one full serialized object stream as +// "type size\0content" to the quarantined object-wise store. +func (quarantine *quarantine) WriteReaderFull(src io.Reader) (objectid.ObjectID, error) { + return quarantine.objectQ.WriteReaderFull(src) +} + +// WriteBytesContent writes one typed object content byte slice to the +// quarantined object-wise store. +func (quarantine *quarantine) WriteBytesContent(ty objecttype.Type, content []byte) (objectid.ObjectID, error) { + return quarantine.objectQ.WriteBytesContent(ty, content) +} + +// WriteBytesFull writes one full serialized object byte slice as +// "type size\0content" to the quarantined object-wise store. +func (quarantine *quarantine) WriteBytesFull(raw []byte) (objectid.ObjectID, error) { + return quarantine.objectQ.WriteBytesFull(raw) +} + +// WritePack ingests one pack stream into the quarantined pack-wise store. +func (quarantine *quarantine) WritePack(src io.Reader, opts objectstore.PackWriteOptions) error { + return quarantine.packQ.WritePack(src, opts) +} |
