use crate::errors::Result;
use crate::errors::WeldsError;
use crate::model_traits::hooks::{AfterDelete, BeforeDelete};
use crate::model_traits::{HasSchema, TableColumns, TableInfo, WriteToArgs};
use crate::query::clause::ParamArgs;
use crate::writers::ColumnWriter;
use crate::writers::NextParam;
use crate::writers::TableWriter;
use welds_connections::Client;
pub mod bulk;
#[maybe_async::maybe_async]
pub async fn delete_one<T>(obj: &T, client: &dyn Client) -> Result<()>
where
T: HasSchema + WriteToArgs,
<T as HasSchema>::Schema: TableInfo + TableColumns,
T: AfterDelete + BeforeDelete,
{
BeforeDelete::before(obj).await?;
let syntax = client.syntax();
let col_writer = ColumnWriter::new(syntax);
let next_params = NextParam::new(syntax);
let parts = <<T as HasSchema>::Schema>::identifier();
let identifier = TableWriter::new(syntax).write2(parts);
let pks = <<T as HasSchema>::Schema as TableColumns>::primary_keys();
if pks.is_empty() {
return Err(WeldsError::NoPrimaryKey);
}
let mut args: ParamArgs = Vec::default();
let mut wheres = Vec::default();
for col in pks {
obj.bind(col.name(), &mut args)?;
let p = next_params.next();
let colname = col_writer.excape(col.name());
wheres.push(format!("{}={}", colname, p));
}
let wheres = wheres.join(" AND ");
let sql = format!("DELETE FROM {} where {}", identifier, wheres);
client.execute(&sql, &args).await?;
AfterDelete::after(obj).await.ok();
Ok(())
}
#[cfg(test)]
mod tests;