diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bb2c2807..0c87b9c9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,10 +42,21 @@ jobs: run: cargo doc --workspace --no-deps --document-private-items --all-features env: RUSTDOCFLAGS: -D warnings + + docs_rs: + name: Emulate docs.rs build + runs-on: ubuntu-latest + env: + RUSTDOCFLAGS: -Dwarnings + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@nightly + - uses: dtolnay/install@cargo-docs-rs + - run: cargo +nightly docs-rs clippy: name: Clippy - needs: [format, docs] + needs: [format, docs, docs_rs] runs-on: ubuntu-latest strategy: matrix: diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index f62d444b..afea2372 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -29,7 +29,7 @@ jobs: exasol-version: ${{ env.EXASOL_VERSION }} num-nodes: ${{ env.NUM_NODES }} - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@1.86.0 - uses: Swatinem/rust-cache@v2 - name: Test IO combos (no TLS, no compression) @@ -38,41 +38,89 @@ jobs: env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true - + - name: Test IO combos (no TLS, with compression) timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} run: cargo test --features runtime-tokio,etl,compression -- it_works_with_io_combo --ignored --nocapture env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true - + - name: Test IO combos (NativeTLS, no compression) timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} run: cargo test --features runtime-tokio,etl,tls-native-tls -- it_works_with_io_combo --ignored --nocapture env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true - + - name: Test IO combos (NativeTLS, with compression) timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} run: cargo test --features runtime-tokio,etl,tls-native-tls,compression -- it_works_with_io_combo --ignored --nocapture env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true - + - name: Test IO combos (Rustls, no compression) timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs -- it_works_with_io_combo --ignored --nocapture env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true - + - name: Test IO combos (Rustls, with compression) timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs,compression -- it_works_with_io_combo --ignored --nocapture env: DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} SQLX_OFFLINE: true + + io_tests_latest: + name: IO tests on latest Exasol (TLS only) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Free disk space + uses: ./.github/actions/free-space + + - name: Create Exasol cluster + timeout-minutes: ${{ fromJSON(env.EXA_CLUSTER_SETUP_TIMEOUT) }} + id: exa-cluster + uses: ./.github/actions/exa-cluster + with: + exasol-version: latest + num-nodes: 1 + + - uses: dtolnay/rust-toolchain@1.86.0 + - uses: Swatinem/rust-cache@v2 + + - name: Test IO combos (NativeTLS, no compression) + timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} + run: cargo test --features runtime-tokio,etl,tls-native-tls -- it_works_with_io_combo_tls --ignored --nocapture + env: + DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} + SQLX_OFFLINE: true + + - name: Test IO combos (NativeTLS, with compression) + timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} + run: cargo test --features runtime-tokio,etl,tls-native-tls,compression -- it_works_with_io_combo_tls --ignored --nocapture + env: + DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} + SQLX_OFFLINE: true + + - name: Test IO combos (Rustls, no compression) + timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} + run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs -- it_works_with_io_combo_tls --ignored --nocapture + env: + DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} + SQLX_OFFLINE: true + + - name: Test IO combos (Rustls, with compression) + timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }} + run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs,compression -- it_works_with_io_combo_tls --ignored --nocapture + env: + DATABASE_URL: ${{ steps.exa-cluster.outputs.url }} + SQLX_OFFLINE: true driver_tests: name: Driver tests @@ -195,7 +243,7 @@ jobs: publish: name: Publish - needs: [io_tests, driver_tests, etl_tests] + needs: [io_tests, io_tests_latest, driver_tests, etl_tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9880e8..b2b80cba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.9.2] - 2026-01-23 + +### Fixed + +- [#59](https://github.com/bobozaur/sqlx-exasol/pull/59): More closely mimic sqlx feature flags + - mimic `sqlx` feature flags more closely to avoid surprises + - fix `docs.rs` build + - add `cargo docs-rs` CI job + - selective re-exports from `sqlx` and `sqlx-core` + - add latest Exasol IO tests to publish workflow + ## [0.9.1] - 2026-01-22 ### Added diff --git a/Cargo.toml b/Cargo.toml index 9d51419b..03e40b4e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ members = [".", "sqlx-exasol-cli", "sqlx-exasol-impl", "sqlx-exasol-macros"] [workspace.package] -version = "0.9.1" +version = "0.9.2" license = "MIT OR Apache-2.0" edition = "2024" rust-version = "1.86.0" @@ -23,77 +23,119 @@ authors.workspace = true repository.workspace = true exclude = ["tests/*"] +# Note: written so that it may be copy-pasted to other crates [package.metadata.docs.rs] -features = [ - "etl", - "compression", - "any", - "migrate", - "macros", - "bigdecimal", - "chrono", - "rust_decimal", - "time", - "uuid", - "json", - "geo-types", -] +features = ["_unstable-docs"] +rustdoc-args = ["--cfg", "docsrs"] [features] default = ["any", "macros", "migrate", "json"] -derive = ["sqlx-a-orig/derive", "sqlx-exasol-macros?/derive"] -macros = ["derive", "sqlx-a-orig/macros", "sqlx-exasol-macros/macros"] +derive = ["sqlx-exasol-macros/derive", "sqlx-orig/derive"] +macros = ["derive", "sqlx-exasol-macros/macros", "sqlx-orig/macros"] migrate = [ - "sqlx-a-orig/migrate", + "sqlx-core/migrate", + "sqlx-exasol-macros/migrate", "sqlx-exasol-impl/migrate", - "sqlx-exasol-macros?/migrate", ] -sqlx-toml = ["sqlx-exasol-impl/sqlx-toml", "sqlx-exasol-macros?/sqlx-toml"] +# Enable parsing of `sqlx.toml` for configuring macros and migrations. +sqlx-toml = ["sqlx-core/sqlx-toml", "sqlx-exasol-macros?/sqlx-toml"] + +# intended mainly for CI and docs +all-databases = ["any"] +_unstable-all-types = [ + "bigdecimal", + "rust_decimal", + "json", + "time", + "chrono", + "uuid", + "geo-types", +] + +# Render documentation that wouldn't otherwise be shown (e.g. `sqlx_core::config`). +_unstable-docs = ["all-databases", "_unstable-all-types", "etl", "compression"] # Base runtime features without TLS -runtime-async-std = ["sqlx-a-orig/runtime-async-std"] -runtime-tokio = ["sqlx-a-orig/runtime-tokio"] +runtime-async-global-executor = [ + "_rt-async-global-executor", + "sqlx-core/_rt-async-global-executor", + "sqlx-exasol-macros?/_rt-async-global-executor", +] +runtime-async-std = [ + "_rt-async-std", + "sqlx-core/_rt-async-std", + "sqlx-exasol-macros?/_rt-async-std", +] +runtime-smol = [ + "_rt-smol", + "sqlx-core/_rt-smol", + "sqlx-exasol-macros?/_rt-smol", +] +runtime-tokio = [ + "_rt-tokio", + "sqlx-core/_rt-tokio", + "sqlx-exasol-macros?/_rt-tokio", +] # TLS features -tls-native-tls = ["sqlx-a-orig/tls-native-tls", "sqlx-exasol-impl/native-tls"] +tls-native-tls = [ + "sqlx-core/_tls-native-tls", + "sqlx-exasol-macros?/_tls-native-tls", + "sqlx-exasol-impl/native-tls", +] +tls-rustls = ["tls-rustls-ring"] # For backwards compatibility tls-rustls-aws-lc-rs = [ - "sqlx-a-orig/tls-rustls-aws-lc-rs", + "sqlx-core/_tls-rustls-aws-lc-rs", + "sqlx-exasol-macros?/_tls-rustls-aws-lc-rs", "sqlx-exasol-impl/rustls-aws-lc-rs", ] +tls-rustls-ring = ["tls-rustls-ring-webpki"] # For backwards compatibility tls-rustls-ring-webpki = [ - "sqlx-a-orig/tls-rustls-ring-webpki", + "sqlx-core/_tls-rustls-ring-webpki", + "sqlx-exasol-macros?/_tls-rustls-ring-webpki", "sqlx-exasol-impl/rustls-ring", ] tls-rustls-ring-native-roots = [ - "sqlx-a-orig/tls-rustls-ring-native-roots", + "sqlx-core/_tls-rustls-ring-native-roots", + "sqlx-exasol-macros?/_tls-rustls-ring-native-roots", "sqlx-exasol-impl/rustls-ring", ] -# Database -any = ["sqlx-a-orig/any", "sqlx-exasol-impl/any"] +# No-op feature used by the workflows to compile without TLS enabled. Not meant for general use. +tls-none = [] + +# for conditional compilation +_rt-async-global-executor = [] +_rt-async-std = [] +_rt-smol = [] +_rt-tokio = [] + +# database +any = ["sqlx-core/any", "sqlx-exasol-impl/any"] + +# types +json = ["sqlx-core/json", "sqlx-exasol-macros?/json", "sqlx-exasol-impl/json"] -# Types bigdecimal = [ - "sqlx-a-orig/bigdecimal", - "sqlx-exasol-impl/bigdecimal", + "sqlx-core/bigdecimal", "sqlx-exasol-macros?/bigdecimal", + "sqlx-exasol-impl/bigdecimal", ] chrono = [ - "sqlx-a-orig/chrono", - "sqlx-exasol-impl/chrono", + "sqlx-core/chrono", "sqlx-exasol-macros?/chrono", + "sqlx-exasol-impl/chrono", ] -geo-types = ["sqlx-exasol-impl/geo-types", "sqlx-exasol-macros?/geo-types"] -json = ["sqlx-a-orig/json", "sqlx-exasol-impl/json", "sqlx-exasol-macros?/json"] rust_decimal = [ - "sqlx-a-orig/rust_decimal", - "sqlx-exasol-impl/rust_decimal", + "sqlx-core/rust_decimal", "sqlx-exasol-macros?/rust_decimal", + "sqlx-exasol-impl/rust_decimal", ] -time = ["sqlx-a-orig/time", "sqlx-exasol-impl/time", "sqlx-exasol-macros?/time"] -uuid = ["sqlx-a-orig/uuid", "sqlx-exasol-impl/uuid", "sqlx-exasol-macros?/uuid"] +time = ["sqlx-core/time", "sqlx-exasol-macros?/time", "sqlx-exasol-impl/time"] +uuid = ["sqlx-core/uuid", "sqlx-exasol-macros?/uuid", "sqlx-exasol-impl/uuid"] +geo-types = ["sqlx-exasol-macros?/geo-types", "sqlx-exasol-impl/geo-types"] # Driver specific features compression = ["sqlx-exasol-impl/compression"] @@ -101,9 +143,18 @@ etl = ["sqlx-exasol-impl/etl"] [workspace.dependencies] # Internal -sqlx-exasol = { version = "0.9.1", path = "." } -sqlx-exasol-macros = { version = "0.9.1", path = "sqlx-exasol-macros" } -sqlx-exasol-impl = { version = "0.9.1", path = "sqlx-exasol-impl" } +sqlx-exasol = { version = "=0.9.2", path = "." } +sqlx-exasol-macros = { version = "=0.9.2", path = "sqlx-exasol-macros" } +sqlx-exasol-impl = { version = "=0.9.2", path = "sqlx-exasol-impl" } + +# SQLx +sqlx-cli = { version = "=0.9.0-alpha.1", default-features = false } +sqlx-core = { version = "=0.9.0-alpha.1", default-features = false, features = [ + "offline", + "migrate", +] } +sqlx-macros-core = { version = "=0.9.0-alpha.1", default-features = false } +sqlx-orig = { version = "=0.9.0-alpha.1", default-features = false, package = "sqlx" } # External arrayvec = { version = "0.7", default-features = false } @@ -165,15 +216,6 @@ serde_json = { version = "1", default-features = false, features = [ "raw_value", ] } sha2 = { version = "0.10", default-features = false, features = ["std"] } -sqlx-cli = { version = "0.9.0-alpha.1", default-features = false } -sqlx-core = { version = "0.9.0-alpha.1", default-features = false, features = [ - "offline", - "migrate", -] } -sqlx-macros-core = { version = "0.9.0-alpha.1", default-features = false } -# Purposely named like this to prevent formatting reordering. -# We also get the benefit of ensuring that our overrides work correctly since `sqlx` is not available -sqlx-a-orig = { version = "0.9.0-alpha.1", default-features = false, package = "sqlx" } syn = { version = "2", default-features = false, features = [ "full", "parsing", @@ -203,7 +245,8 @@ wkt = { version = "0.14", default-features = false, features = [ [dependencies] sqlx-exasol-macros = { workspace = true, optional = true } sqlx-exasol-impl = { workspace = true } -sqlx-a-orig = { workspace = true } +sqlx-core = { workspace = true } +sqlx-orig = { workspace = true } [dev-dependencies] dotenvy = { workspace = true } diff --git a/sqlx-exasol-cli/Cargo.toml b/sqlx-exasol-cli/Cargo.toml index 0e91a6eb..85edd174 100644 --- a/sqlx-exasol-cli/Cargo.toml +++ b/sqlx-exasol-cli/Cargo.toml @@ -20,28 +20,30 @@ path = "src/sqlx-exasol.rs" name = "cargo-sqlx-exasol" path = "src/cargo-sqlx-exasol.rs" +[dependencies] +clap = { workspace = true } +console = { workspace = true } +sqlx-exasol = { workspace = true, features = [ + "runtime-tokio", + "migrate", + "any", +] } +sqlx-cli = { workspace = true } +tokio = { workspace = true } + [features] default = ["native-tls", "completions", "sqlx-toml"] +# TLS options rustls = ["sqlx-cli/rustls"] native-tls = ["sqlx-cli/native-tls"] +# workaround for musl + openssl issues openssl-vendored = ["sqlx-cli/openssl-vendored"] completions = ["sqlx-cli/completions"] sqlx-toml = ["sqlx-cli/sqlx-toml"] -[dependencies] -clap = { workspace = true } -console = { workspace = true } -sqlx-exasol = { workspace = true, features = [ - "runtime-tokio", - "migrate", - "any", -] } -sqlx-cli = { workspace = true } -tokio = { workspace = true } - [lints] workspace = true diff --git a/sqlx-exasol-impl/Cargo.toml b/sqlx-exasol-impl/Cargo.toml index c8addb63..67730354 100644 --- a/sqlx-exasol-impl/Cargo.toml +++ b/sqlx-exasol-impl/Cargo.toml @@ -11,22 +11,25 @@ categories.workspace = true authors.workspace = true [features] -# SQLx inherited features any = ["sqlx-core/any"] +json = ["sqlx-core/json"] migrate = ["sqlx-core/migrate", "dep:dotenvy", "dep:hex"] -macros = ["dep:sqlx-macros-core", "sqlx-macros-core?/macros"] -sqlx-toml = ["sqlx-core/sqlx-toml"] +offline = ["sqlx-core/offline"] # Type Integration features bigdecimal = ["sqlx-core/bigdecimal", "dep:bigdecimal"] chrono = ["sqlx-core/chrono", "dep:chrono"] geo-types = ["dep:geo-types", "dep:wkt"] -json = ["sqlx-core/json"] rust_decimal = ["sqlx-core/rust_decimal", "dep:rust_decimal"] time = ["sqlx-core/time", "dep:time"] uuid = ["sqlx-core/uuid", "dep:uuid"] -# TLS features +# Driver specific features +compression = ["dep:async-compression"] +etl = ["dep:flume", "dep:futures-channel", "dep:hyper"] +macros = ["dep:sqlx-macros-core", "sqlx-macros-core?/macros"] + +# TLS features for ETL tls = ["dep:rcgen", "dep:sha2"] native-tls = [ "dep:native-tls", @@ -38,11 +41,6 @@ rustls-aws-lc-rs = ["rustls", "rcgen?/aws_lc_rs"] rustls-ring = ["rustls", "rcgen?/ring"] rustls = ["dep:rustls", "sqlx-core/_tls-rustls", "tls"] -# Driver specific features -compression = ["dep:async-compression"] -etl = ["dep:flume", "dep:futures-channel", "dep:hyper"] - - [dependencies] arrayvec = { workspace = true } async-tungstenite = { workspace = true } @@ -81,7 +79,7 @@ uuid = { workspace = true, optional = true } wkt = { workspace = true, optional = true } [dev-dependencies] -sqlx-a-orig = { workspace = true, features = [ +sqlx-orig = { workspace = true, features = [ "runtime-tokio", "macros", "migrate", diff --git a/sqlx-exasol-impl/src/lib.rs b/sqlx-exasol-impl/src/lib.rs index 0ba64794..404cb814 100644 --- a/sqlx-exasol-impl/src/lib.rs +++ b/sqlx-exasol-impl/src/lib.rs @@ -1,8 +1,9 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] //! **EXASOL** database driver. +// Provide correct path resolution in proc-macros for testing #[cfg(test)] -extern crate sqlx_a_orig as sqlx; +extern crate sqlx_orig as sqlx; #[cfg(feature = "native-tls")] use native_tls as _; @@ -66,6 +67,9 @@ pub type ExaPoolOptions = sqlx_core::pool::PoolOptions; pub trait ExaExecutor<'c>: Executor<'c, Database = Exasol> {} impl<'c, T: Executor<'c, Database = Exasol>> ExaExecutor<'c> for T {} +/// An alias for [`Transaction`][sqlx_core::transaction::Transaction], specialized for Exasol. +pub type ExaTransaction<'c> = sqlx_core::transaction::Transaction<'c, Exasol>; + impl_into_arguments_for_arguments!(ExaArguments); impl_acquire!(Exasol, ExaConnection); impl_column_index_for_row!(ExaRow); diff --git a/sqlx-exasol-macros/Cargo.toml b/sqlx-exasol-macros/Cargo.toml index bee2b49b..cb74b0ea 100644 --- a/sqlx-exasol-macros/Cargo.toml +++ b/sqlx-exasol-macros/Cargo.toml @@ -14,68 +14,46 @@ authors.workspace = true proc-macro = true [features] -# SQLx features -derive = ["dep:sqlx-macros-core", "sqlx-macros-core?/derive"] -macros = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/macros", - "sqlx-exasol-impl?/macros", -] -migrate = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/migrate", - "sqlx-exasol-impl?/migrate", -] -sqlx-toml = ["dep:sqlx-macros-core", "sqlx-macros-core?/sqlx-toml"] +default = [] -# Types -bigdecimal = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/bigdecimal", - "sqlx-exasol-impl?/bigdecimal", -] -chrono = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/chrono", - "sqlx-exasol-impl?/chrono", -] -geo-types = ["dep:sqlx-exasol-impl", "sqlx-exasol-impl?/geo-types"] -json = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/json", - "sqlx-exasol-impl?/json", +# for conditional compilation +_rt-async-global-executor = ["sqlx-macros-core/_rt-async-global-executor"] +_rt-async-std = ["sqlx-macros-core/_rt-async-std"] +_rt-smol = ["sqlx-macros-core/_rt-smol"] +_rt-tokio = ["sqlx-macros-core/_rt-tokio"] + +_tls-native-tls = ["sqlx-macros-core/_tls-native-tls"] +_tls-rustls-aws-lc-rs = ["sqlx-macros-core/_tls-rustls-aws-lc-rs"] +_tls-rustls-ring-webpki = ["sqlx-macros-core/_tls-rustls-ring-webpki"] +_tls-rustls-ring-native-roots = [ + "sqlx-macros-core/_tls-rustls-ring-native-roots", ] + +# SQLx features +derive = ["sqlx-macros-core/derive"] +macros = ["sqlx-macros-core/macros", "sqlx-exasol-impl/macros"] +migrate = ["sqlx-macros-core/migrate", "sqlx-exasol-impl/migrate"] + +sqlx-toml = ["sqlx-macros-core/sqlx-toml"] + +# type +bigdecimal = ["sqlx-macros-core/bigdecimal", "sqlx-exasol-impl/bigdecimal"] +chrono = ["sqlx-macros-core/chrono", "sqlx-exasol-impl/chrono"] +geo-types = ["sqlx-exasol-impl/geo-types"] +json = ["sqlx-macros-core/json", "sqlx-exasol-impl/json"] rust_decimal = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/rust_decimal", - "sqlx-exasol-impl?/rust_decimal", -] -time = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/time", - "sqlx-exasol-impl?/time", -] -uuid = [ - "dep:sqlx-macros-core", - "dep:sqlx-exasol-impl", - "sqlx-macros-core?/uuid", - "sqlx-exasol-impl?/uuid", + "sqlx-macros-core/rust_decimal", + "sqlx-exasol-impl/rust_decimal", ] +time = ["sqlx-macros-core/time", "sqlx-exasol-impl/time"] +uuid = ["sqlx-macros-core/uuid", "sqlx-exasol-impl/uuid"] [dependencies] proc-macro2 = { workspace = true } +sqlx-macros-core = { workspace = true } +sqlx-exasol-impl = { workspace = true } syn = { workspace = true } quote = { workspace = true } -sqlx-macros-core = { workspace = true, optional = true } -sqlx-exasol-impl = { workspace = true, optional = true } - [lints] workspace = true diff --git a/sqlx-exasol-macros/src/lib.rs b/sqlx-exasol-macros/src/lib.rs index 702b7986..9100f85f 100644 --- a/sqlx-exasol-macros/src/lib.rs +++ b/sqlx-exasol-macros/src/lib.rs @@ -1,5 +1,3 @@ -#![cfg_attr(not(test), warn(unused_crate_dependencies))] - mod parse; #[allow(unused_imports, reason = "built-in; conditionally compiled")] diff --git a/src/.rustfmt.toml b/src/.rustfmt.toml new file mode 100644 index 00000000..9480bad0 --- /dev/null +++ b/src/.rustfmt.toml @@ -0,0 +1 @@ +group_imports = "Preserve" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 46406a79..9db65fba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,48 +1,121 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("lib.md")] -/// Ain't nobody got time to track what needs to be re-exported from `sqlx` so I'll just do a -/// glob re-export and override some things. Ideally a single module containing all the -/// re-exports that an external driver should have should be made in `sqlx-core`. -pub use sqlx_a_orig::*; +pub use sqlx_core::acquire::Acquire; +pub use sqlx_core::arguments::{Arguments, IntoArguments}; +pub use sqlx_core::column::Column; +pub use sqlx_core::column::ColumnIndex; +pub use sqlx_core::column::ColumnOrigin; +pub use sqlx_core::connection::{ConnectOptions, Connection}; +pub use sqlx_core::database::{self, Database}; +pub use sqlx_core::describe::Describe; +pub use sqlx_core::executor::{Execute, Executor}; +pub use sqlx_core::from_row::FromRow; +pub use sqlx_core::pool::{self, Pool}; +#[doc(hidden)] +pub use sqlx_core::query::query_with_result as __query_with_result; +pub use sqlx_core::query::{query, query_with}; +pub use sqlx_core::query_as::{query_as, query_as_with}; +pub use sqlx_core::query_builder::{self, QueryBuilder}; +#[doc(hidden)] +pub use sqlx_core::query_scalar::query_scalar_with_result as __query_scalar_with_result; +pub use sqlx_core::query_scalar::{query_scalar, query_scalar_with}; +#[rustfmt::skip] // preserver order +pub use sqlx_core::raw_sql::{raw_sql, RawSql}; +pub use sqlx_core::row::Row; +pub use sqlx_core::sql_str::{AssertSqlSafe, SqlSafeStr, SqlStr}; +pub use sqlx_core::statement::Statement; +pub use sqlx_core::transaction::Transaction; +pub use sqlx_core::type_info::TypeInfo; +pub use sqlx_core::types::Type; +pub use sqlx_core::value::{Value, ValueRef}; +#[rustfmt::skip] // preserver order +pub use sqlx_core::Either; + +#[doc(inline)] +pub use sqlx_core::error::{self, Error, Result}; + +#[cfg(feature = "migrate")] +pub use sqlx_core::migrate; + +// Driver re-exports +#[doc(inline)] pub use sqlx_exasol_impl::*; -pub mod any { - pub use sqlx_a_orig::any::*; - pub use sqlx_exasol_impl::any::DRIVER; -} +#[rustfmt::skip] // preserver order +#[cfg(feature = "any")] +#[cfg_attr(docsrs, doc(cfg(feature = "any")))] +pub use crate::any::{reexports::*, Any, AnyExecutor}; #[cfg(any(feature = "derive", feature = "macros"))] #[doc(hidden)] pub extern crate sqlx_exasol_macros; -#[cfg(feature = "macros")] -pub use sqlx_exasol_macros::test; +// derives #[cfg(feature = "derive")] #[doc(hidden)] pub use sqlx_exasol_macros::{FromRow, Type}; +#[cfg(feature = "macros")] +pub use sqlx_exasol_macros::test; + +#[doc(hidden)] +#[cfg(feature = "migrate")] +pub use sqlx_core::testing; + +#[doc(hidden)] +pub use sqlx_core::rt::test_block_on; + +// Replicates `sqlx::any` module re-exports +#[cfg(feature = "any")] +pub mod any { + #[allow(deprecated)] + pub use sqlx_core::any::AnyKind; + #[cfg_attr(docsrs, doc(cfg(feature = "any")))] + pub use sqlx_core::any::{ + Any, AnyArguments, AnyConnectOptions, AnyExecutor, AnyPoolOptions, AnyQueryResult, AnyRow, + AnyStatement, AnyTransactionManager, AnyTypeInfo, AnyTypeInfoKind, AnyValue, AnyValueRef, + driver::install_drivers, + }; + + pub(crate) mod reexports { + pub use sqlx_core::any::AnyConnection; + pub use sqlx_core::any::AnyPool; + } + pub use sqlx_exasol_impl::any::*; +} + #[cfg(feature = "macros")] mod macros; +// macro support #[cfg(feature = "macros")] #[doc(hidden)] pub mod ty_match; +// Not present in `sqlx-core`, unfortunately. +#[cfg(any(feature = "derive", feature = "macros"))] +#[doc(hidden)] +pub use sqlx_orig::spec_error; + +#[doc(hidden)] +pub use sqlx_core::rt as __rt; + #[doc = include_str!("types.md")] pub mod types { - pub use sqlx_a_orig::types::*; + pub use sqlx_core::types::*; pub use sqlx_exasol_impl::types::*; #[cfg(feature = "chrono")] pub mod chrono { - pub use sqlx_a_orig::types::chrono::*; + pub use sqlx_core::types::chrono::*; pub use sqlx_exasol_impl::types::chrono::*; } #[cfg(feature = "time")] pub mod time { - pub use sqlx_a_orig::types::time::*; + pub use sqlx_core::types::time::*; pub use sqlx_exasol_impl::types::time::*; } @@ -51,16 +124,61 @@ pub mod types { pub use sqlx_exasol_macros::Type; } +/// Provides [`Encode`] for encoding values for the database. pub mod encode { - pub use sqlx_a_orig::encode::*; + pub use sqlx_core::encode::{Encode, IsNull}; + #[cfg(feature = "derive")] #[doc(hidden)] pub use sqlx_exasol_macros::Encode; } +pub use self::encode::Encode; + +/// Provides [`Decode`] for decoding values from the database. pub mod decode { - pub use sqlx_a_orig::decode::*; + pub use sqlx_core::decode::Decode; + #[cfg(feature = "derive")] #[doc(hidden)] pub use sqlx_exasol_macros::Decode; } + +pub use self::decode::Decode; + +/// Types and traits for the `query` family of functions and macros. +pub mod query { + pub use sqlx_core::query::{Map, Query}; + pub use sqlx_core::query_as::QueryAs; + pub use sqlx_core::query_scalar::QueryScalar; +} + +/// Convenience re-export of common traits. +pub mod prelude { + pub use super::Acquire; + pub use super::ConnectOptions; + pub use super::Connection; + pub use super::Decode; + pub use super::Encode; + pub use super::Executor; + pub use super::FromRow; + pub use super::IntoArguments; + pub use super::Row; + pub use super::Statement; + pub use super::Type; +} + +#[cfg(feature = "_unstable-docs")] +pub use sqlx_core::config as _config; + +// NOTE: APIs exported in this module are SemVer-exempt. +#[doc(hidden)] +pub mod _unstable { + pub use sqlx_core::config; +} + +// Not present in `sqlx-core`, unfortunately. +#[doc(hidden)] +pub use sqlx_orig::{ + warn_on_ambiguous_inferred_date_time_crate, warn_on_ambiguous_inferred_numeric_crate, +}; diff --git a/src/macros.rs b/src/macros.rs index fee698a4..07e041f6 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -135,11 +135,7 @@ macro_rules! query_file_scalar_unchecked ( #[cfg(feature = "migrate")] #[macro_export] macro_rules! migrate { - ($dir:literal) => {{ - $crate::sqlx_exasol_macros::migrate!($dir) - }}; + ($dir:literal) => {{ $crate::sqlx_exasol_macros::migrate!($dir) }}; - () => {{ - $crate::sqlx_exasol_macros::migrate!() - }}; + () => {{ $crate::sqlx_exasol_macros::migrate!() }}; }