Skip to main content

premix_core/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![deny(missing_debug_implementations)]
3#![deny(missing_docs)]
4#![warn(rust_2018_idioms)]
5
6//! # Premix ORM Core
7//!
8//! Core definitions and traits for the Premix ORM ecosystem.
9//! Provides the `Model` trait, `Executor` abstraction, and `QueryBuilder`.
10//!
11//! ## Architecture
12//!
13//! - **Model**: The core trait that all database entities must implement.
14//! - **Executor**: Abstracts over connection pools and transactions.
15//! - **QueryBuilder**: A type-safe SQL query generator with support for:
16//!   - Filtering (eq, ne, gt, lt, in)
17//!   - Pagination (limit, offset)
18//!   - Relations (eager loading)
19//!   - Soft Deletes
20//!
21//! This crate is designed to be used with `premix-macros` for compile-time SQL generation overrides.
22
23// Re-export common types
24pub use chrono;
25pub use sqlx;
26pub use tracing;
27pub use uuid;
28
29// New Modules
30/// SQL dialect abstractions for multi-database support.
31pub mod dialect;
32/// Database executor abstraction for connection pools and transactions.
33pub mod executor;
34/// Database migration engine.
35pub mod migrator;
36pub use migrator::{Migration, Migrator};
37/// Premix error types and helpers.
38pub mod error;
39pub use error::{PremixError, PremixResult, map_sqlx_error};
40/// Metrics and monitoring.
41#[cfg(feature = "metrics")]
42pub mod metrics;
43/// Core traits and types for database models.
44pub mod model;
45pub use model::{
46    FastRow, Model, ModelHooks, ModelValidation, Relation, UpdateResult, ValidationError,
47};
48/// Type-safe SQL query builder.
49pub mod query;
50pub use query::QueryBuilder;
51/// Database schema introspection and diffing utilities.
52pub mod schema;
53pub use schema::ModelSchema;
54/// Cache helpers for SQL snippets/placeholders.
55pub mod sql_cache;
56pub use sql_cache::{cached_placeholders, cached_placeholders_from};
57
58/// Main entry point for the Premix ORM helpers.
59#[derive(Debug, Clone, Copy, Default)]
60pub struct Premix;
61
62impl Premix {
63    /// Creates a smart SQLite pool with optimized settings for performance.
64    #[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    /// Synchronizes the database schema for a specific model.
77    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
91/// Helper to build a comma-separated list of placeholders for a given database.
92pub 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
102// Prelude
103/// The Premix prelude, re-exporting commonly used traits and types.
104pub 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}