6
6
#include " storage/ipfs/merkledag/impl/merkledag_service_impl.hpp"
7
7
8
8
#include < boost/assert.hpp>
9
+ #include < libp2p/multi/content_identifier_codec.hpp>
9
10
#include " storage/ipfs/merkledag/impl/node_impl.hpp"
10
11
12
+ using libp2p::multi::ContentIdentifierCodec;
13
+
11
14
namespace fc ::storage::ipfs::merkledag {
12
- MerkleDagServiceImpl::MerkleDagServiceImpl (std::shared_ptr<BlockService> service)
15
+ MerkleDagServiceImpl::MerkleDagServiceImpl (
16
+ std::shared_ptr<BlockService> service)
13
17
: block_service_{std::move (service)} {
14
18
BOOST_ASSERT_MSG (block_service_ != nullptr ,
15
19
" MerkleDAG service: Block service not connected" );
16
20
}
17
21
18
- outcome::result<void > MerkleDagServiceImpl::addNode (std::shared_ptr<const Node> node) {
22
+ outcome::result<void > MerkleDagServiceImpl::addNode (
23
+ std::shared_ptr<const Node> node) {
19
24
return block_service_->addBlock (*node);
20
25
}
21
26
@@ -29,6 +34,30 @@ namespace fc::storage::ipfs::merkledag {
29
34
return block_service_->removeBlock (cid);
30
35
}
31
36
37
+ outcome::result<size_t > MerkleDagServiceImpl::select (
38
+ gsl::span<const uint8_t > root_cid,
39
+ gsl::span<const uint8_t > selector,
40
+ std::function<bool (std::shared_ptr<const Node>)> handler) const {
41
+ std::ignore = selector;
42
+ OUTCOME_TRY (content_id, ContentIdentifierCodec::decode (root_cid));
43
+ CID cid{std::move (content_id)};
44
+ OUTCOME_TRY (root_node, getNode (cid));
45
+ std::vector<std::shared_ptr<const Node>> node_set{};
46
+ node_set.emplace_back (std::move (root_node));
47
+ const auto &links = node_set.front ()->getLinks ();
48
+ for (const auto & link : links) {
49
+ auto request = getNode (link.get ().getCID ());
50
+ if (request.has_error ()) return ServiceError::UNRESOLVED_LINK;
51
+ node_set.emplace_back (std::move (request.value ()));
52
+ }
53
+ size_t sent_count{};
54
+ for (const auto &node : node_set) {
55
+ ++sent_count;
56
+ if (!handler (node)) break ;
57
+ }
58
+ return sent_count;
59
+ }
60
+
32
61
outcome::result<std::shared_ptr<Leaf>> MerkleDagServiceImpl::fetchGraph (
33
62
const CID &cid) const {
34
63
OUTCOME_TRY (node, getNode (cid));
@@ -38,8 +67,9 @@ namespace fc::storage::ipfs::merkledag {
38
67
return root_leaf;
39
68
}
40
69
41
- outcome::result<std::shared_ptr<Leaf>> MerkleDagServiceImpl::fetchGraphOnDepth (
42
- const CID &cid, uint64_t depth) const {
70
+ outcome::result<std::shared_ptr<Leaf>>
71
+ MerkleDagServiceImpl::fetchGraphOnDepth (const CID &cid,
72
+ uint64_t depth) const {
43
73
OUTCOME_TRY (node, getNode (cid));
44
74
auto leaf = std::make_shared<LeafImpl>(node->content ());
45
75
auto result = buildGraph (leaf, node->getLinks (), true , depth, 0 );
0 commit comments