forked from ipfs/go-ipfs-blockstore
-
Notifications
You must be signed in to change notification settings - Fork 0
/
idstore.go
87 lines (74 loc) · 1.69 KB
/
idstore.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package blockstore
import (
"context"
blocks "github.com/ipfs/go-block-format"
cid "github.com/ipfs/go-cid"
ib "github.com/ipfs/go-ipfs-blockstore"
mh "github.com/multiformats/go-multihash"
)
// idstore wraps a BlockStore to add support for identity hashes
type idstore struct {
bs ib.Blockstore
}
func NewIdStore(bs ib.Blockstore) ib.Blockstore {
return &idstore{bs}
}
func extractContents(k cid.Cid) (bool, []byte) {
dmh, err := mh.Decode(k.Hash())
if err != nil || dmh.Code != mh.IDENTITY {
return false, nil
}
return true, dmh.Digest
}
func (b *idstore) DeleteBlock(k cid.Cid) error {
isId, _ := extractContents(k)
if isId {
return nil
}
return b.bs.DeleteBlock(k)
}
func (b *idstore) Has(k cid.Cid) (bool, error) {
isId, _ := extractContents(k)
if isId {
return true, nil
}
return b.bs.Has(k)
}
func (b *idstore) GetSize(k cid.Cid) (int, error) {
isId, bdata := extractContents(k)
if isId {
return len(bdata), nil
}
return b.bs.GetSize(k)
}
func (b *idstore) Get(k cid.Cid) (blocks.Block, error) {
isId, bdata := extractContents(k)
if isId {
return blocks.NewBlockWithCid(bdata, k)
}
return b.bs.Get(k)
}
func (b *idstore) Put(bl blocks.Block) error {
isId, _ := extractContents(bl.Cid())
if isId {
return nil
}
return b.bs.Put(bl)
}
func (b *idstore) PutMany(bs []blocks.Block) error {
toPut := make([]blocks.Block, 0, len(bs))
for _, bl := range bs {
isId, _ := extractContents(bl.Cid())
if isId {
continue
}
toPut = append(toPut, bl)
}
return b.bs.PutMany(toPut)
}
func (b *idstore) HashOnRead(enabled bool) {
b.bs.HashOnRead(enabled)
}
func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
return b.bs.AllKeysChan(ctx)
}