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