aboutsummaryrefslogtreecommitdiff
path: root/object/store/memory/reader.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-07 20:05:17 +0000
committerGravatar Runxi Yu2026-06-07 20:05:17 +0000
commita333aad3b26a7e48c9d31b493c5f971ddc0c09c1 (patch)
treec060bb206951cfd3044df680600aaa18170023cb /object/store/memory/reader.go
parentobject/store/dual: Add (diff)
object/store/memory: Add
Diffstat (limited to 'object/store/memory/reader.go')
-rw-r--r--object/store/memory/reader.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/object/store/memory/reader.go b/object/store/memory/reader.go
new file mode 100644
index 00000000..19723a6c
--- /dev/null
+++ b/object/store/memory/reader.go
@@ -0,0 +1,79 @@
+package memory
+
+import (
+ "bytes"
+ "io"
+
+ "lindenii.org/go/furgit/object/header"
+ "lindenii.org/go/furgit/object/id"
+ "lindenii.org/go/furgit/object/store"
+ "lindenii.org/go/furgit/object/typ"
+)
+
+// ReadBytesFull reads one full object, including the object header.
+func (memory *Memory) ReadBytesFull(id id.ObjectID) ([]byte, error) {
+ obj, ok := memory.objects.Load(id)
+ if !ok {
+ return nil, store.ErrObjectNotFound
+ }
+
+ raw := header.Append(nil, obj.ty, uint64(len(obj.content)))
+ raw = append(raw, obj.content...)
+
+ return raw, nil
+}
+
+// ReadBytesContent reads one object body.
+func (memory *Memory) ReadBytesContent(id id.ObjectID) (typ.Type, []byte, error) {
+ obj, ok := memory.objects.Load(id)
+ if !ok {
+ return typ.TypeUnknown, nil, store.ErrObjectNotFound
+ }
+
+ return obj.ty, append([]byte(nil), obj.content...), nil
+}
+
+// ReadHeader reads one object header.
+func (memory *Memory) ReadHeader(id id.ObjectID) (typ.Type, uint64, error) {
+ obj, ok := memory.objects.Load(id)
+ if !ok {
+ return typ.TypeUnknown, 0, store.ErrObjectNotFound
+ }
+
+ return obj.ty, uint64(len(obj.content)), nil
+}
+
+// ReadSize reads one object size.
+func (memory *Memory) ReadSize(id id.ObjectID) (uint64, error) {
+ _, size, err := memory.ReadHeader(id)
+ if err != nil {
+ return 0, err
+ }
+
+ return size, nil
+}
+
+// ReadReaderFull reads one full object through a reader.
+func (memory *Memory) ReadReaderFull(id id.ObjectID) (io.ReadCloser, error) {
+ raw, err := memory.ReadBytesFull(id)
+ if err != nil {
+ return nil, err
+ }
+
+ return io.NopCloser(bytes.NewReader(raw)), nil
+}
+
+// ReadReaderContent reads one object body through a reader.
+func (memory *Memory) ReadReaderContent(id id.ObjectID) (typ.Type, uint64, io.ReadCloser, error) {
+ ty, content, err := memory.ReadBytesContent(id)
+ if err != nil {
+ return typ.TypeUnknown, 0, nil, err
+ }
+
+ return ty, uint64(len(content)), io.NopCloser(bytes.NewReader(content)), nil
+}
+
+// Refresh is a no-op for in-memory object stores.
+func (memory *Memory) Refresh() error {
+ return nil
+}