61 lines
1.4 KiB
Nim
61 lines
1.4 KiB
Nim
|
## Nim-Dagger
|
||
|
## Copyright (c) 2021 Status Research & Development GmbH
|
||
|
## Licensed under either of
|
||
|
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
||
|
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
||
|
## at your option.
|
||
|
## This file may not be copied, modified, or distributed except according to
|
||
|
## those terms.
|
||
|
|
||
|
import std/sequtils
|
||
|
import pkg/chronos
|
||
|
import pkg/libp2p
|
||
|
|
||
|
import ../stores/blockstore
|
||
|
import ../blocktype
|
||
|
|
||
|
export blockstore
|
||
|
|
||
|
type
|
||
|
MemoryStore* = ref object of BlockStore
|
||
|
blocks: seq[Block] # TODO: Should be an LRU cache
|
||
|
|
||
|
method getBlocks*(
|
||
|
s: MemoryStore,
|
||
|
cids: seq[Cid]): Future[seq[Block]] {.async.} =
|
||
|
## Get a block from the stores
|
||
|
##
|
||
|
|
||
|
var res: seq[Block]
|
||
|
for c in cids:
|
||
|
res.add(s.blocks.filterIt( it.cid == c ))
|
||
|
|
||
|
return res
|
||
|
|
||
|
method hasBlock*(s: MemoryStore, cid: Cid): bool =
|
||
|
## check if the block exists
|
||
|
##
|
||
|
|
||
|
s.blocks.filterIt( it.cid == cid ).len > 0
|
||
|
|
||
|
method putBlocks*(s: MemoryStore, blocks: seq[Block]) =
|
||
|
## Put a block to the blockstore
|
||
|
##
|
||
|
|
||
|
s.blocks.add(blocks)
|
||
|
procCall BlockStore(s).putBlocks(blocks)
|
||
|
|
||
|
method delBlocks*(s: MemoryStore, cids: seq[Cid]) =
|
||
|
## delete a block/s from the block store
|
||
|
##
|
||
|
|
||
|
for c in cids:
|
||
|
s.blocks.keepItIf( it.cid != c )
|
||
|
|
||
|
procCall BlockStore(s).delBlocks(cids)
|
||
|
|
||
|
proc new*(T: type MemoryStore, blocks: openArray[Block] = []): MemoryStore =
|
||
|
MemoryStore(
|
||
|
blocks: @blocks
|
||
|
)
|