mod config;
mod connection;
mod db;
mod error;
mod migration;
mod query;
mod transaction;
mod types;
pub use db::EmbeddedDb;
pub use error::SqliteError;
pub use config::{SqliteConfig, SynchronousMode};
pub use types::{Param, Row, Rows, SqlValue};
pub use query::{DeleteBuilder, InsertBuilder, SelectBuilder, UpdateBuilder};
pub use migration::{
Migration, MigrationBuilder, MigrationReport, SchemaBuilder, TableBuilder, Migrator,
};
pub use transaction::{
IsolationLevel, Transaction, TransactionState,
with_transaction, with_immediate_transaction,
};
pub use connection::ConnectionState;
use async_trait::async_trait;
use unistore_core::{Capability, CapabilityError, CapabilityInfo};
pub struct SqliteCapability {
db: Option<EmbeddedDb>,
config: SqliteConfig,
}
impl SqliteCapability {
pub fn memory() -> Self {
Self {
db: None,
config: SqliteConfig::memory(),
}
}
pub fn file(path: impl Into<std::path::PathBuf>) -> Self {
Self {
db: None,
config: SqliteConfig::file(path),
}
}
pub fn with_config(config: SqliteConfig) -> Self {
Self {
db: None,
config,
}
}
pub fn db(&self) -> Option<&EmbeddedDb> {
self.db.as_ref()
}
}
#[async_trait]
impl Capability for SqliteCapability {
fn info(&self) -> CapabilityInfo {
CapabilityInfo::new("sqlite", env!("CARGO_PKG_VERSION"))
.with_description("SQLite embedded database capability")
.with_author("UniStore Team")
}
async fn start(&mut self) -> Result<(), CapabilityError> {
if self.db.is_some() {
return Ok(()); }
let db = EmbeddedDb::open_with_config("unistore", self.config.clone())
.map_err(|e: SqliteError| CapabilityError::start_failed("sqlite", e.to_string()))?;
self.db = Some(db);
Ok(())
}
async fn stop(&mut self) -> Result<(), CapabilityError> {
self.db = None;
Ok(())
}
async fn health_check(&self) -> Result<(), CapabilityError> {
match &self.db {
Some(db) => {
db.execute("SELECT 1", &[])
.map_err(|e: SqliteError| CapabilityError::unhealthy("sqlite", e.to_string()))?;
Ok(())
}
None => Err(CapabilityError::unhealthy("sqlite", "数据库未初始化")),
}
}
}
#[macro_export]
macro_rules! params {
() => {
vec![]
};
($($param:expr),+ $(,)?) => {
vec![$($crate::Param::from($param)),+]
};
}