diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e9025d34..fec4c17a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -189,7 +189,7 @@ jobs: run: cargo test ${{matrix.features}} cargo-test-macos: - runs-on: macos-latest + runs-on: macos-12 strategy: fail-fast: false diff --git a/.gitignore b/.gitignore index 39d7d3fc..147270ed 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target Cargo.lock .idea .direnv/ +.vscode diff --git a/docker/certs/customCA.srl b/docker/certs/customCA.srl index 50276505..618df778 100644 --- a/docker/certs/customCA.srl +++ b/docker/certs/customCA.srl @@ -1 +1 @@ -0DAEECC45C07F5E06E0DD1B05115C3CFD1A46D9B +0DAEECC45C07F5E06E0DD1B05115C3CFD1A46D9C diff --git a/docker/certs/server-full.crt b/docker/certs/server-full.crt index 772eadf4..31ceafd7 100644 --- a/docker/certs/server-full.crt +++ b/docker/certs/server-full.crt @@ -1,33 +1,33 @@ -----BEGIN CERTIFICATE----- -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 -sIKYwEBx8av830JU/d9P/dzG7PMUJ7vv +BQcDAjAdBgNVHQ4EFgQUn6la/z79UFTu+LlDc6aDXG+6Tv0wHwYDVR0jBBgwFoAU +RHcTzm1u6x8WiXeAWDblHzwBt9kwDQYJKoZIhvcNAQELBQADggIBAA6sCw60Cr1V +aeFXxpzYKc3dtfKjuD6d5K6kwRkrt2AlsSfEk9fVu4SXbYeISXkL42g9nI02ce4j +o2iCeabgBT7HQVMsSx3KzlCXzXW2ACtma1D87RRQjBJinbCLSHaksZxSsMK6J+3u +MxLIgYIbxP9xGt8PLURkJq5tvJua8WZhdvaUXD1YdLANIzenCL6gHuW6WkzmHJ7E +c5rX/p8njJe7hse0ng04B9eQpuTPGUXYxOs7yMvSb5fNqZZr1EAVhBphDVjR6TuD +KTrh8vCDqHDj1xm00sbnYjzah/znmq+8XAvYGlf7DpuT68ipR914UDGvG4vKcdLz +x+3mcT3tOLfCT0VqlieWiJEdotk6EvFyubP034VxIqwr53ew2+e4m3dw39/HZ+Y1 +tggXWwlFpkZS/knLje9kz7F/EOReA4WknFSfm07B0Yv7qZNgTc/Kptw7FgPFTDLL +Cah96vwSny66C1iaRV4ALdAa1/ZNSkD/D6y1oTFGQVgy4KezjwlTA0EvmIS+wves +7jXoTSqO1iBRRl2DfHnzBtWHP1XtSTo7rqDHj6WOb/rEkTsgXqdnA5RQokj8zjLq +zaNaREfrAw55tuOASw0TbWLlv3qDofUlZyqOE6oCgCCjN/0KyqWm5m8lTUJKo6qg +HTMZ5IJXU9f1XKtMHLdGRpx0YiEGTw0e -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE/zCCAuegAwIBAgIUATFLyERaRfsQiPasMC5l0vrBMUMwDQYJKoZIhvcNAQEL diff --git a/docker/certs/server.crt b/docker/certs/server.crt index 25170cb0..95e4d43e 100644 --- a/docker/certs/server.crt +++ b/docker/certs/server.crt @@ -1,31 +1,31 @@ -----BEGIN CERTIFICATE----- -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 -sIKYwEBx8av830JU/d9P/dzG7PMUJ7vv +BQcDAjAdBgNVHQ4EFgQUn6la/z79UFTu+LlDc6aDXG+6Tv0wHwYDVR0jBBgwFoAU +RHcTzm1u6x8WiXeAWDblHzwBt9kwDQYJKoZIhvcNAQELBQADggIBAA6sCw60Cr1V +aeFXxpzYKc3dtfKjuD6d5K6kwRkrt2AlsSfEk9fVu4SXbYeISXkL42g9nI02ce4j +o2iCeabgBT7HQVMsSx3KzlCXzXW2ACtma1D87RRQjBJinbCLSHaksZxSsMK6J+3u +MxLIgYIbxP9xGt8PLURkJq5tvJua8WZhdvaUXD1YdLANIzenCL6gHuW6WkzmHJ7E +c5rX/p8njJe7hse0ng04B9eQpuTPGUXYxOs7yMvSb5fNqZZr1EAVhBphDVjR6TuD +KTrh8vCDqHDj1xm00sbnYjzah/znmq+8XAvYGlf7DpuT68ipR914UDGvG4vKcdLz +x+3mcT3tOLfCT0VqlieWiJEdotk6EvFyubP034VxIqwr53ew2+e4m3dw39/HZ+Y1 +tggXWwlFpkZS/knLje9kz7F/EOReA4WknFSfm07B0Yv7qZNgTc/Kptw7FgPFTDLL +Cah96vwSny66C1iaRV4ALdAa1/ZNSkD/D6y1oTFGQVgy4KezjwlTA0EvmIS+wves +7jXoTSqO1iBRRl2DfHnzBtWHP1XtSTo7rqDHj6WOb/rEkTsgXqdnA5RQokj8zjLq +zaNaREfrAw55tuOASw0TbWLlv3qDofUlZyqOE6oCgCCjN/0KyqWm5m8lTUJKo6qg +HTMZ5IJXU9f1XKtMHLdGRpx0YiEGTw0e -----END CERTIFICATE----- diff --git a/docker/certs/server.key b/docker/certs/server.key index d8e947b1..7e60bb02 100644 --- a/docker/certs/server.key +++ b/docker/certs/server.key @@ -1,52 +1,52 @@ -----BEGIN PRIVATE KEY----- -MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC4swJefIXeJbEs -pE0HcZrYFZOI6H5vQ4CIEeLBjgH8fsMrlo3dfpcBFHpqMjGfZ3kE7M+HvLbFNBXt -Yr8uikg6cTlFK6qoQy4j2s1HIVW7e7ZtLwbWPzwcm1XVK+cax7l05sCSmHzBaR75 -XfSOmU4YCZHJ1FoZuTvWoozO0HUtklCctAvRBQUAK9UifJbsjJkEYNsEAAWh1h/U -Ohfqrp3EjzUPnIfBoTQ0liAG3U47AAto0QPu8GkKzEgjdikvvGzGy/QPKW1/r6wx -8eVahK+JpsBUq6zgu1dQfTEBNmKWLmeQnPVsNgLBGrRu6lmxZpqn58Mqh+ItIVog -kwiLk1cacYUONlaQtUPdQ7P8IyiiJsTQ3BU/DMIzjcWHZk6YGT1JkKAeImmHF6Fz -Reuy5ELNJZuwDu4KbnnL8etfsWZzAH7FpageKIAundmo4P9z/LQmU8vvSA9cKd1p -DRquCEyXp52KKGk1qYwy128fMmFqbMjtbC6K54gblEHeYUJ5HDY7isK44X+d6Bz8 -yUEmBeWjkdiabDsL7kO1U8spG55W1s139gxiWL9b7nQ/M1l1Ikp+j+Npg1xxQbPU -Abeq6g+T1pVfm4DznSih/4tZ0/1Xou5Cf43Em8rEAP3KwdD8DvpdeCIQplxsgAIg -7A89w0aiXPDWWi+hl/NM/jzVD2A5tQIDAQABAoICAAGRIzgB/nDACRzD2BN0F0g2 -BqZmsovnGrQM0suplMK7oJRCFroGVOmhbthvzJP5oME18RzJsRNDOdxlthGDAtHc -HAxGLpB24XFUbeFomv2YMxgCCiDPMIddmgDQ+ojzoNMpEgEsYgKSDb032tdK3aq+ -igoYTxtgwu0zO9aVViko0J5DuMXxMPWraYd9XxpqpvGukK0cAvA4jNSUGZfYG2aL -gHu9bDlsULERhPwJ7Jv7iB0/iLUCPSHmUcZbPkY1ZwbYvB1U0KUArIlP8A4wify0 -+XS+cB0H+dmo9j14ZKW5hw9nBX4Bh0x0GYvHWTN0F2PNR46Y0IZpfgZAuRXWDisb -jWwrwrlHOMmKtz9fvBktJy27M/WpoeYXljK+hlmFlRHacI/ltx18S6Mc+j4g+ht3 -eL1+Gq5bJHLzZDl1pJPTTuWeqqdW5SadhuKwWeXsjVZdrOMkdqyHiftCnSTSOOSh -gbVXzgdhAI2jqtyMn57EERRGUiYNlPEqjk00AKSUKHWyNlfLDEPdqTYw0n0dHg6E -EcKhP/68Hj9+PdmyTDgWAY3faa/n77irrnhustdiG7sxqHIfNhEDoze02vvYorAl -Qawi1AJD2AWXuFgIMpNh7R9SBqeZah7D45JMek35cN2Bbuyv5z4n4ApMfXfZkaLk -6/Hk3sgGbhImW//MlqaRAoIBAQDyLp763+SisNqiQcgvE7W4FnInSCEDiR+yaZWC -1nSl7fM3iRP/BzyZnSL0NlUS6oXmwbxZ+6uFeJI17QrAVFd0vB4TC4rYrJfVag/X -5mKjGZYWz2J/fvOh68s28JMBtSSa4IWBJ2/1u2AB0u3ieLkZ5luHGo1q/MAqp4yu -58fTopdysTvUPnWu0vVzcPt1md1lhtTckXR9RBopSU0VDsxsj6SqVi1hL9k6y7rP -hj35uk42BhnzoN4gUj/+Kyi2ZwlZZxUqRyzoKQ7x1v75emrlBoVu8GjDZL0VZydm -w7bQECmCKAcRkpwBmEdd2vQGCKPlF765n7Y5xDPPOc600Lh/AoIBAQDDPMcXI1Du -oWR4kIzTLHJNXdkBYA6RtnEZ2BvqVR/MXH1ACRJMW0rDfExaSvUy2P6w8XNRad79 -0GB76a5Tlgkua6qJRu6vXt1gm7Mr0gja3V0f3N0yjESE8itgG6HDgAj3ZvyW+Hqj -RXpUdWqkjOMxzidZ1TMFS3kcfs3fjCbJBPlsxQ3oZKZqhQg9jtCAGjdhmjKtw2H6 -rOhLCiz+T9MPPeGVlV6UR2dZzyQU9xdpbnAr/Liyo4dLolc0CWxGwB+xwPzb+qd3 -Kx1NRfcmqctcD665JOXxZBpBEt5ErF8lqjpE+Q+lZWnDY1LdgXvowmKV2aM5HVHy -ZhVNVOidk5PLAoIBAQDqwDIub/RJlzB2c1k9+Nb+eBNy7EHEEZj98caRKpurc3l8 -bY1KeZNOO7j0C+5vBZGB2m1es8rQ98ySJRF02MxlRSvJvjh6SuJqZgKxfopCGr0X -ozKQ71ftrogu2wdEcnfnAJeoV7f49AXd/r3D9s1Fw7sYvK4z9Ie5UOvXZqiWBlbT -P+UEmP6t1aNCoVO97MVkckvG+d92xRquxnTHYq7Y1GwDCMG4IQ9qJK0SF8ffV64U -Q9nIBDkMD24kS2WNWVcAqCEl+BQZfiMUXRiObxFKqwWQQczrCa0XIARbYn7EM8Zo -ebBQYlKCYT9cRK6hYqKroFapy5xxZjPqPNiXAHK1AoIBAGCAyD/tmvF5IPpfKNyw -2YbYXo1Jd6oarekCYzn+/Yq8JMTkNwE7FsdtxyfSaUTK8Ylwr3mMhUacGzTkmuCC -BuPFIDRetVhF4dMA4x1D4lCcno1DVKrJnozATyRgRCMoREZVx4CwLZ5Kl17r8tyH -Lz3NErJaqa9yUNj+7LAUzI8MQGW9OVSne4KnYx1aXEEVtE4wM+Cj9Og9U0zUKM1D -k6WzBrAzdt6ANNu1gbZDNHVOu29iqcDTB+sgwU3dYoHOMVxhchsh2GkVDJTHgpS/ -1N8aeVjWnjolKr0DoI39TcKGU+sH2O3+JLsJe0o12JOCkcxUGVP/5COWxezFjX1m -FuUCggEAYjXpM6K/+OUjLOW75HlCkaq1Qxn/FqLIKgNCcYE50ZavSwhoPDlpO9K6 -mOLZVrLT+RPmqbe7x0wSfFekFyPKaO2fseEJq8IB3ZgaNtTCCgV8MD73kS2zdG+Z -Ila/a8Qql1JLskd2GIK8VAygmsOvTwslcftZFb6xCWncAYo+qEwGN5pXfGTLwJFV -LQfvLENKAPe9vv7rAKIgGmVGjsyPG4kG54MdEWqEYTycS7e67CddD3Lgmo7K+KHo -VPQuuk1aUKuO7oEfe+g7zAkr99nvidje2nUdrt8vbEB8akCM6qB2g5cHvrZsxujC -/qlzaPqzAXsdgqOqyXEJ5x3gxmfemw== +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 +Oeu1HE+LelnM2vOc9TtbJC9FrC8nYw== -----END PRIVATE KEY----- diff --git a/docker/certs/server.pem b/docker/certs/server.pem index 1c2cf9e2..7acbb192 100644 --- a/docker/certs/server.pem +++ b/docker/certs/server.pem @@ -1,83 +1,83 @@ -----BEGIN PRIVATE KEY----- -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 -/qlzaPqzAXsdgqOqyXEJ5x3gxmfemw== +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 +Oeu1HE+LelnM2vOc9TtbJC9FrC8nYw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- -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 -sIKYwEBx8av830JU/d9P/dzG7PMUJ7vv +BQcDAjAdBgNVHQ4EFgQUn6la/z79UFTu+LlDc6aDXG+6Tv0wHwYDVR0jBBgwFoAU +RHcTzm1u6x8WiXeAWDblHzwBt9kwDQYJKoZIhvcNAQELBQADggIBAA6sCw60Cr1V +aeFXxpzYKc3dtfKjuD6d5K6kwRkrt2AlsSfEk9fVu4SXbYeISXkL42g9nI02ce4j +o2iCeabgBT7HQVMsSx3KzlCXzXW2ACtma1D87RRQjBJinbCLSHaksZxSsMK6J+3u +MxLIgYIbxP9xGt8PLURkJq5tvJua8WZhdvaUXD1YdLANIzenCL6gHuW6WkzmHJ7E +c5rX/p8njJe7hse0ng04B9eQpuTPGUXYxOs7yMvSb5fNqZZr1EAVhBphDVjR6TuD +KTrh8vCDqHDj1xm00sbnYjzah/znmq+8XAvYGlf7DpuT68ipR914UDGvG4vKcdLz +x+3mcT3tOLfCT0VqlieWiJEdotk6EvFyubP034VxIqwr53ew2+e4m3dw39/HZ+Y1 +tggXWwlFpkZS/knLje9kz7F/EOReA4WknFSfm07B0Yv7qZNgTc/Kptw7FgPFTDLL +Cah96vwSny66C1iaRV4ALdAa1/ZNSkD/D6y1oTFGQVgy4KezjwlTA0EvmIS+wves +7jXoTSqO1iBRRl2DfHnzBtWHP1XtSTo7rqDHj6WOb/rEkTsgXqdnA5RQokj8zjLq +zaNaREfrAw55tuOASw0TbWLlv3qDofUlZyqOE6oCgCCjN/0KyqWm5m8lTUJKo6qg +HTMZ5IJXU9f1XKtMHLdGRpx0YiEGTw0e -----END CERTIFICATE----- diff --git a/docker/docker-mssql-2022.dockerfile b/docker/docker-mssql-2022.dockerfile index a5dafe24..930d3026 100644 --- a/docker/docker-mssql-2022.dockerfile +++ b/docker/docker-mssql-2022.dockerfile @@ -1,5 +1,5 @@ FROM mcr.microsoft.com/mssql/server:2022-latest -COPY --chmod=440 certs/server.* /certs/ -COPY --chmod=440 certs/customCA.* /certs/ +COPY --chmod=444 certs/server.* /certs/ +COPY --chmod=444 certs/customCA.* /certs/ COPY --chown=mssql docker-mssql.conf /var/opt/mssql/mssql.conf diff --git a/src/client/config.rs b/src/client/config.rs index b23ad449..fff68bc1 100644 --- a/src/client/config.rs +++ b/src/client/config.rs @@ -36,6 +36,7 @@ pub struct Config { #[derive(Clone, Debug)] pub(crate) enum TrustConfig { + #[allow(dead_code)] CaCertificateLocation(PathBuf), TrustAll, Default, diff --git a/src/client/config/ado_net.rs b/src/client/config/ado_net.rs index 09091fca..94df9ca3 100644 --- a/src/client/config/ado_net.rs +++ b/src/client/config/ado_net.rs @@ -37,14 +37,14 @@ impl ConfigString for AdoNetConfig { let parts: Vec<&str> = parts[0].split('\\').collect(); ServerDefinition { - host: Some(parts[0].replace("(local)", "localhost").into()), + host: Some(parts[0].replace("(local)", "localhost")), port, instance: Some(parts[1].into()), } } else { // Connect using a TCP target ServerDefinition { - host: Some(parts[0].replace("(local)", "localhost").into()), + host: Some(parts[0].replace("(local)", "localhost")), port: parse_port(&parts[1..])?, instance: None, } diff --git a/src/client/connection.rs b/src/client/connection.rs index 95bc25cd..c6ce1d66 100644 --- a/src/client/connection.rs +++ b/src/client/connection.rs @@ -284,6 +284,7 @@ impl Connection { /// Defines the login record rules with SQL Server. Authentication with /// connection options. + #[allow(clippy::too_many_arguments)] async fn login<'a>( mut self, auth: AuthMethod, diff --git a/src/sql_read_bytes.rs b/src/sql_read_bytes.rs index 63cc4085..0455a1ce 100644 --- a/src/sql_read_bytes.rs +++ b/src/sql_read_bytes.rs @@ -154,8 +154,11 @@ macro_rules! bytes_reader { }; } +/// The `SqlReadBytes` trait is used to read bytes from the wire. +// Many of the methods have an `allow(dead_code)` attribute because they are not currently used but they could be anytime in the future. pub(crate) trait SqlReadBytes: AsyncRead + Unpin { // Pretty-print current wire content. + #[allow(dead_code)] fn debug_buffer(&self); // The client state. @@ -165,6 +168,7 @@ pub(crate) trait SqlReadBytes: AsyncRead + Unpin { fn context_mut(&mut self) -> &mut Context; // Read a single i8 value. + #[allow(dead_code)] fn read_i8(&mut self) -> ReadI8<&mut Self> where Self: Unpin, @@ -189,6 +193,7 @@ pub(crate) trait SqlReadBytes: AsyncRead + Unpin { } // Read a single big-endian f32 value. + #[allow(dead_code)] fn read_f32(&mut self) -> ReadF32<&mut Self> where Self: Unpin, @@ -197,6 +202,7 @@ pub(crate) trait SqlReadBytes: AsyncRead + Unpin { } // Read a single big-endian f64 value. + #[allow(dead_code)] fn read_f64(&mut self) -> ReadF64<&mut Self> where Self: Unpin, @@ -245,6 +251,7 @@ pub(crate) trait SqlReadBytes: AsyncRead + Unpin { } // Read a single u128 value. + #[allow(dead_code)] fn read_u128_le(&mut self) -> ReadU128Le<&mut Self> where Self: Unpin, @@ -277,6 +284,7 @@ pub(crate) trait SqlReadBytes: AsyncRead + Unpin { } // Read a single i128 value. + #[allow(dead_code)] fn read_i128_le(&mut self) -> ReadI128Le<&mut Self> where Self: Unpin, diff --git a/src/tds/codec/column_data.rs b/src/tds/codec/column_data.rs index 6df30173..fecd83f7 100644 --- a/src/tds/codec/column_data.rs +++ b/src/tds/codec/column_data.rs @@ -341,7 +341,7 @@ impl<'a> Encode> for ColumnData<'a> { dst.put_u32_le(bytes.len() as u32); dst.extend_from_slice(bytes.as_slice()); - if bytes.len() > 0 { + if !bytes.is_empty() { // no next blob dst.put_u32_le(0u32); } @@ -502,7 +502,8 @@ impl<'a> Encode> for ColumnData<'a> { // unknown size dst.put_u64_le(0xfffffffffffffffe); dst.put_u32_le(bytes.len() as u32); - if bytes.len() > 0 { + + if !bytes.is_empty() { dst.extend(bytes.into_owned()); dst.put_u32_le(0); } @@ -527,7 +528,8 @@ impl<'a> Encode> for ColumnData<'a> { dst.put_u64_le(0xfffffffffffffffe_u64); // We'll write in one chunk, length is the whole bytes length dst.put_u32_le(bytes.len() as u32); - if bytes.len() > 0 { + + if !bytes.is_empty() { // Payload dst.extend(bytes.into_owned()); // PLP_TERMINATOR diff --git a/src/tds/codec/type_info.rs b/src/tds/codec/type_info.rs index 0b9aa624..20647d70 100644 --- a/src/tds/codec/type_info.rs +++ b/src/tds/codec/type_info.rs @@ -271,7 +271,7 @@ impl TypeInfo { Err(()) => Err(Error::Protocol( format!("invalid or unsupported column type: {:?}", ty).into(), )), - Ok(ty) if ty == VarLenType::Xml => { + Ok(VarLenType::Xml) => { let has_schema = src.read_u8().await?; let schema = if has_schema == 1 { diff --git a/src/tds/collation.rs b/src/tds/collation.rs index 13b8dbce..20367728 100644 --- a/src/tds/collation.rs +++ b/src/tds/collation.rs @@ -1,13 +1,13 @@ -use std::fmt; +//! legacy implementation of collations (or codepages rather) for dealing with varchar's with legacy databases +//! references [1] which has some mappings from the katmai (SQL Server 2008) source code and is a TDS driver +//! directly from microsoft +//! [2] is helpful to map CP1234 to the appropriate encoding +//! +//! [1] https://github.com/Microsoft/mssql-jdbc/blob/eb14f63077c47ef1fc1c690deb8cfab602baeb85/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java +//! [2] https://github.com/lifthrasiir/rust-encoding/blob/496823171f15d9b9446b2ec3fb7765f22346256b/src/label.rs#L282 -///! legacy implementation of collations (or codepages rather) for dealing with varchar's with legacy databases -///! references [1] which has some mappings from the katmai (SQL Server 2008) source code and is a TDS driver -///! directly from microsoft -///! [2] is helpful to map CP1234 to the appropriate encoding -///! -///! [1] https://github.com/Microsoft/mssql-jdbc/blob/eb14f63077c47ef1fc1c690deb8cfab602baeb85/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java -///! [2] https://github.com/lifthrasiir/rust-encoding/blob/496823171f15d9b9446b2ec3fb7765f22346256b/src/label.rs#L282 use encoding_rs::Encoding; +use std::fmt; use crate::error::Error; diff --git a/src/tds/context.rs b/src/tds/context.rs index 4c43b22b..732bac15 100644 --- a/src/tds/context.rs +++ b/src/tds/context.rs @@ -35,7 +35,7 @@ impl Context { } pub fn last_meta(&self) -> Option>> { - self.last_meta.as_ref().map(Arc::clone) + self.last_meta.clone() } pub fn packet_size(&self) -> u32 { diff --git a/src/tds/time/chrono.rs b/src/tds/time/chrono.rs index 4bdb59a5..f6de5001 100644 --- a/src/tds/time/chrono.rs +++ b/src/tds/time/chrono.rs @@ -81,7 +81,15 @@ from_sql!( let offset = chrono::Duration::minutes(dto.offset as i64); let naive = NaiveDateTime::new(date, time).sub(offset); - chrono::DateTime::from_utc(naive, Utc) + chrono::DateTime::from_naive_utc_and_offset(naive, Utc) + }), + ColumnData::DateTime2(ref dt2) => dt2.map(|dt2| { + let date = from_days(dt2.date.days() as i64, 1); + let ns = dt2.time.increments as i64 * 10i64.pow(9 - dt2.time.scale as u32); + let time = NaiveTime::from_hms_opt(0,0,0).unwrap() + chrono::Duration::nanoseconds(ns); + let naive = NaiveDateTime::new(date, time); + + chrono::DateTime::from_naive_utc_and_offset(naive, Utc) }); chrono::DateTime: ColumnData::DateTimeOffset(ref dto) => dto.map(|dto| { let date = from_days(dto.datetime2.date.days() as i64, 1); @@ -91,7 +99,7 @@ from_sql!( let offset = FixedOffset::east_opt((dto.offset as i32) * 60).unwrap(); let naive = NaiveDateTime::new(date, time); - chrono::DateTime::from_utc(naive, offset) + chrono::DateTime::from_naive_utc_and_offset(naive, offset) }) ); @@ -118,7 +126,7 @@ to_sql!(self_, DateTime2::new(date, time) }); - chrono::DateTime: (ColumnData::DateTimeOffset, { + chrono::DateTime: (ColumnData::DateTime2, { use chrono::Timelike; let naive = self_.naive_utc(); @@ -128,7 +136,7 @@ to_sql!(self_, let date = Date::new(to_days(naive.date(), 1) as u32); let time = Time {increments: nanos / 100, scale: 7}; - DateTimeOffset::new(DateTime2::new(date, time), 0) + DateTime2::new(date, time) }); chrono::DateTime: (ColumnData::DateTimeOffset, { use chrono::Timelike; @@ -170,7 +178,7 @@ into_sql!(self_, DateTime2::new(date, time) }); - chrono::DateTime: (ColumnData::DateTimeOffset, { + chrono::DateTime: (ColumnData::DateTime2, { use chrono::Timelike; let naive = self_.naive_utc(); @@ -180,7 +188,7 @@ into_sql!(self_, let date = Date::new(to_days(naive.date(), 1) as u32); let time = Time {increments: nanos / 100, scale: 7}; - DateTimeOffset::new(DateTime2::new(date, time), 0) + DateTime2::new(date, time) }); chrono::DateTime: (ColumnData::DateTimeOffset, { use chrono::Timelike; diff --git a/src/tds/time/time.rs b/src/tds/time/time.rs index 70d1c4d3..5a2b1cfa 100644 --- a/src/tds/time/time.rs +++ b/src/tds/time/time.rs @@ -4,10 +4,10 @@ //! The time library offers better ergonomy and are highly recommended if //! needing to modify and deal with date and time in SQL Server. -pub use time::*; +use std::time::Duration; +pub use time::{Date, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset}; use crate::tds::codec::ColumnData; -use std::time::Duration; #[inline] fn from_days(days: u64, start_year: i32) -> Date { diff --git a/src/tds/xml.rs b/src/tds/xml.rs index a059f32a..242be05f 100644 --- a/src/tds/xml.rs +++ b/src/tds/xml.rs @@ -76,9 +76,9 @@ impl XmlData { } } -impl ToString for XmlData { - fn to_string(&self) -> String { - self.data.to_string() +impl std::fmt::Display for XmlData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.data) } } diff --git a/tests/bulk.rs b/tests/bulk.rs index fdf059d9..33b90637 100644 --- a/tests/bulk.rs +++ b/tests/bulk.rs @@ -6,6 +6,8 @@ use std::env; use std::sync::Once; use tiberius::{IntoSql, Result, TokenRow}; +#[cfg(all(feature = "tds73", feature = "chrono"))] +use chrono::DateTime; #[cfg(all(feature = "tds73", feature = "chrono"))] use chrono::NaiveDateTime; @@ -112,6 +114,22 @@ test_bulk_type!(smallint("SMALLINT", 2000, 0..2000i16)); test_bulk_type!(int("INT", 2000, 0..2000i32)); test_bulk_type!(bigint("BIGINT", 2000, 0..2000i64)); +test_bulk_type!(empty_varchar( + "VARCHAR(MAX)", + 100, + vec![""; 100].into_iter() +)); +test_bulk_type!(empty_nvarchar( + "NVARCHAR(MAX)", + 100, + vec![""; 100].into_iter() +)); +test_bulk_type!(empty_varbinary( + "VARBINARY(MAX)", + 100, + vec![b""; 100].into_iter() +)); + test_bulk_type!(real( "REAL", 1000, @@ -134,61 +152,69 @@ test_bulk_type!(varchar_limited( test_bulk_type!(datetime2( "DATETIME2", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); +#[cfg(all(feature = "tds73", feature = "chrono"))] +test_bulk_type!(datetime2_naive("DATETIME2", 100, { + #[allow(deprecated)] + let dt = NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); + + vec![dt; 100].into_iter() +})); + #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_0( "DATETIME2(0)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_1( "DATETIME2(1)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_2( "DATETIME2(2)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_3( "DATETIME2(3)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_4( "DATETIME2(4)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_5( "DATETIME2(5)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_6( "DATETIME2(6)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); #[cfg(all(feature = "tds73", feature = "chrono"))] test_bulk_type!(datetime2_7( "DATETIME2(7)", 100, - vec![NaiveDateTime::from_timestamp_opt(1658524194, 123456789).unwrap(); 100].into_iter() + vec![DateTime::from_timestamp(1658524194, 123456789); 100].into_iter() )); diff --git a/tests/query.rs b/tests/query.rs index 527ab025..f2177ea2 100644 --- a/tests/query.rs +++ b/tests/query.rs @@ -2237,7 +2237,7 @@ where .unwrap() .and_hms_opt(16, 20, 0) .unwrap(); - let dt: DateTime = DateTime::from_utc(naive, Utc); + let dt: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); let row = conn .query("SELECT @P1", &[&dt]) @@ -2276,7 +2276,7 @@ where .unwrap(); let fixed = FixedOffset::east_opt(3600 * 3).unwrap(); - let dt: DateTime = DateTime::from_utc(naive, fixed); + let dt: DateTime = DateTime::from_naive_utc_and_offset(naive, fixed); let row = conn .query("SELECT @P1", &[&dt]) @@ -2314,7 +2314,7 @@ where .and_hms_opt(16, 20, 0) .unwrap(); let fixed = FixedOffset::east_opt(3600 * 3).unwrap(); - let dt: DateTime = DateTime::from_utc(naive, fixed); + let dt: DateTime = DateTime::from_naive_utc_and_offset(naive, fixed); let row = conn .query(format!("SELECT CAST('{}' AS datetimeoffset(7))", dt), &[])