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};
37pub mod error;
39pub use error::{PremixError, PremixResult, map_sqlx_error};
40#[cfg(feature = "metrics")]
42pub mod metrics;
43pub mod model;
45pub use model::{
46 FastRow, Model, ModelHooks, ModelValidation, Relation, UpdateResult, ValidationError,
47};
48pub mod query;
50pub use query::QueryBuilder;
51pub mod schema;
53pub use schema::ModelSchema;
54pub mod sql_cache;
56pub use sql_cache::{cached_placeholders, cached_placeholders_from};
57
58#[derive(Debug, Clone, Copy, Default)]
60pub struct Premix;
61
62impl Premix {
63 #[cfg(feature = "sqlite")]
65 pub async fn smart_sqlite_pool(url: &str) -> Result<sqlx::SqlitePool, sqlx::Error> {
66 use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteSynchronous};
67 use std::str::FromStr;
68 let options = SqliteConnectOptions::from_str(url)?
69 .create_if_missing(true)
70 .journal_mode(SqliteJournalMode::Wal)
71 .synchronous(SqliteSynchronous::Normal)
72 .statement_cache_capacity(200);
73 sqlx::SqlitePool::connect_with(options).await
74 }
75
76 pub async fn sync<DB, T>(pool: &sqlx::Pool<DB>) -> Result<(), sqlx::Error>
78 where
79 DB: crate::dialect::SqlDialect,
80 T: crate::model::Model<DB> + crate::schema::ModelSchema,
81 for<'c> &'c sqlx::Pool<DB>: sqlx::Executor<'c, Database = DB>,
82 {
83 let schema = T::schema();
84 let sql = schema.to_create_sql();
85 use sqlx::Executor;
86 pool.execute(sql.as_str()).await?;
87 Ok(())
88 }
89}
90
91pub fn build_placeholders<DB: crate::dialect::SqlDialect>(start: usize, count: usize) -> String {
93 (start..start + count)
94 .map(DB::placeholder)
95 .collect::<Vec<_>>()
96 .join(", ")
97}
98
99pub use dialect::SqlDialect;
100pub use executor::{Executor, IntoExecutor};
101
102pub mod prelude {
105 pub use crate::Premix;
106 pub use crate::build_placeholders;
107 pub use crate::dialect::SqlDialect;
108 pub use crate::error::{PremixError, PremixResult, map_sqlx_error};
109 pub use crate::executor::{Executor, IntoExecutor};
110 pub use crate::migrator::{Migration, Migrator};
111 pub use crate::model::{
112 FastRow, Model, ModelHooks, ModelResultExt, ModelValidation, Relation, UpdateResult,
113 ValidationError,
114 };
115 pub use crate::query::QueryBuilder;
116 pub use crate::schema::ModelSchema;
117 pub use crate::schema_models;
118 pub use crate::sql_cache::{cached_placeholders, cached_placeholders_from};
119}