mod mysql;
mod postgres;
mod sqlite;
pub use mysql::MySql;
pub use postgres::Postgres;
pub use sqlite::Sqlite;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UpsertStyle {
OnConflict,
OnDuplicateKey,
}
pub trait Dialect: Sized + Send + Sync + 'static {
fn quote_char() -> char;
fn write_placeholder(out: &mut String, n: usize);
fn supports_returning() -> bool;
fn upsert_style() -> UpsertStyle {
UpsertStyle::OnConflict
}
fn supports_distinct_on() -> bool {
false
}
fn ilike_is_native() -> bool {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn postgres_placeholders_are_numbered() {
let mut out = String::new();
Postgres::write_placeholder(&mut out, 1);
Postgres::write_placeholder(&mut out, 2);
assert_eq!(out, "$1$2");
}
#[test]
fn mysql_placeholders_are_question_marks() {
let mut out = String::new();
MySql::write_placeholder(&mut out, 1);
MySql::write_placeholder(&mut out, 2);
assert_eq!(out, "??");
}
#[test]
fn sqlite_placeholders_are_question_marks() {
let mut out = String::new();
Sqlite::write_placeholder(&mut out, 1);
Sqlite::write_placeholder(&mut out, 2);
assert_eq!(out, "??");
}
#[test]
fn quote_chars() {
assert_eq!(MySql::quote_char(), '\u{60}');
assert_eq!(Postgres::quote_char(), '"');
assert_eq!(Sqlite::quote_char(), '"');
}
#[test]
fn returning_support() {
assert!(Postgres::supports_returning());
assert!(Sqlite::supports_returning());
assert!(!MySql::supports_returning());
}
}