diff options
| author | 2026-03-06 21:19:56 +0800 | |
|---|---|---|
| committer | 2026-03-07 00:34:30 +0800 | |
| commit | 01d15bccf3b1dcc51516b1f64d50950b31d7f8fb (patch) | |
| tree | e491fcc762c67c1ef4ce54faafc5dafdb734ae8a /objectstore/memory | |
| parent | objectstored/refstore: Weird ireturn behavior (diff) | |
| signature | No signature | |
Urgh I made some wrong amends and I'm too tired to separate the commits out this time
ancestor: Split out of reachability
mergebase: Add merge base routines
internal/commitquery: Add commit query context engine thingy
internal/peel: Shared tag peeling
errors: Shared object query errors
internal/testgit: Add rooted repo helpers; remove raw path access
objectstore/memory: Add in-memory object store
objectid: Add Compare helper
Diffstat (limited to 'objectstore/memory')
| -rw-r--r-- | objectstore/memory/add.go | 21 | ||||
| -rw-r--r-- | objectstore/memory/algorithm.go | 8 | ||||
| -rw-r--r-- | objectstore/memory/doc.go | 2 | ||||
| -rw-r--r-- | objectstore/memory/object.go | 9 | ||||
| -rw-r--r-- | objectstore/memory/read_bytes.go | 37 | ||||
| -rw-r--r-- | objectstore/memory/read_header.go | 17 | ||||
| -rw-r--r-- | objectstore/memory/read_reader.go | 29 | ||||
| -rw-r--r-- | objectstore/memory/read_size.go | 13 | ||||
| -rw-r--r-- | objectstore/memory/store.go | 24 |
9 files changed, 160 insertions, 0 deletions
diff --git a/objectstore/memory/add.go b/objectstore/memory/add.go new file mode 100644 index 00000000..80d0022f --- /dev/null +++ b/objectstore/memory/add.go @@ -0,0 +1,21 @@ +package memory + +import ( + "codeberg.org/lindenii/furgit/objectheader" + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objecttype" +) + +// AddObject stores one object body and returns its object ID. +func (store *Store) AddObject(ty objecttype.Type, body []byte) objectid.ObjectID { + header, ok := objectheader.Encode(ty, int64(len(body))) + if !ok { + panic("failed to encode object header") + } + + raw := append(append([]byte(nil), header...), body...) + id := store.algo.Sum(raw) + store.objects[id] = storedObject{ty: ty, content: append([]byte(nil), body...)} + + return id +} diff --git a/objectstore/memory/algorithm.go b/objectstore/memory/algorithm.go new file mode 100644 index 00000000..db43272e --- /dev/null +++ b/objectstore/memory/algorithm.go @@ -0,0 +1,8 @@ +package memory + +import "codeberg.org/lindenii/furgit/objectid" + +// Algorithm returns the object ID algorithm used by the store. +func (store *Store) Algorithm() objectid.Algorithm { + return store.algo +} diff --git a/objectstore/memory/doc.go b/objectstore/memory/doc.go new file mode 100644 index 00000000..cb40d466 --- /dev/null +++ b/objectstore/memory/doc.go @@ -0,0 +1,2 @@ +// Package memory provides one in-memory object store. +package memory diff --git a/objectstore/memory/object.go b/objectstore/memory/object.go new file mode 100644 index 00000000..940af328 --- /dev/null +++ b/objectstore/memory/object.go @@ -0,0 +1,9 @@ +package memory + +import "codeberg.org/lindenii/furgit/objecttype" + +// storedObject is one in-memory object entry. +type storedObject struct { + ty objecttype.Type + content []byte +} diff --git a/objectstore/memory/read_bytes.go b/objectstore/memory/read_bytes.go new file mode 100644 index 00000000..31c5b3d1 --- /dev/null +++ b/objectstore/memory/read_bytes.go @@ -0,0 +1,37 @@ +package memory + +import ( + "codeberg.org/lindenii/furgit/objectheader" + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objectstore" + "codeberg.org/lindenii/furgit/objecttype" +) + +// ReadBytesFull reads one full object, including the object header. +func (store *Store) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { + obj, ok := store.objects[id] + if !ok { + return nil, objectstore.ErrObjectNotFound + } + + header, ok := objectheader.Encode(obj.ty, int64(len(obj.content))) + if !ok { + panic("failed to encode object header") + } + + raw := make([]byte, len(header)+len(obj.content)) + copy(raw, header) + copy(raw[len(header):], obj.content) + + return raw, nil +} + +// ReadBytesContent reads one object body. +func (store *Store) ReadBytesContent(id objectid.ObjectID) (objecttype.Type, []byte, error) { + obj, ok := store.objects[id] + if !ok { + return objecttype.TypeInvalid, nil, objectstore.ErrObjectNotFound + } + + return obj.ty, append([]byte(nil), obj.content...), nil +} diff --git a/objectstore/memory/read_header.go b/objectstore/memory/read_header.go new file mode 100644 index 00000000..1d0aff15 --- /dev/null +++ b/objectstore/memory/read_header.go @@ -0,0 +1,17 @@ +package memory + +import ( + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objectstore" + "codeberg.org/lindenii/furgit/objecttype" +) + +// ReadHeader reads one object header. +func (store *Store) ReadHeader(id objectid.ObjectID) (objecttype.Type, int64, error) { + obj, ok := store.objects[id] + if !ok { + return objecttype.TypeInvalid, 0, objectstore.ErrObjectNotFound + } + + return obj.ty, int64(len(obj.content)), nil +} diff --git a/objectstore/memory/read_reader.go b/objectstore/memory/read_reader.go new file mode 100644 index 00000000..2e3feda1 --- /dev/null +++ b/objectstore/memory/read_reader.go @@ -0,0 +1,29 @@ +package memory + +import ( + "bytes" + "io" + + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objecttype" +) + +// ReadReaderFull reads one full object through a reader. +func (store *Store) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) { + raw, err := store.ReadBytesFull(id) + if err != nil { + return nil, err + } + + return io.NopCloser(bytes.NewReader(raw)), nil +} + +// ReadReaderContent reads one object body through a reader. +func (store *Store) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error) { + ty, content, err := store.ReadBytesContent(id) + if err != nil { + return objecttype.TypeInvalid, 0, nil, err + } + + return ty, int64(len(content)), io.NopCloser(bytes.NewReader(content)), nil +} diff --git a/objectstore/memory/read_size.go b/objectstore/memory/read_size.go new file mode 100644 index 00000000..3ca7789a --- /dev/null +++ b/objectstore/memory/read_size.go @@ -0,0 +1,13 @@ +package memory + +import "codeberg.org/lindenii/furgit/objectid" + +// ReadSize reads one object size. +func (store *Store) ReadSize(id objectid.ObjectID) (int64, error) { + _, size, err := store.ReadHeader(id) + if err != nil { + return 0, err + } + + return size, nil +} diff --git a/objectstore/memory/store.go b/objectstore/memory/store.go new file mode 100644 index 00000000..f7513094 --- /dev/null +++ b/objectstore/memory/store.go @@ -0,0 +1,24 @@ +package memory + +import ( + "codeberg.org/lindenii/furgit/objectid" +) + +// Store is one in-memory object store. +type Store struct { + algo objectid.Algorithm + objects map[objectid.ObjectID]storedObject +} + +// New builds one empty in-memory store for one object format. +func New(algo objectid.Algorithm) *Store { + return &Store{ + algo: algo, + objects: make(map[objectid.ObjectID]storedObject), + } +} + +// Close closes the in-memory store. +func (store *Store) Close() error { + return nil +} |
