Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
CassandraSchema.hpp
1#pragma once
2
3#include "data/cassandra/Concepts.hpp"
4#include "data/cassandra/Handle.hpp"
5#include "data/cassandra/Schema.hpp"
6#include "data/cassandra/SettingsProvider.hpp"
7#include "data/cassandra/Types.hpp"
8#include "util/log/Logger.hpp"
9
10#include <boost/json/string.hpp>
11#include <fmt/compile.h>
12
13#include <functional>
14#include <memory>
15
16namespace data::cassandra {
17
21template <SomeSettingsProvider SettingsProviderType>
22class CassandraSchema : public Schema<SettingsProvider> {
23 using Schema::Schema;
24
25public:
31 struct CassandraStatements : public Schema<SettingsProvider>::Statements {
32 using Schema<SettingsProvider>::Statements::Statements;
33
34 //
35 // Update (and "delete") queries
36 //
37 PreparedStatement updateLedgerRange = [this]() {
38 return handle_.get().prepare(
39 fmt::format(
40 R"(
41 UPDATE {}
42 SET sequence = ?
43 WHERE is_latest = ?
44 IF sequence IN (?, null)
45 )",
46 qualifiedTableName(settingsProvider_.get(), "ledger_range")
47 )
48 );
49 }();
50
51 //
52 // Select queries
53 //
54
55 PreparedStatement selectNFTIDsByIssuer = [this]() {
56 return handle_.get().prepare(
57 fmt::format(
58 R"(
59 SELECT token_id
60 FROM {}
61 WHERE issuer = ?
62 AND (taxon, token_id) > ?
63 ORDER BY taxon ASC, token_id ASC
64 LIMIT ?
65 )",
66 qualifiedTableName(settingsProvider_.get(), "issuer_nf_tokens_v2")
67 )
68 );
69 }();
70
71 PreparedStatement selectAccountFromBeginning = [this]() {
72 return handle_.get().prepare(
73 fmt::format(
74 R"(
75 SELECT account
76 FROM {}
77 WHERE token(account) > 0
78 PER PARTITION LIMIT 1
79 LIMIT ?
80 )",
81 qualifiedTableName(settingsProvider_.get(), "account_tx")
82 )
83 );
84 }();
85
86 PreparedStatement selectAccountFromToken = [this]() {
87 return handle_.get().prepare(
88 fmt::format(
89 R"(
90 SELECT account
91 FROM {}
92 WHERE token(account) > token(?)
93 PER PARTITION LIMIT 1
94 LIMIT ?
95 )",
96 qualifiedTableName(settingsProvider_.get(), "account_tx")
97 )
98 );
99 }();
100
101 PreparedStatement selectLedgerPageKeys = [this]() {
102 return handle_.get().prepare(
103 fmt::format(
104 R"(
105 SELECT key
106 FROM {}
107 WHERE TOKEN(key) >= ?
108 AND sequence <= ?
109 PER PARTITION LIMIT 1
110 LIMIT ?
111 ALLOW FILTERING
112 )",
113 qualifiedTableName(settingsProvider_.get(), "objects")
114 )
115 );
116 }();
117
118 PreparedStatement selectLedgerPage = [this]() {
119 return handle_.get().prepare(
120 fmt::format(
121 R"(
122 SELECT object, key
123 FROM {}
124 WHERE TOKEN(key) >= ?
125 AND sequence <= ?
126 PER PARTITION LIMIT 1
127 LIMIT ?
128 ALLOW FILTERING
129 )",
130 qualifiedTableName(settingsProvider_.get(), "objects")
131 )
132 );
133 }();
134 };
135
136 void
137 prepareStatements(Handle const& handle) override
138 {
139 LOG(log_.info()) << "Preparing cassandra statements";
140 statements_ = std::make_unique<CassandraStatements>(settingsProvider_, handle);
141 LOG(log_.info()) << "Finished preparing statements";
142 }
143
149 std::unique_ptr<CassandraStatements> const&
151 {
152 return statements_;
153 }
154
155private:
156 std::unique_ptr<CassandraStatements> statements_{nullptr};
157};
158
159} // namespace data::cassandra
Manages the DB schema and provides access to prepared statements.
Definition CassandraSchema.hpp:22
std::unique_ptr< CassandraStatements > const & operator->() const
Provides access to statements.
Definition CassandraSchema.hpp:150
void prepareStatements(Handle const &handle) override
Recreates the prepared statements.
Definition CassandraSchema.hpp:137
Represents a handle to the cassandra database cluster.
Definition Handle.hpp:27
Statements(SettingsProviderType const &settingsProvider, Handle const &handle)
Construct a new Statements object.
Definition Schema.hpp:338
Schema(SettingsProviderType const &settingsProvider)
Shared Schema's between all Schema classes (Cassandra and Keyspace).
Definition Schema.hpp:54
Provides settings for BasicCassandraBackend.
Definition SettingsProvider.hpp:16
This namespace implements a wrapper for the Cassandra C++ driver.
Definition CassandraBackendFamily.hpp:47
std::string qualifiedTableName(SettingsProviderType const &provider, std::string_view name)
Returns the table name qualified with the keyspace and table prefix.
Definition Schema.hpp:27
Construct a new Cassandra Schema object.
Definition CassandraSchema.hpp:31