Use doxygen-awesome theme (#1214)

For #889
This commit is contained in:
Alex Kremer
2024-02-27 15:22:44 +00:00
committed by GitHub
parent 98ebc92bff
commit 862fc48924
24 changed files with 3228 additions and 33 deletions

View File

@@ -24,6 +24,7 @@ if (NOT (BRANCH MATCHES master OR BRANCH MATCHES release/*)) # for develop and a
# YYYYMMDDHMS-<branch>-<git-rev> # YYYYMMDDHMS-<branch>-<git-rev>
execute_process(COMMAND date +%Y%m%d%H%M%S OUTPUT_VARIABLE DATE OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND date +%Y%m%d%H%M%S OUTPUT_VARIABLE DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
set(VERSION "${DATE}-${BRANCH}-${REV}") set(VERSION "${DATE}-${BRANCH}-${REV}")
set(DOC_CLIO_VERSION "develop")
else () else ()
set(GIT_COMMAND describe --tags) set(GIT_COMMAND describe --tags)
execute_process( execute_process(
@@ -31,6 +32,7 @@ else ()
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
) )
set(VERSION "${TAG_VERSION}-${REV}") set(VERSION "${TAG_VERSION}-${REV}")
set(DOC_CLIO_VERSION "${TAG_VERSION}")
endif () endif ()
if (CMAKE_BUILD_TYPE MATCHES Debug) if (CMAKE_BUILD_TYPE MATCHES Debug)

View File

@@ -1,16 +1,35 @@
PROJECT_NAME = "Clio" PROJECT_NAME = "Clio"
PROJECT_LOGO = ../docs/img/xrpl-logo.svg
PROJECT_NUMBER = @DOC_CLIO_VERSION@
PROJECT_BRIEF = The XRP Ledger API server.
INPUT = ../src ../unittests INPUT = ../src ../unittests
EXCLUDE_PATTERNS = *Test*.cpp *Test*.hpp EXCLUDE_PATTERNS = *Test*.cpp *Test*.hpp */impl/*
RECURSIVE = YES RECURSIVE = YES
HAVE_DOT = YES HAVE_DOT = YES
QUIET = YES QUIET = YES
WARNINGS = NO WARNINGS = YES
WARN_NO_PARAMDOC = NO WARN_NO_PARAMDOC = YES
WARN_IF_INCOMPLETE_DOC = NO WARN_IF_INCOMPLETE_DOC = YES
WARN_IF_UNDOCUMENTED = NO WARN_IF_UNDOCUMENTED = YES
WARN_AS_ERROR = FAIL_ON_WARNINGS
GENERATE_LATEX = NO GENERATE_LATEX = NO
GENERATE_HTML = YES GENERATE_HTML = YES
SORT_MEMBERS_CTORS_1ST = YES SORT_MEMBERS_CTORS_1ST = YES
GENERATE_TREEVIEW = YES
DISABLE_INDEX = NO
FULL_SIDEBAR = NO
HTML_HEADER = ../docs/doxygen-awesome-theme/header.html
HTML_EXTRA_STYLESHEET = ../docs/doxygen-awesome-theme/doxygen-awesome.css \
../docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only.css \
../docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only-darkmode-toggle.css
HTML_EXTRA_FILES = ../docs/doxygen-awesome-theme/doxygen-awesome-darkmode-toggle.js \
../docs/doxygen-awesome-theme/doxygen-awesome-interactive-toc.js
HTML_COLORSTYLE = LIGHT
HTML_COLORSTYLE_HUE = 209
HTML_COLORSTYLE_SAT = 255
HTML_COLORSTYLE_GAMMA = 113

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 - 2023 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,157 @@
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
MIT License
Copyright (c) 2021 - 2023 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
// SVG icons from https://fonts.google.com/icons
// Licensed under the Apache 2.0 license:
// https://www.apache.org/licenses/LICENSE-2.0.html
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
static title = "Toggle Light/Dark Mode"
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
static _staticConstructor = function() {
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
// Update the color scheme when the browsers preference changes
// without user interaction on the website.
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
})
// Update the color scheme when the tab is made visible again.
// It is possible that the appearance was changed in another tab
// while this tab was in the background.
document.addEventListener("visibilitychange", visibilityState => {
if (document.visibilityState === 'visible') {
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
}
});
}()
static init() {
$(function() {
$(document).ready(function() {
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
toggleButton.updateIcon()
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
toggleButton.updateIcon()
})
document.addEventListener("visibilitychange", visibilityState => {
if (document.visibilityState === 'visible') {
toggleButton.updateIcon()
}
});
$(document).ready(function(){
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
})
$(window).resize(function(){
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
})
})
})
}
constructor() {
super();
this.onclick=this.toggleDarkMode
}
/**
* @returns `true` for dark-mode, `false` for light-mode system preference
*/
static get systemPreference() {
return window.matchMedia('(prefers-color-scheme: dark)').matches
}
/**
* @returns `true` for dark-mode, `false` for light-mode user preference
*/
static get userPreference() {
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
}
static set userPreference(userPreference) {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
if(!userPreference) {
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
}
} else {
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
}
}
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
}
static enableDarkMode(enable) {
if(enable) {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
document.documentElement.classList.add("dark-mode")
document.documentElement.classList.remove("light-mode")
} else {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
document.documentElement.classList.remove("dark-mode")
document.documentElement.classList.add("light-mode")
}
}
static onSystemPreferenceChanged() {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
}
static onUserPreferenceChanged() {
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
}
toggleDarkMode() {
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
this.updateIcon()
}
updateIcon() {
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
} else {
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
}
}
}
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);

