taitan_orm/database/sqlite/
builder.rs

1use super::SqliteDatabase;
2use crate::error::TaitanOrmError;
3use path_absolutize::Absolutize;
4use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteSynchronous};
5use sqlx::SqlitePool;
6use std::borrow::Cow;
7use std::fs;
8use std::path::Path;
9use taitan_orm_trait::error::DatabaseInitFail;
10pub struct SqliteBuilder {}
11
12impl SqliteBuilder {
13    async fn init_local(workspace_dir: &str, db_file: &str) -> crate::result::Result<SqlitePool> {
14        let workspace = Path::new(workspace_dir);
15        let workspace_absolute = workspace.absolutize().map_err(|_e| {
16            TaitanOrmError::DatabaseInitFail(DatabaseInitFail("workdir absolute fail".to_string()))
17        })?;
18
19        fs::create_dir_all(&workspace_absolute).map_err(|_e| {
20            TaitanOrmError::DatabaseInitFail(DatabaseInitFail("create dir fail".to_string()))
21        })?;
22        let db_file_path = workspace_absolute.join(db_file);
23
24        let options = SqliteConnectOptions::new()
25            .filename(db_file_path.clone())
26            .synchronous(SqliteSynchronous::Full)
27            .journal_mode(SqliteJournalMode::Wal)
28            .create_if_missing(true);
29        let sqlite_pool = SqlitePool::connect_with(options).await.map_err(|_e| {
30            TaitanOrmError::DatabaseInitFail(DatabaseInitFail("create is missing fail".to_string()))
31        })?;
32        Ok(sqlite_pool)
33    }
34
35    pub async fn build(config: SqliteLocalConfig<'_>) -> crate::result::Result<SqliteDatabase> {
36        let pool = SqliteBuilder::init_local(&config.work_dir, &config.db_file).await?;
37        let database = SqliteDatabase { sqlite_pool: pool };
38        Ok(database)
39    }
40    pub async fn build_mem() -> crate::result::Result<SqliteDatabase> {
41        let sqlite_pool = SqlitePool::connect("sqlite://:memory:").await.map_err(|_e| {
42            TaitanOrmError::DatabaseInitFail(DatabaseInitFail("create is missing fail".to_string()))
43        })?;
44        let database = SqliteDatabase { sqlite_pool };
45        Ok(database)
46    }
47
48}
49
50pub struct SqliteLocalConfig<'a> {
51    pub work_dir: Cow<'a, str>,
52    pub db_file: Cow<'a, str>,
53}
54
55impl<'a> SqliteLocalConfig<'a> {
56    pub fn new<S>(work_dir: S, db_file: S) -> Self
57    where
58        S: Into<Cow<'a, str>>,
59    {
60        Self {
61            work_dir: work_dir.into(),
62            db_file: db_file.into(),
63        }
64    }
65}