use std::path::{Path, PathBuf};
mod connect;
mod parse;
mod ssl_mode;
use crate::{connection::LogSettings, net::tls::CertificateInput};
pub use ssl_mode::MySqlSslMode;
#[derive(Debug, Clone)]
pub struct MySqlConnectOptions {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) socket: Option<PathBuf>,
pub(crate) username: String,
pub(crate) password: Option<String>,
pub(crate) database: Option<String>,
pub(crate) ssl_mode: MySqlSslMode,
pub(crate) ssl_ca: Option<CertificateInput>,
pub(crate) ssl_client_cert: Option<CertificateInput>,
pub(crate) ssl_client_key: Option<CertificateInput>,
pub(crate) statement_cache_capacity: usize,
pub(crate) charset: String,
pub(crate) collation: Option<String>,
pub(crate) log_settings: LogSettings,
pub(crate) pipes_as_concat: bool,
pub(crate) enable_cleartext_plugin: bool,
pub(crate) no_engine_substitution: bool,
pub(crate) timezone: Option<String>,
pub(crate) set_names: bool,
}
impl Default for MySqlConnectOptions {
fn default() -> Self {
Self::new()
}
}
impl MySqlConnectOptions {
pub fn new() -> Self {
Self {
port: 3306,
host: String::from("localhost"),
socket: None,
username: String::from("root"),
password: None,
database: None,
charset: String::from("utf8mb4"),
collation: None,
ssl_mode: MySqlSslMode::Preferred,
ssl_ca: None,
ssl_client_cert: None,
ssl_client_key: None,
statement_cache_capacity: 100,
log_settings: Default::default(),
pipes_as_concat: true,
enable_cleartext_plugin: false,
no_engine_substitution: true,
timezone: Some(String::from("+00:00")),
set_names: true,
}
}
pub fn host(mut self, host: &str) -> Self {
host.clone_into(&mut self.host);
self
}
pub fn port(mut self, port: u16) -> Self {
self.port = port;
self
}
pub fn socket(mut self, path: impl AsRef<Path>) -> Self {
self.socket = Some(path.as_ref().to_path_buf());
self
}
pub fn username(mut self, username: &str) -> Self {
username.clone_into(&mut self.username);
self
}
pub fn password(mut self, password: &str) -> Self {
self.password = Some(password.to_owned());
self
}
pub fn database(mut self, database: &str) -> Self {
self.database = Some(database.to_owned());
self
}
pub fn ssl_mode(mut self, mode: MySqlSslMode) -> Self {
self.ssl_mode = mode;
self
}
pub fn ssl_ca(mut self, file_name: impl AsRef<Path>) -> Self {
self.ssl_ca = Some(CertificateInput::File(file_name.as_ref().to_owned()));
self
}
pub fn ssl_ca_from_pem(mut self, pem_certificate: Vec<u8>) -> Self {
self.ssl_ca = Some(CertificateInput::Inline(pem_certificate));
self
}
pub fn ssl_client_cert(mut self, cert: impl AsRef<Path>) -> Self {
self.ssl_client_cert = Some(CertificateInput::File(cert.as_ref().to_path_buf()));
self
}
pub fn ssl_client_cert_from_pem(mut self, cert: impl AsRef<[u8]>) -> Self {
self.ssl_client_cert = Some(CertificateInput::Inline(cert.as_ref().to_vec()));
self
}
pub fn ssl_client_key(mut self, key: impl AsRef<Path>) -> Self {
self.ssl_client_key = Some(CertificateInput::File(key.as_ref().to_path_buf()));
self
}
pub fn ssl_client_key_from_pem(mut self, key: impl AsRef<[u8]>) -> Self {
self.ssl_client_key = Some(CertificateInput::Inline(key.as_ref().to_vec()));
self
}
pub fn statement_cache_capacity(mut self, capacity: usize) -> Self {
self.statement_cache_capacity = capacity;
self
}
pub fn charset(mut self, charset: &str) -> Self {
self.set_names = true;
charset.clone_into(&mut self.charset);
self
}
pub fn collation(mut self, collation: &str) -> Self {
self.set_names = true;
self.collation = Some(collation.to_owned());
self
}
pub fn pipes_as_concat(mut self, flag_val: bool) -> Self {
self.pipes_as_concat = flag_val;
self
}
pub fn enable_cleartext_plugin(mut self, flag_val: bool) -> Self {
self.enable_cleartext_plugin = flag_val;
self
}
#[deprecated = "renamed to .no_engine_substitution()"]
pub fn no_engine_subsitution(self, flag_val: bool) -> Self {
self.no_engine_substitution(flag_val)
}
pub fn no_engine_substitution(mut self, flag_val: bool) -> Self {
self.no_engine_substitution = flag_val;
self
}
pub fn timezone(mut self, value: impl Into<Option<String>>) -> Self {
self.timezone = value.into();
self
}
pub fn set_names(mut self, flag_val: bool) -> Self {
self.set_names = flag_val;
self
}
}
impl MySqlConnectOptions {
pub fn get_host(&self) -> &str {
&self.host
}
pub fn get_port(&self) -> u16 {
self.port
}
pub fn get_socket(&self) -> Option<&PathBuf> {
self.socket.as_ref()
}
pub fn get_username(&self) -> &str {
&self.username
}
pub fn get_database(&self) -> Option<&str> {
self.database.as_deref()
}
pub fn get_ssl_mode(&self) -> MySqlSslMode {
self.ssl_mode
}
pub fn get_charset(&self) -> &str {
&self.charset
}
pub fn get_collation(&self) -> Option<&str> {
self.collation.as_deref()
}
}