@cryptotaxi247 / kubo / commits / 9f542f879

abstracted merkledag service

Juan Batiz-Benet committed Jul 5, 2014 at 23:45 UTC 9f542f8797c11177c471881a1d8b717f855c8983
3 files changed +49 -18
cli/refs.go
+1 -1
@@ -60,7 +60,7 @@ func refCmd(c *commander.Command, inp []string) error {
60 printRefs = func(h mh.Multihash, recursive bool) {
61 nd, err := n.GetDagNode(u.Key(h))
62 if err != nil {
63 - u.PErr("error: cannot retrieve %s\n", h.B58String())
63 + u.PErr("error: cannot retrieve %s (%s)\n", h.B58String(), err)
64 return
65 }
66
core/core.go
+8 -17
@@ -37,6 +37,9 @@ type IpfsNode struct {
37 // the block service, get/add blocks.
38 Blocks *blocks.BlockService
39
40 + // the merkle dag service, get/add objects.
41 + DAG *merkledag.DAGService
42 +
43 // the path resolution system
44 // Resolver *resolver.PathResolver
45
@@ -59,35 +62,23 @@ func NewIpfsNode(cfg *config.Config) (*IpfsNode, error) {
62 return nil, err
63 }
64
65 + dag := &merkledag.DAGService{ Blocks: bs }
66 +
67 n := &IpfsNode{
68 Config: cfg,
69 PeerBook: &peer.PeerBook{},
70 Datastore: d,
71 Blocks: bs,
72 + DAG: dag,
73 }
74
75 return n, nil
76 }
77
78 func (n *IpfsNode) AddDagNode(nd *merkledag.Node) (u.Key, error) {
73 - d, err := nd.Encoded(false)
74 - if err != nil {
75 - return "", err
76 - }
77 -
78 - b, err := blocks.NewBlock(d)
79 - if err != nil {
80 - return "", err
81 - }
82 -
83 - return n.Blocks.AddBlock(b)
79 + return n.DAG.Put(nd)
80 }
81
82 func (n *IpfsNode) GetDagNode(k u.Key) (*merkledag.Node, error) {
87 - b, err := n.Blocks.GetBlock(k)
88 - if err != nil {
89 - return nil, err
90 - }
91 -
92 - return merkledag.Decoded(b.Data)
83 + return n.DAG.Get(k)
84 }
merkledag/merkledag.go
+40
@@ -1,6 +1,8 @@
1 package merkledag
2
3 import (
4 + "fmt"
5 + blocks "github.com/jbenet/go-ipfs/blocks"
6 u "github.com/jbenet/go-ipfs/util"
7 mh "github.com/jbenet/go-multihash"
8 )
@@ -79,3 +81,41 @@ func (n *Node) Key() (u.Key, error) {
81 h, err := n.Multihash()
82 return u.Key(h), err
83 }
84 +
85 +// An IPFS Merkle DAG service.
86 +// the root is virtual (like a forest)
87 +// stores nodes' data in a blockService
88 +type DAGService struct {
89 + Blocks *blocks.BlockService
90 +}
91 +
92 +func (n *DAGService) Put(nd *Node) (u.Key, error) {
93 + if n == nil {
94 + return "", fmt.Errorf("DAGService is nil")
95 + }
96 +
97 + d, err := nd.Encoded(false)
98 + if err != nil {
99 + return "", err
100 + }
101 +
102 + b, err := blocks.NewBlock(d)
103 + if err != nil {
104 + return "", err
105 + }
106 +
107 + return n.Blocks.AddBlock(b)
108 +}
109 +
110 +func (n *DAGService) Get(k u.Key) (*Node, error) {
111 + if n == nil {
112 + return nil, fmt.Errorf("DAGService is nil")
113 + }
114 +
115 + b, err := n.Blocks.GetBlock(k)
116 + if err != nil {
117 + return nil, err
118 + }
119 +
120 + return Decoded(b.Data)
121 +}