mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
chore: split db abstraction into new crate (#8594)
This commit is contained in:
@ -1,59 +1,11 @@
|
||||
//! reth's database abstraction layer with concrete implementations.
|
||||
//! MDBX implementation for reth's database abstraction layer.
|
||||
//!
|
||||
//! The database abstraction assumes that the underlying store is a KV store subdivided into tables.
|
||||
//!
|
||||
//! One or more changes are tied to a transaction that is atomically committed to the data store at
|
||||
//! the same time. Strong consistency in what data is written and when is important for reth, so it
|
||||
//! is not possible to write data to the database outside of using a transaction.
|
||||
//!
|
||||
//! Good starting points for this crate are:
|
||||
//!
|
||||
//! - [`Database`] for the main database abstraction
|
||||
//! - [`DbTx`] (RO) and [`DbTxMut`] (RW) for the transaction abstractions.
|
||||
//! - [`DbCursorRO`] (RO) and [`DbCursorRW`] (RW) for the cursor abstractions (see below).
|
||||
//!
|
||||
//! # Cursors and Walkers
|
||||
//!
|
||||
//! The abstraction also defines a couple of helpful abstractions for iterating and writing data:
|
||||
//!
|
||||
//! - **Cursors** ([`DbCursorRO`] / [`DbCursorRW`]) for iterating data in a table. Cursors are
|
||||
//! assumed to resolve data in a sorted manner when iterating from start to finish, and it is safe
|
||||
//! to assume that they are efficient at doing so.
|
||||
//! - **Walkers** ([`Walker`] / [`RangeWalker`] / [`ReverseWalker`]) use cursors to walk the entries
|
||||
//! in a table, either fully from a specific point, or over a range.
|
||||
//!
|
||||
//! Dup tables (see below) also have corresponding cursors and walkers (e.g. [`DbDupCursorRO`]).
|
||||
//! These **should** be preferred when working with dup tables, as they provide additional methods
|
||||
//! that are optimized for dup tables.
|
||||
//!
|
||||
//! # Tables
|
||||
//!
|
||||
//! reth has two types of tables: simple KV stores (one key, one value) and dup tables (one key,
|
||||
//! many values). Dup tables can be efficient for certain types of data.
|
||||
//!
|
||||
//! Keys are de/serialized using the [`Encode`] and [`Decode`] traits, and values are de/serialized
|
||||
//! ("compressed") using the [`Compress`] and [`Decompress`] traits.
|
||||
//!
|
||||
//! Tables implement the [`Table`] trait.
|
||||
//! This crate is an implementation of [`reth-db-api`] for MDBX, as well as a few other common
|
||||
//! database types.
|
||||
//!
|
||||
//! # Overview
|
||||
//!
|
||||
//! An overview of the current data model of reth can be found in the [`mod@tables`] module.
|
||||
//!
|
||||
//! [`Database`]: crate::abstraction::database::Database
|
||||
//! [`DbTx`]: crate::abstraction::transaction::DbTx
|
||||
//! [`DbTxMut`]: crate::abstraction::transaction::DbTxMut
|
||||
//! [`DbCursorRO`]: crate::abstraction::cursor::DbCursorRO
|
||||
//! [`DbCursorRW`]: crate::abstraction::cursor::DbCursorRW
|
||||
//! [`Walker`]: crate::abstraction::cursor::Walker
|
||||
//! [`RangeWalker`]: crate::abstraction::cursor::RangeWalker
|
||||
//! [`ReverseWalker`]: crate::abstraction::cursor::ReverseWalker
|
||||
//! [`DbDupCursorRO`]: crate::abstraction::cursor::DbDupCursorRO
|
||||
//! [`Encode`]: crate::abstraction::table::Encode
|
||||
//! [`Decode`]: crate::abstraction::table::Decode
|
||||
//! [`Compress`]: crate::abstraction::table::Compress
|
||||
//! [`Decompress`]: crate::abstraction::table::Decompress
|
||||
//! [`Table`]: crate::abstraction::table::Table
|
||||
|
||||
#![doc(
|
||||
html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
|
||||
@ -63,9 +15,6 @@
|
||||
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
|
||||
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
|
||||
|
||||
/// Traits defining the database abstractions, such as cursors and transactions.
|
||||
pub mod abstraction;
|
||||
|
||||
mod implementation;
|
||||
pub mod lockfile;
|
||||
mod metrics;
|
||||
@ -77,24 +26,24 @@ pub mod version;
|
||||
#[cfg(feature = "mdbx")]
|
||||
pub mod mdbx;
|
||||
|
||||
pub use abstraction::*;
|
||||
pub use reth_storage_errors::db::{DatabaseError, DatabaseWriteOperation};
|
||||
pub use table::*;
|
||||
pub use tables::*;
|
||||
pub use utils::is_database_empty;
|
||||
|
||||
#[cfg(feature = "mdbx")]
|
||||
pub use mdbx::{create_db, init_db, open_db, open_db_read_only, DatabaseEnv, DatabaseEnvKind};
|
||||
|
||||
pub use reth_db_api::*;
|
||||
|
||||
/// Collection of database test utilities
|
||||
#[cfg(any(test, feature = "test-utils"))]
|
||||
pub mod test_utils {
|
||||
use super::*;
|
||||
use crate::{
|
||||
use crate::mdbx::DatabaseArguments;
|
||||
use reth_db_api::{
|
||||
database::Database,
|
||||
database_metrics::{DatabaseMetadata, DatabaseMetadataValue, DatabaseMetrics},
|
||||
mdbx::DatabaseArguments,
|
||||
models::client_version::ClientVersion,
|
||||
models::ClientVersion,
|
||||
};
|
||||
use reth_fs_util;
|
||||
use reth_libmdbx::MaxReadTransactionDuration;
|
||||
@ -228,20 +177,18 @@ pub mod test_utils {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::time::Duration;
|
||||
|
||||
use crate::{
|
||||
cursor::DbCursorRO,
|
||||
database::Database,
|
||||
init_db,
|
||||
mdbx::DatabaseArguments,
|
||||
models::client_version::ClientVersion,
|
||||
open_db, tables,
|
||||
transaction::DbTx,
|
||||
version::{db_version_file_path, DatabaseVersionError},
|
||||
};
|
||||
use assert_matches::assert_matches;
|
||||
use reth_db_api::{
|
||||
cursor::DbCursorRO, database::Database, models::ClientVersion, transaction::DbTx,
|
||||
};
|
||||
use reth_libmdbx::MaxReadTransactionDuration;
|
||||
use std::time::Duration;
|
||||
use tempfile::tempdir;
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user