use std::sync::Arc;
use noxu_tree::KeyComparatorFn;
use crate::trigger::Trigger;
#[derive(Clone)]
pub struct ConfigComparator {
pub identity: String,
pub func: KeyComparatorFn,
}
impl std::fmt::Debug for ConfigComparator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ConfigComparator")
.field("identity", &self.identity)
.finish()
}
}
#[derive(Clone)]
pub struct DatabaseConfig {
pub allow_create: bool,
pub sorted_duplicates: bool,
pub key_prefixing: bool,
pub temporary: bool,
pub transactional: bool,
pub read_only: bool,
pub node_max_entries: i32,
pub deferred_write: bool,
pub btree_comparator: Option<ConfigComparator>,
pub duplicate_comparator: Option<ConfigComparator>,
pub override_btree_comparator: bool,
pub override_duplicate_comparator: bool,
pub triggers: Vec<Arc<dyn Trigger>>,
}
impl std::fmt::Debug for DatabaseConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("DatabaseConfig")
.field("allow_create", &self.allow_create)
.field("sorted_duplicates", &self.sorted_duplicates)
.field("key_prefixing", &self.key_prefixing)
.field("temporary", &self.temporary)
.field("transactional", &self.transactional)
.field("read_only", &self.read_only)
.field("node_max_entries", &self.node_max_entries)
.field("deferred_write", &self.deferred_write)
.field("btree_comparator", &self.btree_comparator)
.field("duplicate_comparator", &self.duplicate_comparator)
.field("override_btree_comparator", &self.override_btree_comparator)
.field(
"override_duplicate_comparator",
&self.override_duplicate_comparator,
)
.field("triggers", &self.triggers.len())
.finish()
}
}
impl Default for DatabaseConfig {
fn default() -> Self {
DatabaseConfig {
allow_create: false,
sorted_duplicates: false,
key_prefixing: false,
temporary: false,
transactional: false,
read_only: false,
node_max_entries: 128,
deferred_write: false,
btree_comparator: None,
duplicate_comparator: None,
override_btree_comparator: false,
override_duplicate_comparator: false,
triggers: Vec::new(),
}
}
}
impl DatabaseConfig {
pub fn new() -> Self {
Self::default()
}
pub fn set_allow_create(&mut self, allow_create: bool) -> &mut Self {
self.allow_create = allow_create;
self
}
pub fn set_sorted_duplicates(
&mut self,
sorted_duplicates: bool,
) -> &mut Self {
self.sorted_duplicates = sorted_duplicates;
self
}
pub fn set_key_prefixing(&mut self, key_prefixing: bool) -> &mut Self {
self.key_prefixing = key_prefixing;
self
}
pub fn set_temporary(&mut self, temporary: bool) -> &mut Self {
self.temporary = temporary;
self
}
pub fn set_transactional(&mut self, transactional: bool) -> &mut Self {
self.transactional = transactional;
self
}
pub fn set_read_only(&mut self, read_only: bool) -> &mut Self {
self.read_only = read_only;
self
}
pub fn set_node_max_entries(&mut self, max: i32) -> &mut Self {
self.node_max_entries = max;
self
}
pub fn add_trigger(&mut self, trigger: Arc<dyn Trigger>) -> &mut Self {
self.triggers.push(trigger);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default() {
let config = DatabaseConfig::default();
assert!(!config.allow_create);
assert!(!config.sorted_duplicates);
assert!(!config.key_prefixing);
assert!(!config.temporary);
assert!(!config.transactional);
assert!(!config.read_only);
assert_eq!(config.node_max_entries, 128);
}
#[test]
fn test_new() {
let config = DatabaseConfig::new();
assert!(!config.allow_create);
}
#[test]
fn test_setters() {
let mut config = DatabaseConfig::new();
config.set_allow_create(true);
assert!(config.allow_create);
config.set_sorted_duplicates(true);
assert!(config.sorted_duplicates);
config.set_key_prefixing(true);
assert!(config.key_prefixing);
config.set_temporary(true);
assert!(config.temporary);
config.set_transactional(true);
assert!(config.transactional);
config.set_read_only(true);
assert!(config.read_only);
config.set_node_max_entries(256);
assert_eq!(config.node_max_entries, 256);
}
#[test]
fn test_builder_pattern() {
let config = DatabaseConfig::new()
.set_allow_create(true)
.set_transactional(true)
.set_node_max_entries(512)
.clone();
assert!(config.allow_create);
assert!(config.transactional);
assert_eq!(config.node_max_entries, 512);
}
}