mysql_connector/model/active_model/
mod.rs

1mod active_reference;
2mod active_value;
3mod named_value;
4mod update_model;
5
6use {
7    super::Model,
8    crate::{error::Error, types::Value, Connection},
9};
10
11pub use {
12    active_reference::ActiveReference, active_value::ActiveValue, named_value::NamedValue,
13    update_model::UpdateModel,
14};
15
16#[allow(async_fn_in_trait)]
17pub trait ActiveModel<ModelData: super::ModelData>: Default {
18    async fn into_values(self, conn: &mut Connection) -> Result<Vec<NamedValue>, Error>;
19
20    fn primary(&self) -> Option<Value>;
21
22    async fn insert(self, conn: &mut Connection) -> Result<u64, Error>
23    where
24        Self: Sized,
25    {
26        let values = self.into_values(conn).await?;
27        let stmt = NamedValue::into_insert(&values, ModelData::TABLE)?;
28        let mut stmt = conn.prepare_statement(&stmt).await?;
29        stmt.execute(&values).await.map(|x| x.last_insert_id())
30    }
31}
32
33pub trait HasActiveModel: super::ModelData {
34    type ActiveModel: ActiveModel<Self>;
35
36    /// Create [`ActiveModel`] containing the model's data.
37    ///
38    /// If the model has a primary key that is auto increment, it has to be set to [`ActiveValue::Unset`]
39    fn into_active_model(self) -> Self::ActiveModel;
40}