1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![deny(missing_debug_implementations)]
3#![deny(missing_docs)]
4#![warn(rust_2018_idioms)]
5
6pub use chrono;
25pub use sqlx;
26pub use tracing;
27pub use uuid;
28
29pub mod dialect;
32pub mod executor;
34pub mod migrator;
36pub use migrator::{Migration, Migrator};
37#[cfg(feature = "metrics")]
39pub mod metrics;
40pub mod model;
42pub use model::{FastRow, Model, ModelHooks, ModelValidation, UpdateResult, ValidationError};
43pub mod query;
45pub use query::QueryBuilder;
46pub mod schema;
48pub use schema::ModelSchema;
49pub mod sql_cache;
51pub use sql_cache::{cached_placeholders, cached_placeholders_from};
52
53#[derive(Debug, Clone, Copy, Default)]
55pub struct Premix;
56
57impl Premix {
58 #[cfg(feature = "sqlite")]
60 pub async fn smart_sqlite_pool(url: &str) -> Result<sqlx::SqlitePool, sqlx::Error> {
61 use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteSynchronous};
62 use std::str::FromStr;
63 let options = SqliteConnectOptions::from_str(url)?
64 .create_if_missing(true)
65 .journal_mode(SqliteJournalMode::Wal)
66 .synchronous(SqliteSynchronous::Normal)
67 .statement_cache_capacity(200);
68 sqlx::SqlitePool::connect_with(options).await
69 }
70
71 pub async fn sync<DB, T>(pool: &sqlx::Pool<DB>) -> Result<(), sqlx::Error>
73 where
74 DB: crate::dialect::SqlDialect,
75 T: crate::model::Model<DB> + crate::schema::ModelSchema,
76 for<'c> &'c sqlx::Pool<DB>: sqlx::Executor<'c, Database = DB>,
77 {
78 let schema = T::schema();
79 let sql = schema.to_create_sql();
80 use sqlx::Executor;
81 pool.execute(sql.as_str()).await?;
82 Ok(())
83 }
84}
85
86pub fn build_placeholders<DB: crate::dialect::SqlDialect>(start: usize, count: usize) -> String {
88 (start..start + count)
89 .map(DB::placeholder)
90 .collect::<Vec<_>>()
91 .join(", ")
92}
93
94pub use dialect::SqlDialect;
95pub use executor::{Executor, IntoExecutor};
96
97pub mod prelude {
100 pub use crate::Premix;
101 pub use crate::build_placeholders;
102 pub use crate::dialect::SqlDialect;
103 pub use crate::executor::{Executor, IntoExecutor};
104 pub use crate::migrator::{Migration, Migrator};
105 pub use crate::model::{
106 FastRow, Model, ModelHooks, ModelValidation, UpdateResult, ValidationError,
107 };
108 pub use crate::query::QueryBuilder;
109 pub use crate::schema::ModelSchema;
110 pub use crate::sql_cache::{cached_placeholders, cached_placeholders_from};
111}