View File

@@ -0,0 +1,81 @@
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
MIT License
Copyright (c) 2022 - 2023 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
class DoxygenAwesomeInteractiveToc {
static topOffset = 38
static hideMobileMenu = true
static headers = []
static init() {
window.addEventListener("load", () => {
let toc = document.querySelector(".contents > .toc")
if(toc) {
toc.classList.add("interactive")
if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) {
toc.classList.add("open")
}
document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => {
if(toc.classList.contains("open")) {
toc.classList.remove("open")
} else {
toc.classList.add("open")
}
})
document.querySelectorAll(".contents > .toc > ul a").forEach((node) => {
let id = node.getAttribute("href").substring(1)
DoxygenAwesomeInteractiveToc.headers.push({
node: node,
headerNode: document.getElementById(id)
})
document.getElementById("doc-content")?.addEventListener("scroll", () => {
DoxygenAwesomeInteractiveToc.update()
})
})
DoxygenAwesomeInteractiveToc.update()
}
})
}
static update() {
let active = DoxygenAwesomeInteractiveToc.headers[0]?.node
DoxygenAwesomeInteractiveToc.headers.forEach((header) => {
let position = header.headerNode.getBoundingClientRect().top
header.node.classList.remove("active")
header.node.classList.remove("aboveActive")
if(position < DoxygenAwesomeInteractiveToc.topOffset) {
active = header.node
active?.classList.add("aboveActive")
}
})
active?.classList.add("active")
active?.classList.remove("aboveActive")
}
}

View File

@@ -0,0 +1,40 @@
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
MIT License
Copyright (c) 2021 - 2023 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
@media screen and (min-width: 768px) {
#MSearchBox {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
}
#MSearchField {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
}
}

View File

