Expand description
BonsaiDb is a developer-friendly document database for Rust that grows with you. Visit BonsaiDb.io to learn more about the features of BonsaiDb.
⚠️ Status of this project
BonsaiDb is considered alpha software. It is under active development (). There may still be bugs that result in data loss. All users should regularly back up their data and test that restoring from backup works correctly.
Example
To get an idea of how it works, this is a simple schema:
#[derive(Debug, Serialize, Deserialize)]
struct Shape {
pub sides: u32,
}
impl Collection for Shape {
fn collection_name() -> CollectionName {
CollectionName::new("khonsulabs", "shapes")
}
fn define_views(schema: &mut Schematic) -> Result<(), Error> {
schema.define_view(ShapesByNumberOfSides)
}
}
impl DefaultSerialization for Shape {}
#[derive(Debug, Clone)]
struct ShapesByNumberOfSides;
impl View for ShapesByNumberOfSides {
type Collection = Shape;
type Key = u32;
type Value = usize;
fn name(&self) -> Name {
Name::new("by-number-of-sides")
}
}
impl CollectionViewSchema for ShapesByNumberOfSides {
type View = Self;
fn map(&self, document: CollectionDocument<Shape>) -> ViewMapResult<Self::View> {
Ok(document.emit_key_and_value(document.contents.sides, 1))
}
fn reduce(
&self,
mappings: &[ViewMappedValue<Self>],
_rereduce: bool,
) -> ReduceResult<Self::View> {
Ok(mappings.iter().map(|m| m.value).sum())
}
}
impl DefaultViewSerialization for ShapesByNumberOfSides {}After you have your collection(s) defined, you can open up a database and insert documents:
let db = Database::open::<Shape>(StorageConfiguration::new("view-examples.bonsaidb")).await?;
// Insert a new document into the Shape collection.
Shape::new(3).push_into(&db).await?;And query data using the Map-Reduce-powered view:
let triangles = db
.view::<ShapesByNumberOfSides>()
.with_key(3)
.query()
.await?;
println!("Number of triangles: {}", triangles.len());See the examples README for a list of all available examples.
Feature Flags
No feature flags are enabled by default in the bonsaidb crate. This is
because in most Rust executables, you will only need a subset of the
functionality. If you’d prefer to enable everything, you can use the full
feature:
[dependencies]
bonsaidb = { version = "*", default-features = false, features = "full" }full: Enableslocal-full,server-full, andclient-full.cli: Enables thebonsaidbexecutable.password-hashing: Enables the ability to use password authentication using Argon2 viaAnyConnection.
Local databases only
[dependencies]
bonsaidb = { version = "*", default-features = false, features = "local-full" }local-full: Enables all the flags belowlocal: Enables thelocalmodule, which re-exports the cratebonsaidb-local.local-cli: Enables theStructOptstructures for embedding database management commands into your own command-line interface.local-encryption: Enables at-rest encryption.local-instrument: Enables instrumenting withtracing.local-multiuser: Enables multi-user support.local-password-hashing: Enables the ability to use password authentication using Argon2.
BonsaiDb server
[dependencies]
bonsaidb = { version = "*", default-features = false, features = "server-full" }server-full: Enables all the flags below,server: Enables theservermodule, which re-exports the cratebonsaidb-server.server-acme: Enables automtic certificate acquisition through ACME/LetsEncrypt.server-cli: Enables theclimodule.server-encryption: Enables at-rest encryption.server-hyper: Enables convenience functions for upgrading websockets usinghyper.server-instrument: Enables instrumenting withtracing.server-pem: Enables the ability to install a certificate using the PEM format.server-websockets: EnablesWebSocketsupport.server-password-hashing: Enables the ability to use password authentication using Argon2.
Client for accessing a BonsaiDb server
[dependencies]
bonsaidb = { version = "*", default-features = false, features = "client-full" }client-full: Enablesclient,client-trusted-dnsandclient-websocketsclient: Enables theclientmodule, which re-exports the cratebonsaidb-client.client-trusted-dns: Enables using trust-dns for DNS resolution. If not enabled, all DNS resolution is done with the OS’s default name resolver.client-websockets: EnablesWebSocketsupport forbonsaidb-client.client-password-hashing: Enables the ability to use password authentication using Argon2.
Developing BonsaiDb
Pre-commit hook
Our CI processes require that some commands succeed without warnings or errors. These checks can be performed manually by running:
cargo xtask test --fail-on-warningsOr, if you would like to run all these checks before each commit, you can install the check as a pre-commit hook:
cargo xtask install-pre-commit-hookOpen-source Licenses
This project, like all projects from Khonsu Labs, are open-source. This repository is available under the MIT License or the Apache License 2.0.
To learn more about contributing, please see CONTRIBUTING.md.
Modules
BonsaiDb command line tools.
Client for bonsaidb-server.
Core functionality and types for BonsaiDb.
VaultKeyStorage implementors.
Local storage backend for BonsaiDb.
The BonsaiDb Server.
Enums
A database connection that can be either from a local server or a server over a network connection.
A local server or a server over a network connection.