use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct Config {
#[serde(default = "defaults::path")]
pub path: String,
#[serde(default)]
pub migrations: Option<String>,
#[serde(default = "defaults::busy_timeout")]
pub busy_timeout: u64,
#[serde(default = "defaults::cache_size")]
pub cache_size: i64,
#[serde(default = "defaults::mmap_size")]
pub mmap_size: u64,
#[serde(default = "defaults::journal_mode")]
pub journal_mode: JournalMode,
#[serde(default = "defaults::synchronous")]
pub synchronous: SynchronousMode,
#[serde(default = "defaults::foreign_keys")]
pub foreign_keys: bool,
#[serde(default = "defaults::temp_store")]
pub temp_store: TempStore,
#[serde(default)]
pub pool: Option<PoolConfig>,
}
impl Default for Config {
fn default() -> Self {
Self {
path: defaults::path(),
migrations: None,
busy_timeout: defaults::busy_timeout(),
cache_size: defaults::cache_size(),
mmap_size: defaults::mmap_size(),
journal_mode: defaults::journal_mode(),
synchronous: defaults::synchronous(),
foreign_keys: defaults::foreign_keys(),
temp_store: defaults::temp_store(),
pool: None,
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum JournalMode {
#[default]
Wal,
Delete,
Truncate,
Memory,
Off,
}
impl JournalMode {
pub fn as_str(self) -> &'static str {
match self {
Self::Wal => "WAL",
Self::Delete => "DELETE",
Self::Truncate => "TRUNCATE",
Self::Memory => "MEMORY",
Self::Off => "OFF",
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum SynchronousMode {
Off,
#[default]
Normal,
Full,
Extra,
}
impl SynchronousMode {
pub fn as_str(self) -> &'static str {
match self {
Self::Off => "OFF",
Self::Normal => "NORMAL",
Self::Full => "FULL",
Self::Extra => "EXTRA",
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum TempStore {
Default,
File,
#[default]
Memory,
}
impl TempStore {
pub fn as_str(self) -> &'static str {
match self {
Self::Default => "DEFAULT",
Self::File => "FILE",
Self::Memory => "MEMORY",
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct PoolConfig {
#[serde(default = "defaults::base_path")]
pub base_path: String,
#[serde(default = "defaults::lock_shards")]
pub lock_shards: usize,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
base_path: defaults::base_path(),
lock_shards: defaults::lock_shards(),
}
}
}
mod defaults {
use super::*;
pub fn path() -> String {
"data/app.db".to_string()
}
pub fn busy_timeout() -> u64 {
5000
}
pub fn cache_size() -> i64 {
16384
}
pub fn mmap_size() -> u64 {
268_435_456 }
pub fn journal_mode() -> JournalMode {
JournalMode::Wal
}
pub fn synchronous() -> SynchronousMode {
SynchronousMode::Normal
}
pub fn foreign_keys() -> bool {
true
}
pub fn temp_store() -> TempStore {
TempStore::Memory
}
pub fn base_path() -> String {
"data/shards".to_string()
}
pub fn lock_shards() -> usize {
16
}
}