From e4a7aa0742f5070299d37e8421c99d67f0af3f90 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Wed, 25 Mar 2026 14:34:50 +0000 Subject: *: object/store -> object/storer --- object/storer/memory/add.go | 21 +++++++++++++++++++++ object/storer/memory/algorithm.go | 8 ++++++++ object/storer/memory/doc.go | 2 ++ object/storer/memory/object.go | 9 +++++++++ object/storer/memory/read_bytes.go | 37 +++++++++++++++++++++++++++++++++++++ object/storer/memory/read_header.go | 17 +++++++++++++++++ object/storer/memory/read_reader.go | 29 +++++++++++++++++++++++++++++ object/storer/memory/read_size.go | 13 +++++++++++++ object/storer/memory/refresh.go | 6 ++++++ object/storer/memory/store.go | 24 ++++++++++++++++++++++++ 10 files changed, 166 insertions(+) create mode 100644 object/storer/memory/add.go create mode 100644 object/storer/memory/algorithm.go create mode 100644 object/storer/memory/doc.go create mode 100644 object/storer/memory/object.go create mode 100644 object/storer/memory/read_bytes.go create mode 100644 object/storer/memory/read_header.go create mode 100644 object/storer/memory/read_reader.go create mode 100644 object/storer/memory/read_size.go create mode 100644 object/storer/memory/refresh.go create mode 100644 object/storer/memory/store.go (limited to 'object/storer/memory') diff --git a/object/storer/memory/add.go b/object/storer/memory/add.go new file mode 100644 index 00000000..3b27f52d --- /dev/null +++ b/object/storer/memory/add.go @@ -0,0 +1,21 @@ +package memory + +import ( + objectheader "codeberg.org/lindenii/furgit/object/header" + objectid "codeberg.org/lindenii/furgit/object/id" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + +// 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/object/storer/memory/algorithm.go b/object/storer/memory/algorithm.go new file mode 100644 index 00000000..bf7f3a82 --- /dev/null +++ b/object/storer/memory/algorithm.go @@ -0,0 +1,8 @@ +package memory + +import objectid "codeberg.org/lindenii/furgit/object/id" + +// Algorithm returns the object ID algorithm used by the store. +func (store *Store) Algorithm() objectid.Algorithm { + return store.algo +} diff --git a/object/storer/memory/doc.go b/object/storer/memory/doc.go new file mode 100644 index 00000000..cb40d466 --- /dev/null +++ b/object/storer/memory/doc.go @@ -0,0 +1,2 @@ +// Package memory provides one in-memory object store. +package memory diff --git a/object/storer/memory/object.go b/object/storer/memory/object.go new file mode 100644 index 00000000..a85175c7 --- /dev/null +++ b/object/storer/memory/object.go @@ -0,0 +1,9 @@ +package memory + +import objecttype "codeberg.org/lindenii/furgit/object/type" + +// storedObject is one in-memory object entry. +type storedObject struct { + ty objecttype.Type + content []byte +} diff --git a/object/storer/memory/read_bytes.go b/object/storer/memory/read_bytes.go new file mode 100644 index 00000000..72eaba11 --- /dev/null +++ b/object/storer/memory/read_bytes.go @@ -0,0 +1,37 @@ +package memory + +import ( + objectheader "codeberg.org/lindenii/furgit/object/header" + objectid "codeberg.org/lindenii/furgit/object/id" + "codeberg.org/lindenii/furgit/object/storer" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + +// 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, objectstorer.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, objectstorer.ErrObjectNotFound + } + + return obj.ty, append([]byte(nil), obj.content...), nil +} diff --git a/object/storer/memory/read_header.go b/object/storer/memory/read_header.go new file mode 100644 index 00000000..56979d3c --- /dev/null +++ b/object/storer/memory/read_header.go @@ -0,0 +1,17 @@ +package memory + +import ( + objectid "codeberg.org/lindenii/furgit/object/id" + "codeberg.org/lindenii/furgit/object/storer" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + +// 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, objectstorer.ErrObjectNotFound + } + + return obj.ty, int64(len(obj.content)), nil +} diff --git a/object/storer/memory/read_reader.go b/object/storer/memory/read_reader.go new file mode 100644 index 00000000..425c3034 --- /dev/null +++ b/object/storer/memory/read_reader.go @@ -0,0 +1,29 @@ +package memory + +import ( + "bytes" + "io" + + objectid "codeberg.org/lindenii/furgit/object/id" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + +// 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/object/storer/memory/read_size.go b/object/storer/memory/read_size.go new file mode 100644 index 00000000..7045bd61 --- /dev/null +++ b/object/storer/memory/read_size.go @@ -0,0 +1,13 @@ +package memory + +import objectid "codeberg.org/lindenii/furgit/object/id" + +// 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/object/storer/memory/refresh.go b/object/storer/memory/refresh.go new file mode 100644 index 00000000..1e18eef3 --- /dev/null +++ b/object/storer/memory/refresh.go @@ -0,0 +1,6 @@ +package memory + +// Refresh is a no-op for in-memory object stores. +func (store *Store) Refresh() error { + return nil +} diff --git a/object/storer/memory/store.go b/object/storer/memory/store.go new file mode 100644 index 00000000..8f212c38 --- /dev/null +++ b/object/storer/memory/store.go @@ -0,0 +1,24 @@ +package memory + +import ( + objectid "codeberg.org/lindenii/furgit/object/id" +) + +// 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 +} -- cgit v1.3.1-10-gc9f91