Skip to main content

datasources_sqlserver/
driver.rs

1use crate::connection::SqlServerConnection;
2use crate::sql_generate;
3use crate::statement_renderer::SqlServerStatementRenderer;
4use datasources::{
5    Command, Connection, DefaultValueConverter, Driver, Information, IsolationLevel, Mapping, StatementTextRenderer,
6    StubTransaction, Transaction, TypeConverter, Value,
7};
8use std::collections::HashMap;
9use std::sync::{Arc, LazyLock};
10
11pub struct SqlServerDriver;
12
13impl SqlServerDriver {
14    pub const QUOTE_LEFT: &'static str = sql_generate::QUOTE_LEFT;
15    pub const QUOTE_RIGHT: &'static str = sql_generate::QUOTE_RIGHT;
16
17    pub fn statement_text_renderer() -> &'static StatementTextRenderer {
18        static DRIVER: SqlServerDriver = SqlServerDriver;
19        Driver::statement_renderer(&DRIVER).expect("sqlserver")
20    }
21}
22
23static STATEMENTS: LazyLock<StatementTextRenderer> =
24    LazyLock::new(|| StatementTextRenderer::new(Some(Box::new(SqlServerStatementRenderer)), None));
25
26static INFORMATION: LazyLock<Information> = LazyLock::new(|| {
27    Information::new(
28        ["SQL Server driver."],
29        [
30            "Overrides CreateCreateStoredProcedureStatement to PROCEDURE Create{Plural}",
31            "Overrides CreateReadStoredProcedureStatement to PROCEDURE Read{Plural}By{Properties}",
32            "Overrides CreateUpdateStoredProcedureStatement to PROCEDURE Update{Plural}By{Properties}",
33            "Overrides CreateDeleteStoredProcedureStatement to PROCEDURE Delete{Plural}By{Properties}",
34            "Overrides CreateBulkCreateStoredProcedureStatement to PROCEDURE BulkCreate{Plural}",
35            "Overrides CreateBulkUpdateStoredProcedureStatement to PROCEDURE BulkUpdate{Plural}",
36            "Overrides CreateBulkDeleteStoredProcedureStatement to PROCEDURE BulkDelete{Plural}",
37        ],
38        [] as [&str; 0],
39    )
40});
41
42impl Driver for SqlServerDriver {
43    fn connection(&self, options: Option<&HashMap<String, String>>) -> Arc<dyn Connection> {
44        SqlServerConnection::from_options(options)
45    }
46
47    fn command(&self, connection: Arc<dyn Connection>) -> Arc<dyn Command> {
48        connection.create_command()
49    }
50
51    fn transaction(
52        &self,
53        connection: Arc<dyn Connection>,
54        _isolation: IsolationLevel,
55    ) -> Arc<dyn Transaction> {
56        Arc::new(StubTransaction::new("sqlserver", connection))
57    }
58
59    fn row_type_converters(
60        &self,
61    ) -> HashMap<String, Box<dyn TypeConverter<Value, Value> + Send + Sync>> {
62        HashMap::new()
63    }
64
65    fn type_converter(&self) -> Option<&dyn Mapping<String, String>> {
66        Some(&*sql_generate::TYPES)
67    }
68
69    fn default_value_converter(&self) -> Option<&DefaultValueConverter> {
70        Some(&sql_generate::DEFAULTS)
71    }
72
73    fn statement_renderer(&self) -> Option<&StatementTextRenderer> {
74        Some(&STATEMENTS)
75    }
76
77    fn information(&self) -> Option<&Information> {
78        Some(&INFORMATION)
79    }
80}