taitan_orm/database/sqlite/
builder.rs1use 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}