From 6bfd8dff52fce3fbe734ea03f6b7ee4d16719e48 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Wed, 2 Jul 2025 01:33:01 +0800 Subject: [PATCH] core/rawdb: fill in the missing method Signed-off-by: jsvisa --- core/rawdb/chain_freezer.go | 4 ++++ core/rawdb/database.go | 5 +++++ core/rawdb/freezer_memory.go | 23 +++++++++++++++++++++++ core/rawdb/table.go | 6 ++++++ 4 files changed, 38 insertions(+) diff --git a/core/rawdb/chain_freezer.go b/core/rawdb/chain_freezer.go index c12f2ab8fe..db607b1493 100644 --- a/core/rawdb/chain_freezer.go +++ b/core/rawdb/chain_freezer.go @@ -403,6 +403,10 @@ func (f *chainFreezer) AncientRange(kind string, start, count, maxBytes uint64) return f.ancients.AncientRange(kind, start, count, maxBytes) } +func (f *chainFreezer) AncientBytes(kind string, item, offset, length uint64) ([]byte, error) { + return f.ancients.AncientBytes(kind, item, offset, length) +} + func (f *chainFreezer) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (int64, error) { return f.ancients.ModifyAncients(fn) } diff --git a/core/rawdb/database.go b/core/rawdb/database.go index 626d390c0d..bfe8c9a79f 100644 --- a/core/rawdb/database.go +++ b/core/rawdb/database.go @@ -100,6 +100,11 @@ func (db *nofreezedb) AncientRange(kind string, start, max, maxByteSize uint64) return nil, errNotSupported } +// AncientBytes retrieves a byte range [offset:offset+length] from the specified ancient item. +func (db *nofreezedb) AncientBytes(kind string, item, offset, length uint64) ([]byte, error) { + return nil, errNotSupported +} + // Ancients returns an error as we don't have a backing chain freezer. func (db *nofreezedb) Ancients() (uint64, error) { return 0, errNotSupported diff --git a/core/rawdb/freezer_memory.go b/core/rawdb/freezer_memory.go index f5621ac4c6..24e0dadda4 100644 --- a/core/rawdb/freezer_memory.go +++ b/core/rawdb/freezer_memory.go @@ -412,3 +412,26 @@ func (f *MemoryFreezer) Reset() error { func (f *MemoryFreezer) AncientDatadir() (string, error) { return "", nil } + +// AncientBytes retrieves a byte range [offset:offset+length] from the specified ancient item in memory. +func (f *MemoryFreezer) AncientBytes(kind string, item, offset, length uint64) ([]byte, error) { + f.lock.RLock() + defer f.lock.RUnlock() + + table := f.tables[kind] + if table == nil { + return nil, errUnknownTable + } + entries, err := table.retrieve(item, 1, 0) + if err != nil { + return nil, err + } + if len(entries) == 0 { + return nil, errOutOfBounds + } + data := entries[0] + if offset > uint64(len(data)) || offset+length > uint64(len(data)) { + return nil, fmt.Errorf("requested range out of bounds: item size %d, offset %d, length %d", len(data), offset, length) + } + return data[offset : offset+length], nil +} diff --git a/core/rawdb/table.go b/core/rawdb/table.go index 45c8aecf0c..4d70059e8b 100644 --- a/core/rawdb/table.go +++ b/core/rawdb/table.go @@ -62,6 +62,12 @@ func (t *table) AncientRange(kind string, start, count, maxBytes uint64) ([][]by return t.db.AncientRange(kind, start, count, maxBytes) } +// AncientBytes is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) AncientBytes(kind string, item, offset, length uint64) ([]byte, error) { + return t.db.AncientBytes(kind, item, offset, length) +} + // Ancients is a noop passthrough that just forwards the request to the underlying // database. func (t *table) Ancients() (uint64, error) {