@@ -0,0 +1,116 @@
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
MIT License
Copyright (c) 2021 - 2023 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
html {
/* side nav width. MUST be = `TREEVIEW_WIDTH`.
* Make sure it is wide enough to contain the page title (logo + title + version)
*/
--side-nav-fixed-width: 335px;
--menu-display: none;
--top-height: 120px;
--toc-sticky-top: -25px;
--toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
}
#projectname {
white-space: nowrap;
}
@media screen and (min-width: 768px) {
html {
--searchbar-background: var(--page-background-color);
}
#side-nav {
min-width: var(--side-nav-fixed-width);
max-width: var(--side-nav-fixed-width);
top: var(--top-height);
overflow: visible;
}
#nav-tree, #side-nav {
height: calc(100vh - var(--top-height)) !important;
}
#nav-tree {
padding: 0;
}
#top {
display: block;
border-bottom: none;
height: var(--top-height);
margin-bottom: calc(0px - var(--top-height));
max-width: var(--side-nav-fixed-width);
overflow: hidden;
background: var(--side-nav-background);
}
#main-nav {
float: left;
padding-right: 0;
}
.ui-resizable-handle {
cursor: default;
width: 1px !important;
background: var(--separator-color);
box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color);
}
#nav-path {
position: fixed;
right: 0;
left: var(--side-nav-fixed-width);
bottom: 0;
width: auto;
}
#doc-content {
height: calc(100vh - 31px) !important;
padding-bottom: calc(3 * var(--spacing-large));
padding-top: calc(var(--top-height) - 80px);
box-sizing: border-box;
margin-left: var(--side-nav-fixed-width) !important;
}
#MSearchBox {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
}
#MSearchField {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
}
#MSearchResultsWindow {
left: var(--spacing-medium) !important;
right: auto;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,82 @@
<!-- HTML header for doxygen 1.9.7-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN FULL_SIDEBAR-->
<script type="text/javascript">var page_layout=1;</script>
<!--END FULL_SIDEBAR-->
<!--END DISABLE_INDEX-->
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
$darkmode
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">
DoxygenAwesomeDarkModeToggle.init()
</script>
<script type="text/javascript" src="$relpath^doxygen-awesome-interactive-toc.js"></script>
<script type="text/javascript">
DoxygenAwesomeInteractiveToc.init()
</script>
</head>
<body>
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN FULL_SIDEBAR-->
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
<!--END FULL_SIDEBAR-->
<!--END DISABLE_INDEX-->
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<!--BEGIN PROJECT_LOGO-->
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
<!--END PROJECT_LOGO-->
<!--BEGIN PROJECT_NAME-->
<td id="projectalign">
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber">&#160;$projectnumber</span><!--END PROJECT_NUMBER-->
</div>
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
</td>
<!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME-->
<!--BEGIN PROJECT_BRIEF-->
<td>
<div id="projectbrief">$projectbrief</div>
</td>
<!--END PROJECT_BRIEF-->
<!--END !PROJECT_NAME-->
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN SEARCHENGINE-->
<!--BEGIN !FULL_SIDEBAR-->
<td>$searchbox</td>
<!--END !FULL_SIDEBAR-->
<!--END SEARCHENGINE-->
<!--END DISABLE_INDEX-->
</tr>
<!--BEGIN SEARCHENGINE-->
<!--BEGIN FULL_SIDEBAR-->
<tr><td colspan="2">$searchbox</td></tr>
<!--END FULL_SIDEBAR-->
<!--END SEARCHENGINE-->
</tbody>
</table>
</div>
<!--END TITLEAREA-->
<!-- end header part -->

View File

