Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
KeyspaceSchema.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 KeyspaceSchema : public Schema<SettingsProvider> {
23public:
24 using Schema::Schema;
25
31 struct KeyspaceStatements : public Schema<SettingsProvider>::Statements {
32 using Schema<SettingsProvider>::Statements::Statements;
33
34 //
35 // Insert queries
36 //
37 PreparedStatement insertLedgerRange = [this]() {
38 return handle_.get().prepare(
39 fmt::format(
40 R"(
41 INSERT INTO {} (is_latest, sequence) VALUES (?, ?) IF NOT EXISTS
42 )",
43 qualifiedTableName(settingsProvider_.get(), "ledger_range")
44 )
45 );
46 }();
47
48 //
49 // Update (and "delete") queries
50 //
51 PreparedStatement updateLedgerRange = [this]() {
52 return handle_.get().prepare(
53 fmt::format(
54 R"(
55 UPDATE {}
56 SET sequence = ?
57 WHERE is_latest = ?
58 IF sequence = ?
59 )",
60 qualifiedTableName(settingsProvider_.get(), "ledger_range")
61 )
62 );
63 }();
64
65 PreparedStatement selectLedgerRange = [this]() {
66 return handle_.get().prepare(
67 fmt::format(
68 R"(
69 SELECT sequence
70 FROM {}
71 WHERE is_latest in (True, False)
72 )",
73 qualifiedTableName(settingsProvider_.get(), "ledger_range")
74 )
75 );
76 }();
77
78 //
79 // Select queries
80 //
81 PreparedStatement selectNFTsAfterTaxonKeyspaces = [this]() {
82 return handle_.get().prepare(
83 fmt::format(
84 R"(
85 SELECT token_id
86 FROM {}
87 WHERE issuer = ?
88 AND taxon > ?
89 ORDER BY taxon ASC, token_id ASC
90 LIMIT ?
91 )",
92 qualifiedTableName(settingsProvider_.get(), "issuer_nf_tokens_v2")
93 )
94 );
95 }();
96 };
97
98 void
99 prepareStatements(Handle const& handle) override
100 {
101 LOG(log_.info()) << "Preparing aws keyspace statements";
102 statements_ = std::make_unique<KeyspaceStatements>(settingsProvider_, handle);
103 LOG(log_.info()) << "Finished preparing statements";
104 }
105
111 std::unique_ptr<KeyspaceStatements> const&
113 {
114 return statements_;
115 }
116
117private:
118 std::unique_ptr<KeyspaceStatements> statements_{nullptr};
119};
120
121} // namespace data::cassandra
Represents a handle to the cassandra database cluster.
Definition Handle.hpp:27
Manages the DB schema and provides access to prepared statements.
Definition KeyspaceSchema.hpp:22
Schema(SettingsProviderType const &settingsProvider)
Shared Schema's between all Schema classes (Cassandra and Keyspace).
Definition Schema.hpp:54
std::unique_ptr< KeyspaceStatements > const & operator->() const
Provides access to statements.
Definition KeyspaceSchema.hpp:112
void prepareStatements(Handle const &handle) override
Recreates the prepared statements.
Definition KeyspaceSchema.hpp:99
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 Keyspace Schema object.
Definition KeyspaceSchema.hpp:31