pub trait DatabaseBackend: Send + Sync {
fn name(&self) -> &str;
fn display_name(&self) -> &str {
self.name()
}
fn supports_transactions(&self) -> bool {
true
}
fn supports_json_field(&self) -> bool {
true
}
fn supports_partial_indexes(&self) -> bool {
true
}
fn supports_expression_indexes(&self) -> bool {
true
}
fn supports_covering_indexes(&self) -> bool {
false
}
fn supports_column_check_constraints(&self) -> bool {
true
}
fn supports_table_check_constraints(&self) -> bool {
true
}
fn supports_sequence_reset(&self) -> bool {
true
}
fn supports_foreign_keys(&self) -> bool {
true
}
fn quote_name(&self, name: &str) -> String;
fn db_type(&self, field_type: &str) -> String;
fn last_insert_id_sql(&self, table: &str, pk_name: &str) -> String;
fn format_for_duration_arithmetic(&self, sql: &str) -> String {
sql.to_string()
}
fn savepoint_create_sql(&self, sid: &str) -> String {
format!("SAVEPOINT {}", self.quote_name(sid))
}
fn savepoint_release_sql(&self, sid: &str) -> String {
format!("RELEASE SAVEPOINT {}", self.quote_name(sid))
}
fn savepoint_rollback_sql(&self, sid: &str) -> String {
format!("ROLLBACK TO SAVEPOINT {}", self.quote_name(sid))
}
}
#[cfg(test)]
mod tests {
use super::DatabaseBackend;
struct TestBackend;
impl DatabaseBackend for TestBackend {
fn name(&self) -> &str {
"test"
}
fn quote_name(&self, name: &str) -> String {
format!("[{name}]")
}
fn db_type(&self, field_type: &str) -> String {
field_type.to_string()
}
fn last_insert_id_sql(&self, table: &str, pk_name: &str) -> String {
format!("SELECT {table}.{pk_name}")
}
}
#[test]
fn test_savepoint_sql_default() {
let backend = TestBackend;
assert_eq!(backend.savepoint_create_sql("sp1"), "SAVEPOINT [sp1]");
assert_eq!(
backend.savepoint_release_sql("sp1"),
"RELEASE SAVEPOINT [sp1]"
);
assert_eq!(
backend.savepoint_rollback_sql("sp1"),
"ROLLBACK TO SAVEPOINT [sp1]"
);
}
}