@@ -48,6 +48,12 @@ namespace {
util::Logger gLog{"Backend"}; util::Logger gLog{"Backend"};
} // namespace } // namespace
/**
* @brief This namespace implements the data access layer and related components.
*
* The data layer is responsible for fetching and storing data from the database.
* Cassandra and ScyllaDB are currently supported via the `CassandraBackend` implementation.
*/
namespace data { namespace data {
bool bool
BackendInterface::finishWrites(std::uint32_t const ledgerSequence) BackendInterface::finishWrites(std::uint32_t const ledgerSequence)

View File

@@ -86,7 +86,7 @@ public:
/** /**
* @brief Update the cache with new ledger objects. * @brief Update the cache with new ledger objects.
* *
* @param blobs The ledger objects to update cache with * @param objs The ledger objects to update cache with
* @param seq The sequence to update cache for * @param seq The sequence to update cache for
* @param isBackground Should be set to true when writing old data from a background thread * @param isBackground Should be set to true when writing old data from a background thread
*/ */

View File

@@ -26,7 +26,7 @@ In Cassandra, Clio will be creating 9 tables to store the ledger data, they are
*Note, if you would like visually explore the data structure of the Cassandra database, you can first run Clio server with database `type` configured as `cassandra` to fill ledger data from Rippled nodes into Cassandra, then use a GUI database management tool like [Datastax's Opcenter](https://docs.datastax.com/en/install/6.0/install/opscInstallOpsc.html) to interactively view it.* *Note, if you would like visually explore the data structure of the Cassandra database, you can first run Clio server with database `type` configured as `cassandra` to fill ledger data from Rippled nodes into Cassandra, then use a GUI database management tool like [Datastax's Opcenter](https://docs.datastax.com/en/install/6.0/install/opscInstallOpsc.html) to interactively view it.*
### `ledger_transactions` ### ledger_transactions
``` ```
CREATE TABLE clio.ledger_transactions ( CREATE TABLE clio.ledger_transactions (
ledger_sequence bigint, # The sequence number of the ledger version ledger_sequence bigint, # The sequence number of the ledger version
@@ -36,7 +36,7 @@ CREATE TABLE clio.ledger_transactions (
``` ```
This table stores the hashes of all transactions in a given ledger sequence ordered by the hash value in ascending order. This table stores the hashes of all transactions in a given ledger sequence ordered by the hash value in ascending order.
### `transactions` ### transactions
``` ```
CREATE TABLE clio.transactions ( CREATE TABLE clio.transactions (
hash blob PRIMARY KEY, # The transaction hash hash blob PRIMARY KEY, # The transaction hash
@@ -50,7 +50,7 @@ This table stores the full transaction and metadata of each ledger version with
To look up all the transactions that were validated in a ledger version with sequence `n`, one can first get the all the transaction hashes in that ledger version by querying `SELECT * FROM ledger_transactions WHERE ledger_sequence = n;`. Then, iterate through the list of hashes and query `SELECT * FROM transactions WHERE hash = one_of_the_hash_from_the_list;` to get the detailed transaction data. To look up all the transactions that were validated in a ledger version with sequence `n`, one can first get the all the transaction hashes in that ledger version by querying `SELECT * FROM ledger_transactions WHERE ledger_sequence = n;`. Then, iterate through the list of hashes and query `SELECT * FROM transactions WHERE hash = one_of_the_hash_from_the_list;` to get the detailed transaction data.
### `ledger_hashes` ### ledger_hashes
``` ```
CREATE TABLE clio.ledger_hashes ( CREATE TABLE clio.ledger_hashes (
hash blob PRIMARY KEY, # Hash of entire ledger version's data hash blob PRIMARY KEY, # Hash of entire ledger version's data
@@ -58,7 +58,7 @@ CREATE TABLE clio.ledger_hashes (
) ... ) ...
``` ```
This table stores the hash of all ledger versions by their sequences. This table stores the hash of all ledger versions by their sequences.
### `ledger_range` ### ledger_range
``` ```
CREATE TABLE clio.ledger_range ( CREATE TABLE clio.ledger_range (
is_latest boolean PRIMARY KEY, # Whether this sequence is the stopping range is_latest boolean PRIMARY KEY, # Whether this sequence is the stopping range
@@ -67,7 +67,7 @@ CREATE TABLE clio.ledger_range (
``` ```
This table marks the range of ledger versions that is stored on this specific Cassandra node. Because of its nature, there are only two records in this table with `false` and `true` values for `is_latest`, marking the starting and ending sequence of the ledger range. This table marks the range of ledger versions that is stored on this specific Cassandra node. Because of its nature, there are only two records in this table with `false` and `true` values for `is_latest`, marking the starting and ending sequence of the ledger range.
### `objects` ### objects
``` ```
CREATE TABLE clio.objects ( CREATE TABLE clio.objects (
key blob, # Object index of the object key blob, # Object index of the object
@@ -80,7 +80,7 @@ This table stores the specific data of all objects that ever existed on the XRP
This table is updated when all data for a given ledger sequence has been written to the various tables in the database. For each ledger, many associated records are written to different tables. This table is used as a synchronization mechanism, to prevent the application from reading data from a ledger for which all data has not yet been fully written. This table is updated when all data for a given ledger sequence has been written to the various tables in the database. For each ledger, many associated records are written to different tables. This table is used as a synchronization mechanism, to prevent the application from reading data from a ledger for which all data has not yet been fully written.
### `ledgers` ### ledgers
``` ```
CREATE TABLE clio.ledgers ( CREATE TABLE clio.ledgers (
sequence bigint PRIMARY KEY, # Sequence of the ledger version sequence bigint PRIMARY KEY, # Sequence of the ledger version
@@ -89,7 +89,7 @@ CREATE TABLE clio.ledgers (
``` ```
This table stores the ledger header data of specific ledger versions by their sequence. This table stores the ledger header data of specific ledger versions by their sequence.
### `diff` ### diff
``` ```
CREATE TABLE clio.diff ( CREATE TABLE clio.diff (
seq bigint, # Sequence of the ledger version seq bigint, # Sequence of the ledger version
@@ -99,7 +99,7 @@ CREATE TABLE clio.diff (
``` ```
This table stores the object index of all the changes in each ledger version. This table stores the object index of all the changes in each ledger version.
### `account_tx` ### account_tx
``` ```
CREATE TABLE clio.account_tx ( CREATE TABLE clio.account_tx (
account blob, account blob,
@@ -110,8 +110,7 @@ CREATE TABLE clio.account_tx (
``` ```
This table stores the list of transactions affecting a given account. This includes transactions made by the account, as well as transactions received. This table stores the list of transactions affecting a given account. This includes transactions made by the account, as well as transactions received.
### successor
### `successor`
``` ```
CREATE TABLE clio.successor ( CREATE TABLE clio.successor (
key blob, # Object index key blob, # Object index
@@ -142,7 +141,7 @@ ledger. Because of this tradeoff, clio implements a special NFT indexing data
structure that allows clio users to query NFTs quickly, while keeping structure that allows clio users to query NFTs quickly, while keeping
rippled's space-saving optimizations. rippled's space-saving optimizations.
#### `nf_tokens` #### nf_tokens
``` ```
CREATE TABLE clio.nf_tokens ( CREATE TABLE clio.nf_tokens (
token_id blob, # The NFT's ID token_id blob, # The NFT's ID
@@ -166,7 +165,7 @@ use the `nft_history` API, which will give you the NFTokenBurn transaction
that burned this token, along with the account that submitted that that burned this token, along with the account that submitted that
transaction. transaction.
#### `issuer_nf_tokens_v2` #### issuer_nf_tokens_v2
``` ```
CREATE TABLE clio.issuer_nf_tokens_v2 ( CREATE TABLE clio.issuer_nf_tokens_v2 (
issuer blob, # The NFT issuer's account ID issuer blob, # The NFT issuer's account ID
@@ -181,7 +180,7 @@ issued, or all the NFTs a specific account issued with a specific taxon. It is
not useful to know all the NFTs with a given taxon while excluding issuer, since the not useful to know all the NFTs with a given taxon while excluding issuer, since the
meaning of a taxon is left to an issuer. meaning of a taxon is left to an issuer.
#### `nf_token_uris` #### nf_token_uris
``` ```
CREATE TABLE clio.nf_token_uris ( CREATE TABLE clio.nf_token_uris (
token_id blob, # The NFT's ID token_id blob, # The NFT's ID
@@ -206,7 +205,7 @@ version to rippled, but just in case we can handle that edge case by allowing
a given NFT ID to have a new URI assigned in this case, without removing the a given NFT ID to have a new URI assigned in this case, without removing the
prior URI. prior URI.
#### `nf_token_transactions` #### nf_token_transactions
``` ```
CREATE TABLE clio.nf_token_transactions ( CREATE TABLE clio.nf_token_transactions (
token_id blob, # The NFT's ID token_id blob, # The NFT's ID

View File

@@ -186,7 +186,7 @@ public:
* @brief Forward a request to rippled. * @brief Forward a request to rippled.
* *
* @param request The request to forward * @param request The request to forward
* @param clientIp IP of the client forwarding this request if known * @param forwardToRippledClientIp IP of the client forwarding this request if known
* @param yield The coroutine context * @param yield The coroutine context
* @return Response wrapped in an optional on success; nullopt otherwise * @return Response wrapped in an optional on success; nullopt otherwise
*/ */

View File

@@ -47,7 +47,7 @@ public:
* @brief Forward a request to rippled. * @brief Forward a request to rippled.
* *
* @param request The request to forward * @param request The request to forward
* @param clientIp IP of the client forwarding this request if known * @param forwardToRippledClientIp IP of the client forwarding this request if known
* @param yield The coroutine context * @param yield The coroutine context
* @return Response wrapped in an optional on success; nullopt otherwise * @return Response wrapped in an optional on success; nullopt otherwise
*/ */

View File

@@ -45,6 +45,11 @@
#include <thread> #include <thread>
#include <vector> #include <vector>
/**
* @brief This namespace implements everything related to subscriptions.
*
* The subscription manager is responsible for managing the subscriptions and publishing the feeds.
*/
namespace feed { namespace feed {
class SubscriptionManager { class SubscriptionManager {

View File

@@ -148,7 +148,7 @@ toJson(ripple::SLE const& sle);
/** /**
* @brief Convert a LedgerHeader to JSON object. * @brief Convert a LedgerHeader to JSON object.
* *
* @param entry The LedgerHeader to convert. * @param info The LedgerHeader to convert.
* @param binary Whether to convert in hex format. * @param binary Whether to convert in hex format.
* @param apiVersion The api version * @param apiVersion The api version
* @return The JSON object. * @return The JSON object.

View File

@@ -268,7 +268,6 @@ public:
* @brief Schedule an operation on the execution context * @brief Schedule an operation on the execution context
* *
* @param fn The block of code to execute. Signature is `Type()` where `Type` is the return type. * @param fn The block of code to execute. Signature is `Type()` where `Type` is the return type.
* @param timeout The timeout duration after which the operation will be cancelled
* @return A unstoppable operation that can be used to wait for the result * @return A unstoppable operation that can be used to wait for the result
*/ */
[[nodiscard]] auto [[nodiscard]] auto

View File

@@ -65,7 +65,7 @@ protected:
/** /**
* @brief Interface to serialize the value of the metric * @brief Interface to serialize the value of the metric
* *
* @return The serialized value * @param stream The stream to serialize into
*/ */
virtual void virtual void
serializeValue(OStream& stream) const = 0; serializeValue(OStream& stream) const = 0;

View File

@@ -47,7 +47,7 @@ public:
* @brief Construct a new Request Error object * @brief Construct a new Request Error object
* *
* @param message error message * @param message error message
* @param ec error code from boost::beast * @param errorCode error code from boost::beast
*/ */
RequestError(std::string message, boost::beast::error_code errorCode); RequestError(std::string message, boost::beast::error_code errorCode);

View File

@@ -59,7 +59,7 @@ public:
* *
* @param socket The socket. Ownership is transferred to HttpSession * @param socket The socket. Ownership is transferred to HttpSession
* @param ip Client's IP address * @param ip Client's IP address
* @param adminPassword The optional password to verify admin role in requests * @param adminVerification The admin verification strategy to use
* @param tagFactory A factory that is used to generate tags to track requests and sessions * @param tagFactory A factory that is used to generate tags to track requests and sessions
* @param dosGuard The denial of service guard to use * @param dosGuard The denial of service guard to use
* @param handler The server handler to use * @param handler The server handler to use

View File

@@ -77,7 +77,6 @@ public:
* @param backend The backend to use * @param backend The backend to use
* @param rpcEngine The RPC engine to use * @param rpcEngine The RPC engine to use
* @param etl The ETL to use * @param etl The ETL to use
* @param subscriptions The subscription manager to use
*/ */
RPCServerHandler( RPCServerHandler(
util::Config const& config, util::Config const& config,

View File

@@ -90,7 +90,7 @@ public:
* @param tagFactory A factory that is used to generate tags to track requests and sessions * @param tagFactory A factory that is used to generate tags to track requests and sessions
* @param dosGuard The denial of service guard to use * @param dosGuard The denial of service guard to use
* @param handler The server handler to use * @param handler The server handler to use
* @param adminPassword The optional password to verify admin role in requests * @param adminVerification The admin verification strategy to use
*/ */
Detector( Detector(
tcp::socket&& socket, tcp::socket&& socket,

View File

@@ -65,7 +65,7 @@ public:
* *
* @param socket The socket. Ownership is transferred to HttpSession * @param socket The socket. Ownership is transferred to HttpSession
* @param ip Client's IP address * @param ip Client's IP address
* @param adminPassword The optional password to verify admin role in requests * @param adminVerification The admin verification strategy to use
* @param ctx The SSL context * @param ctx The SSL context
* @param tagFactory A factory that is used to generate tags to track requests and sessions * @param tagFactory A factory that is used to generate tags to track requests and sessions
* @param dosGuard The denial of service guard to use * @param dosGuard The denial of service guard to use

View File

@@ -80,11 +80,11 @@ public:
/** /**
* @brief Send via shared_ptr of string, that enables SubscriptionManager to publish to clients. * @brief Send via shared_ptr of string, that enables SubscriptionManager to publish to clients.
* *
* @param msg The message to send * @param msg Unused
* @throws Not supported unless implemented in child classes. Will always throw std::logic_error. * @throws std::logic_error unless the function is overridden by a child class.
*/ */
virtual void virtual void
send(std::shared_ptr<std::string> /* msg */) send([[maybe_unused]] std::shared_ptr<std::string> msg)
{ {
throw std::logic_error("web server can not send the shared payload"); throw std::logic_error("web server can not send the shared payload");
} }