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"
20#include "sqlite/wal_store.hpp"
21
23{
25
26 template<typename KeyT, typename ValueT>
27 struct LruCache
28 {
29 struct Entry
30 {
31 ValueT value;
32 typename std::list<KeyT>::iterator order_it;
33 };
34
35 const char * name = "unnamed-cache";
36 std::size_t capacity = 0;
37 std::list<KeyT> order;
38 absl::flat_hash_map<KeyT, Entry> entries;
39 };
40
42 {
43 public:
44 Registry() = delete;
45 Registry(asio::io_context & io_context, std::string sqlite_path = ":memory:");
46
47 Registry(const Registry&) = delete;
48 Registry& operator=(const Registry&) = delete;
49
50 ~Registry() = default;
51
52 asio::awaitable<bool> add(chain::Address address, ConnectorRecord connector);
53 asio::awaitable<bool> add(chain::Address address, TransformationRecord transformation);
54 asio::awaitable<bool> add(chain::Address address, ConditionRecord condition);
55
56 asio::awaitable<bool> addConnector(chain::Address address, ConnectorRecord connector);
57 asio::awaitable<bool> addConnectorsBatch(
58 std::vector<std::pair<chain::Address, ConnectorRecord>> connectors,
59 bool all_or_nothing = true);
60
61 asio::awaitable<std::optional<ConnectorRecordHandle>> getConnectorRecordHandle(
62 const std::string & name) const;
63
64 asio::awaitable<bool> hasConnector(const std::string & name) const;
65
66 asio::awaitable<std::optional<evmc::bytes32>> getFormatHash(const std::string& name) const;
67
68 asio::awaitable<std::size_t> getFormatConnectorNamesCount(const evmc::bytes32 & format_hash) const;
69
70 asio::awaitable<NameCursorPage> getFormatConnectorNamesCursor(
71 const evmc::bytes32 & format_hash,
72 const std::optional<NameCursor> & after,
73 std::size_t limit) const;
74
75 asio::awaitable<std::size_t> getFormatsCount() const;
76
77 asio::awaitable<NameCursorPage> getFormatsCursor(
78 const std::optional<evmc::bytes32> & after,
79 std::size_t limit) const;
80
81 asio::awaitable<std::optional<std::vector<ScalarLabel>>> getScalarLabelsByFormatHash(const evmc::bytes32 & format_hash) const;
82
83 asio::awaitable<bool> addTransformation(chain::Address address, TransformationRecord transformation);
84 asio::awaitable<bool> addTransformationsBatch(
85 std::vector<std::pair<chain::Address, TransformationRecord>> transformations,
86 bool all_or_nothing = true);
87
88 asio::awaitable<std::optional<TransformationRecordHandle>> getTransformationRecordHandle(
89 const std::string & name) const;
90
91 asio::awaitable<bool> hasTransformation(const std::string & name) const;
92
93 asio::awaitable<bool> addCondition(chain::Address address, ConditionRecord condition);
94
95 asio::awaitable<bool> addConditionsBatch(
96 std::vector<std::pair<chain::Address, ConditionRecord>> conditions,
97 bool all_or_nothing = true);
98
99 asio::awaitable<std::optional<ConditionRecordHandle>> getConditionRecordHandle(
100 const std::string & name) const;
101
102 asio::awaitable<bool> hasCondition(const std::string & name) const;
103
104 asio::awaitable<NameCursorPage> getOwnedConnectorsCursor(
105 const chain::Address & owner,
106 const std::optional<NameCursor> & after,
107 std::size_t limit) const;
108
109 asio::awaitable<NameCursorPage> getOwnedTransformationsCursor(
110 const chain::Address & owner,
111 const std::optional<NameCursor> & after,
112 std::size_t limit) const;
113
114 asio::awaitable<NameCursorPage> getOwnedConditionsCursor(
115 const chain::Address & owner,
116 const std::optional<NameCursor> & after,
117 std::size_t limit) const;
118
119 asio::awaitable<std::size_t> getAccountsCount() const;
120
121 asio::awaitable<NameCursorPage> getAccountsCursor(
122 const std::optional<chain::Address> & after,
123 std::size_t limit) const;
124
125 asio::awaitable<storage::sqlite::WalCheckpointStats> checkpointWal(storage::sqlite::WalCheckpointMode mode) const override;
126
127 private:
128 static constexpr std::size_t kHotCacheCapacity = 1024;
129
130 asio::strand<asio::io_context::executor_type> _strand;
131 std::unique_ptr<IRegistryStore> _store;
132 mutable LruCache<std::string, std::optional<ConnectorRecordHandle>> _connector_record_cache;
133 mutable LruCache<std::string, std::optional<evmc::bytes32>> _format_hash_cache;
134 mutable LruCache<std::string, std::optional<TransformationRecordHandle>> _transformation_record_cache;
135 mutable LruCache<std::string, std::optional<ConditionRecordHandle>> _condition_record_cache;
136 };
137}
138
139
Definition registry.hpp:42
asio::awaitable< std::size_t > getFormatsCount() const
Definition registry.cpp:1200
asio::awaitable< std::size_t > getFormatConnectorNamesCount(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1185
asio::awaitable< bool > add(chain::Address address, ConnectorRecord connector)
Definition registry.cpp:1661
asio::awaitable< NameCursorPage > getFormatsCursor(const std::optional< evmc::bytes32 > &after, std::size_t limit) const
Definition registry.cpp:1206
asio::awaitable< storage::sqlite::WalCheckpointStats > checkpointWal(storage::sqlite::WalCheckpointMode mode) const override
Definition registry.cpp:1651
asio::awaitable< std::size_t > getAccountsCount() const
Definition registry.cpp:1637
asio::awaitable< std::optional< evmc::bytes32 > > getFormatHash(const std::string &name) const
Definition registry.cpp:1171
asio::awaitable< bool > hasCondition(const std::string &name) const
Definition registry.cpp:1579
asio::awaitable< bool > hasConnector(const std::string &name) const
Definition registry.cpp:1142
asio::awaitable< NameCursorPage > getOwnedConditionsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1628
asio::awaitable< bool > addTransformationsBatch(std::vector< std::pair< chain::Address, TransformationRecord > > transformations, bool all_or_nothing=true)
Definition registry.cpp:1263
asio::awaitable< std::optional< std::vector< ScalarLabel > > > getScalarLabelsByFormatHash(const evmc::bytes32 &format_hash) const
Definition registry.cpp:1214
asio::awaitable< bool > addConnectorsBatch(std::vector< std::pair< chain::Address, ConnectorRecord > > connectors, bool all_or_nothing=true)
Definition registry.cpp:893
asio::awaitable< std::optional< ConnectorRecordHandle > > getConnectorRecordHandle(const std::string &name) const
Definition registry.cpp:1113
asio::awaitable< bool > hasTransformation(const std::string &name) const
Definition registry.cpp:1386
asio::awaitable< NameCursorPage > getOwnedTransformationsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1619
asio::awaitable< NameCursorPage > getFormatConnectorNamesCursor(const evmc::bytes32 &format_hash, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1191
Registry(const Registry &)=delete
asio::awaitable< bool > addTransformation(chain::Address address, TransformationRecord transformation)
Definition registry.cpp:1221
asio::awaitable< std::optional< TransformationRecordHandle > > getTransformationRecordHandle(const std::string &name) const
Definition registry.cpp:1353
asio::awaitable< NameCursorPage > getAccountsCursor(const std::optional< chain::Address > &after, std::size_t limit) const
Definition registry.cpp:1643
asio::awaitable< bool > addConditionsBatch(std::vector< std::pair< chain::Address, ConditionRecord > > conditions, bool all_or_nothing=true)
Definition registry.cpp:1459
asio::awaitable< bool > addConnector(chain::Address address, ConnectorRecord connector)
Definition registry.cpp:767
asio::awaitable< NameCursorPage > getOwnedConnectorsCursor(const chain::Address &owner, const std::optional< NameCursor > &after, std::size_t limit) const
Definition registry.cpp:1610
asio::awaitable< std::optional< ConditionRecordHandle > > getConditionRecordHandle(const std::string &name) const
Definition registry.cpp:1549
asio::awaitable< bool > addCondition(chain::Address address, ConditionRecord condition)
Definition registry.cpp:1417
Registry & operator=(const Registry &)=delete
Definition wal_store.hpp:10
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:23
WalCheckpointMode
Definition wal.hpp:9
Definition format_hash.hpp:26
Definition registry.hpp:30
std::list< KeyT >::iterator order_it
Definition registry.hpp:32
ValueT value
Definition registry.hpp:31
Definition registry.hpp:28
std::list< KeyT > order
Definition registry.hpp:37
absl::flat_hash_map< KeyT, Entry > entries
Definition registry.hpp:38
std::size_t capacity
Definition registry.hpp:36
const char * name
Definition registry.hpp:35