Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
 
Loading...
Searching...
No Matches
registry.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <list>
5#include <memory>
6#include <optional>
7#include <string>
8#include <vector>
9
10#include <absl/container/flat_hash_map.h>
11#include <absl/container/flat_hash_set.h>
12#include <spdlog/spdlog.h>
13
14#include "async.hpp"
15#include "pt.hpp"
16#include "address.hpp"
17#include "format_hash.hpp"
18#include "registry_store.hpp"
19
20namespace dcn::storage
21{
23
24 template<typename KeyT, typename ValueT>
25 struct LruCache
26 {
27 struct Entry
28 {
29 ValueT value;
30 typename std::list<KeyT>::iterator order_it;
31 };
32
33 const char * name = "unnamed-cache";
34 std::size_t capacity = 0;
35 std::list<KeyT> order;
36 absl::flat_hash_map<KeyT, Entry> entries;
37 };
38
40 {
41 public:
42 Registry() = delete;
43 Registry(asio::io_context & io_context, std::string sqlite_path = ":memory:");
44
45 Registry(const Registry&) = delete;
46 Registry& operator=(const Registry&) = delete;
47
48 ~Registry() = default;
49
50 asio::awaitable<bool> add(chain::Address address, ConnectorRecord connector);
51 asio::awaitable<bool> add(chain::Address address, TransformationRecord transformation);
52 asio::awaitable<bool> add(chain::Address address, ConditionRecord condition);
53
54 asio::awaitable<bool> addConnector(chain::Address address, ConnectorRecord connector);
55 asio::awaitable<bool> addConnectorsBatch(
56 std::vector<std::pair<chain::Address, ConnectorRecord>> connectors,
57 bool all_or_nothing = true);
58 asio::awaitable<std::optional<ConnectorRecordHandle>> getConnectorRecordHandle(
59 const std::string & name) const;
60 asio::awaitable<bool> hasConnector(const std::string & name) const;
61 asio::awaitable<std::optional<evmc::bytes32>> getFormatHash(const std::string& name) const;
62 asio::awaitable<std::size_t> getFormatConnectorNamesCount(const evmc::bytes32 & format_hash) const;
63 asio::awaitable<NameCursorPage> getFormatConnectorNamesCursor(
64 const evmc::bytes32 & format_hash,
65 const std::optional<NameCursor> & after,
66 std::size_t limit) const;
67 asio::awaitable<std::optional<std::vector<ScalarLabel>>> getScalarLabelsByFormatHash(const evmc::bytes32 & format_hash) const;
68
69 asio::awaitable<bool> addTransformation(chain::Address address, TransformationRecord transformation);
70 asio::awaitable<bool> addTransformationsBatch(
71 std::vector<std::pair<chain::Address, TransformationRecord>> transformations,
72 bool all_or_nothing = true);
73 asio::awaitable<std::optional<TransformationRecordHandle>> getTransformationRecordHandle(
74 const std::string & name) const;
75 asio::awaitable<bool> hasTransformation(const std::string & name) const;
76
77 asio::awaitable<bool> addCondition(chain::Address address, ConditionRecord condition);
78 asio::awaitable<bool> addConditionsBatch(
79 std::vector<std::pair<chain::Address, ConditionRecord>> conditions,
80 bool all_or_nothing = true);
81 asio::awaitable<std::optional<ConditionRecordHandle>> getConditionRecordHandle(
82 const std::string & name) const;
83 asio::awaitable<bool> hasCondition(const std::string & name) const;
84
85 asio::awaitable<NameCursorPage> getOwnedConnectorsCursor(
86 const chain::Address & owner,
87 const std::optional<NameCursor> & after,
88 std::size_t limit) const;
89 asio::awaitable<NameCursorPage> getOwnedTransformationsCursor(
90 const chain::Address & owner,
91 const std::optional<NameCursor> & after,
92 std::size_t limit) const;
93 asio::awaitable<NameCursorPage> getOwnedConditionsCursor(
94 const chain::Address & owner,
95 const std::optional<NameCursor> & after,
96 std::size_t limit) const;
97
98 asio::awaitable<bool> checkpointWal(WalCheckpointMode mode) const;
99
100 private:
101 static constexpr std::size_t kHotCacheCapacity = 1024;
102
103 asio::strand<asio::io_context::executor_type> _strand;
104 std::unique_ptr<IRegistryStore> _store;
105 mutable LruCache<std::string, std::optional<ConnectorRecordHandle>> _connector_record_cache;
106 mutable LruCache<std::string, std::optional<evmc::bytes32>> _format_hash_cache;
107 mutable LruCache<std::string, std::optional<TransformationRecordHandle>> _transformation_record_cache;
108 mutable LruCache<std::string, std::optional<ConditionRecordHandle>> _condition_record_cache;
109 };
110}
111
112
Definition registry.hpp:40
asio::awaitable< bool > addConnectorsBatch(std::vector< std::pair< chain::Address, ConnectorRecord > > connectors, bool all_or_nothing=true)
Definition registry.cpp:876
asio::awaitable< bool > hasTransformation(const std::string &name) const
Definition registry.cpp:1388
asio::awaitable< bool > addConnector(chain::Address address, ConnectorRecord connector)
Definition registry.cpp:750
asio::awaitable< NameCursorPage > getOwnedConnectorsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1639
Registry(const Registry &)=delete
asio::awaitable< bool > hasConnector(const std::string &name) const
Definition registry.cpp:1137
asio::awaitable< std::size_t > getFormatConnectorNamesCount(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1190
Registry & operator=(const Registry &)=delete
asio::awaitable< bool > add(chain::Address address, ConnectorRecord connector)
Definition registry.cpp:1672
asio::awaitable< bool > addTransformation(chain::Address address, TransformationRecord transformation)
Definition registry.cpp:1212
asio::awaitable< std::optional< ConditionRecordHandle > > getConditionRecordHandle(const std::string &name) const
Definition registry.cpp:1559
asio::awaitable< bool > hasCondition(const std::string &name) const
Definition registry.cpp:1600
asio::awaitable< std::optional< ConnectorRecordHandle > > getConnectorRecordHandle(const std::string &name) const
Definition registry.cpp:1096
asio::awaitable< std::optional< std::vector< ScalarLabel > > > getScalarLabelsByFormatHash(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1205
asio::awaitable< std::optional< TransformationRecordHandle > > getTransformationRecordHandle(const std::string &name) const
Definition registry.cpp:1344
asio::awaitable< bool > addConditionsBatch(std::vector< std::pair< chain::Address, ConditionRecord > > conditions, bool all_or_nothing=true)
Definition registry.cpp:1469
asio::awaitable< bool > addCondition(chain::Address address, ConditionRecord condition)
Definition registry.cpp:1427
asio::awaitable< NameCursorPage > getOwnedConditionsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1657
asio::awaitable< std::optional< evmc::bytes32 > > getFormatHash(const std::string &name) const
Definition registry.cpp:1176
asio::awaitable< NameCursorPage > getOwnedTransformationsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1648
asio::awaitable< NameCursorPage > getFormatConnectorNamesCursor(const evmc::bytes32 &format_hash, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1196
asio::awaitable< bool > addTransformationsBatch(std::vector< std::pair< chain::Address, TransformationRecord > > transformations, bool all_or_nothing=true)
Definition registry.cpp:1254
asio::awaitable< bool > checkpointWal(WalCheckpointMode mode) const
Definition registry.cpp:1666
std::string name
Definition ingestion.cpp:29
absl::flat_hash_map< std::string, ConditionRecord > conditions
Definition loader.cpp:28
absl::flat_hash_map< std::string, TransformationRecord > transformations
Definition loader.cpp:27
absl::flat_hash_map< std::string, ConnectorRecord > connectors
Definition loader.cpp:29
evmc::address Address
Definition address.hpp:18
Definition registry.hpp:21
WalCheckpointMode
Definition registry_store.hpp:51
Definition format_hash.hpp:26
Definition registry.hpp:28
std::list< KeyT >::iterator order_it
Definition registry.hpp:30
ValueT value
Definition registry.hpp:29
Definition registry.hpp:26
absl::flat_hash_map< KeyT, Entry > entries
Definition registry.hpp:36
std::size_t capacity
Definition registry.hpp:34
std::list< KeyT > order
Definition registry.hpp:35
const char * name
Definition registry.hpp:33