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