use keelson_core::{Dialect, SqlWriter};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct Mysql;
impl Dialect for Mysql {
fn write_arg(&self, w: &mut SqlWriter<'_>, _position: usize) {
w.push_str("?");
}
fn write_quoted(&self, w: &mut SqlWriter<'_>, s: &str) {
w.push_str("`");
if s.contains('`') {
w.push_str(&s.replace('`', "``"));
} else {
w.push_str(s);
}
w.push_str("`");
}
}
#[cfg(test)]
mod tests {
use super::*;
use keelson_core::{Value, build, expr};
#[test]
fn placeholders_are_question_marks_and_identifiers_are_backquoted() {
let e = expr::Expr::join((expr::quote(("users", "id")), expr::arg(1i32)));
let (sql, args) = build(&Mysql, &e).unwrap();
assert_eq!(sql, "`users`.`id` ?");
assert_eq!(args, vec![Value::I32(1)]);
}
#[test]
fn every_placeholder_looks_the_same_and_the_order_carries_the_meaning() {
let e = expr::Expr::join((expr::arg(1i32), expr::arg(2i32), expr::arg(3i32)));
let (sql, args) = build(&Mysql, &e).unwrap();
assert_eq!(sql, "? ? ?");
assert_eq!(args, vec![Value::I32(1), Value::I32(2), Value::I32(3)]);
}
#[test]
fn an_embedded_backtick_is_doubled() {
let (sql, _) = build(&Mysql, &expr::quote("we`ird")).unwrap();
assert_eq!(sql, "`we``ird`");
}
#[test]
fn named_arguments_are_refused() {
assert!(matches!(
build(&Mysql, &expr::named("x")),
Err(keelson_core::Error::NoNamedArgs)
));
}
}