#[cfg(feature = "sqlite")]
#[macro_use]
pub mod sqlite;
#[cfg(feature = "postgres")]
#[macro_use]
pub mod postgres;
#[cfg(feature = "mysql")]
#[macro_use]
pub mod mysql;
#[cfg(any(
feature = "rusqlite",
feature = "libsql",
feature = "turso",
feature = "postgres-sync",
feature = "tokio-postgres",
feature = "hyperdrive",
feature = "mysql-sync",
feature = "mysql-async"
))]
pub(crate) fn refuse_data_loss(
lost: &[(drizzle_migrations::DataLoss, i64)],
) -> drizzle_core::error::Result<()> {
let lost: Vec<String> = lost
.iter()
.filter(|(_, rows)| *rows > 0)
.map(|(drop, rows)| format!("{drop} holds {rows} row(s)"))
.collect();
if lost.is_empty() {
return Ok(());
}
Err(drizzle_core::error::DrizzleError::Other(
format!(
"push would drop data, so nothing was applied: {}. Move or delete that data \
first, or run `drizzle push`, which asks before dropping it.",
lost.join("; ")
)
.into(),
))
}
#[cfg(feature = "query")]
pub trait RelationalPreparedDriver {
type PreparedDriver;
}
#[doc(hidden)]
#[macro_export]
macro_rules! drizzle_prepare_impl {
() => {
impl<'a: 'b, 'b, S, Schema, State, Table, Mk, Rw, Grouped>
DrizzleBuilder<'a, S, QueryBuilder<'b, Schema, State, Table, Mk, Rw, Grouped>, State>
{
#[inline]
pub fn prepare(self) -> prepared::PreparedStatement<'b, Mk, Rw>
where
State: builder::ExecutableState,
{
prepared::PreparedStatement::new(prepare_render(&self.to_sql()))
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! drizzle_tx_prepare_impl {
($($conn:lifetime)?) => {
impl<'a: 'b, 'b, $($conn,)? Schema, State, Table, Mk, Rw, Grouped>
TransactionBuilder<
'a,
$($conn,)?
Schema,
QueryBuilder<'b, Schema, State, Table, Mk, Rw, Grouped>,
State,
>
{
#[inline]
pub fn prepare(self) -> prepared::PreparedStatement<'b, Mk, Rw>
where
State: builder::ExecutableState,
{
prepared::PreparedStatement::new(prepare_render(&self.to_sql()))
}
}
};
}