use super::{DatabaseDialect, DialectKind};
pub struct MysqlDialect;
impl DatabaseDialect for MysqlDialect {
fn kind(&self) -> DialectKind {
DialectKind::Mysql
}
fn quote_ident(&self, name: &str) -> String {
format!("`{}`", name.replace('`', "``"))
}
fn history_table_ddl(&self, schema: &str, table: &str) -> String {
let fq = self.qualified_table(schema, table);
let success_idx = self.quote_ident(&format!("{}_s_idx", table));
let version_idx = self.quote_ident(&format!("{}_v_idx", table));
format!(
r#"
CREATE TABLE IF NOT EXISTS {fq} (
installed_rank INT PRIMARY KEY,
version VARCHAR(50),
description VARCHAR(200) NOT NULL,
type VARCHAR(20) NOT NULL,
script VARCHAR(1000) NOT NULL,
checksum INT,
installed_by VARCHAR(100) NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
execution_time INT NOT NULL,
success BOOLEAN NOT NULL,
reversal_sql LONGTEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE INDEX {success_idx} ON {fq} (success);
CREATE INDEX {version_idx} ON {fq} (version);
"#
)
}
fn supports_transactional_ddl(&self) -> bool {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn quotes_identifier_with_backticks() {
let d = MysqlDialect;
assert_eq!(d.quote_ident("users"), "`users`");
assert_eq!(d.quote_ident("my`table"), "`my``table`");
}
#[test]
fn history_ddl_uses_innodb_and_timestamp() {
let d = MysqlDialect;
let ddl = d.history_table_ddl("devdb", "waypoint_schema_history");
assert!(ddl.contains("ENGINE=InnoDB"));
assert!(ddl.contains("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"));
assert!(!ddl.contains("TIMESTAMPTZ"));
assert!(ddl.contains("utf8mb4"));
}
#[test]
fn does_not_support_transactional_ddl() {
assert!(!MysqlDialect.supports_transactional_ddl());
}
}