diff options
| author | Fuwn <[email protected]> | 2026-02-26 15:19:05 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-26 15:19:05 -0800 |
| commit | 4c13bd523d4deb36d8e7dfce6d446f701674e073 (patch) | |
| tree | d189cbbf09742c6b9408a5450db34dba34fe3074 /internal/storage | |
| parent | feat: harden launch readiness with versioning, metrics, and resilience (diff) | |
| download | plutia-test-4c13bd523d4deb36d8e7dfce6d446f701674e073.tar.xz plutia-test-4c13bd523d4deb36d8e7dfce6d446f701674e073.zip | |
feat: add read-only PLC API compatibility endpoints
Diffstat (limited to 'internal/storage')
| -rw-r--r-- | internal/storage/pebble_store.go | 27 | ||||
| -rw-r--r-- | internal/storage/store.go | 1 |
2 files changed, 28 insertions, 0 deletions
diff --git a/internal/storage/pebble_store.go b/internal/storage/pebble_store.go index 5e15d7e..109310f 100644 --- a/internal/storage/pebble_store.go +++ b/internal/storage/pebble_store.go @@ -228,6 +228,33 @@ func (p *PebbleStore) GetOpSeqRef(seq uint64) (types.BlockRefV1, bool, error) { return ref, true, nil } +func (p *PebbleStore) ForEachOpSeqRef(fn func(seq uint64, ref types.BlockRefV1) error) error { + iter, err := p.db.NewIter(&pebble.IterOptions{LowerBound: []byte("opseq:"), UpperBound: []byte("opseq;")}) + if err != nil { + return fmt.Errorf("new iterator: %w", err) + } + defer iter.Close() + + for iter.First(); iter.Valid(); iter.Next() { + key := iter.Key() + if len(key) < len("opseq:")+8 { + continue + } + seq := binary.BigEndian.Uint64(key[len("opseq:"):]) + var ref types.BlockRefV1 + if err := json.Unmarshal(iter.Value(), &ref); err != nil { + return fmt.Errorf("unmarshal opseq ref: %w", err) + } + if err := fn(seq, ref); err != nil { + return err + } + } + if err := iter.Error(); err != nil { + return fmt.Errorf("iterate opseq refs: %w", err) + } + return nil +} + func (p *PebbleStore) PutBlockHash(blockID uint64, hash string) error { return p.db.Set(blockKey(blockID), []byte(hash), pebble.Sync) } diff --git a/internal/storage/store.go b/internal/storage/store.go index 59055b7..05ce5ae 100644 --- a/internal/storage/store.go +++ b/internal/storage/store.go @@ -34,6 +34,7 @@ type Store interface { PutOpSeqRef(seq uint64, ref types.BlockRefV1) error GetOpSeqRef(seq uint64) (types.BlockRefV1, bool, error) + ForEachOpSeqRef(fn func(seq uint64, ref types.BlockRefV1) error) error PutBlockHash(blockID uint64, hash string) error GetBlockHash(blockID uint64) (string, bool, error) |