diff --git a/src/Neo/Persistence/IReadOnlyStore.cs b/src/Neo/Persistence/IReadOnlyStore.cs index 134b5b3ade..015a35a0a3 100644 --- a/src/Neo/Persistence/IReadOnlyStore.cs +++ b/src/Neo/Persistence/IReadOnlyStore.cs @@ -24,7 +24,7 @@ public interface IReadOnlyStore /// /// The key(i.e. start key) or prefix to be sought. /// The direction of seek. - /// An enumerator containing all the entries after seeking. + /// An enumerator containing all the entries after (Forward) or before(Backward) seeking. IEnumerable<(byte[] Key, byte[] Value)> Seek(byte[] keyOrPrefix, SeekDirection direction); /// diff --git a/src/Plugins/LevelDBStore/IO/Data/LevelDB/Helper.cs b/src/Plugins/LevelDBStore/IO/Data/LevelDB/Helper.cs index ff15c44377..de3e744750 100644 --- a/src/Plugins/LevelDBStore/IO/Data/LevelDB/Helper.cs +++ b/src/Plugins/LevelDBStore/IO/Data/LevelDB/Helper.cs @@ -20,6 +20,8 @@ public static class Helper { public static IEnumerable<(byte[], byte[])> Seek(this DB db, ReadOptions options, byte[] keyOrPrefix, SeekDirection direction) { + if (keyOrPrefix == null) keyOrPrefix = []; + using Iterator it = db.CreateIterator(options); if (direction == SeekDirection.Forward) { diff --git a/tests/Neo.Plugins.Storage.Tests/StoreTest.cs b/tests/Neo.Plugins.Storage.Tests/StoreTest.cs index ac1c8dc5ce..025040af8f 100644 --- a/tests/Neo.Plugins.Storage.Tests/StoreTest.cs +++ b/tests/Neo.Plugins.Storage.Tests/StoreTest.cs @@ -301,6 +301,20 @@ private void TestStorage(IStore store) CollectionAssert.AreEqual(new byte[] { 0x01 }, entries[0].Value); CollectionAssert.AreEqual(new byte[] { 0x00, 0x00, 0x00 }, entries[1].Key); CollectionAssert.AreEqual(new byte[] { 0x00 }, entries[1].Value); + + // Seek null + entries = store.Seek(null, SeekDirection.Forward).ToArray(); + Assert.AreEqual(3, entries.Length); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x00, 0x00 }, entries[0].Key); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x00, 0x01 }, entries[1].Key); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x01, 0x02 }, entries[2].Key); + + // Seek empty + entries = store.Seek([], SeekDirection.Forward).ToArray(); + Assert.AreEqual(3, entries.Length); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x00, 0x00 }, entries[0].Key); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x00, 0x01 }, entries[1].Key); + CollectionAssert.AreEqual(new byte[] { 0x00, 0x01, 0x02 }, entries[2].Key); } }