diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 0000000..1ee2e8d --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,53 @@ +name: Benchmarks + +on: + push: + branches: + - main + pull_request: + types: [ opened, reopened, synchronize ] + +permissions: + contents: read + +jobs: + benchmark: + name: Run Benchmarks + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + components: 'llvm-tools-preview' + toolchain: stable + + - name: Install benchmarking tools + uses: bencherdev/bencher@main + + - name: Run benchmarks + if: ${{ github.event_name == 'pull_request' }} + env: + BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} + BENCHER_PROJECT: theseus-rs-postgresql-embedded + BENCHER_ADAPTER: rust_criterion + run: | + bencher run \ + --branch $GITHUB_HEAD_REF \ + --ci-number "${{ github.event.number }}" \ + --github-actions "${{ secrets.GITHUB_TOKEN }}" \ + --err \ + "cargo bench" + + - name: Run benchmarks + if: ${{ github.event_name != 'pull_request' }} + env: + BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} + BENCHER_PROJECT: theseus-rs-postgresql-embedded + BENCHER_ADAPTER: rust_criterion + run: | + bencher run "cargo bench --features blocking" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 55433f3..975a212 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,16 +85,3 @@ jobs: verbose: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - - - name: Install benchmarking tools - if: ${{ github.ref == 'refs/heads/main' && matrix.platform == 'linux-x64' }} - uses: bencherdev/bencher@main - - - name: Run benchmarks - if: ${{ github.ref == 'refs/heads/main' && matrix.platform == 'linux-x64' }} - env: - BENCHER_API_TOKEN: ${{ secrets.BENCHER_API_TOKEN }} - BENCHER_PROJECT: theseus-rs-postgresql-embedded - BENCHER_ADAPTER: rust_criterion - run: | - bencher run "cargo bench --features blocking" diff --git a/CHANGELOG.md b/CHANGELOG.md index 11e4546..f73bd06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,105 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## `postgresql_embedded` - [0.19.0](https://github.com/theseus-rs/postgresql-embedded/compare/v0.18.7...v0.19.0) - 2025-06-24 + +### Added +- allow skipping the installation step during setup + +### Other +- correct typo in variable name +- update extractor feature documentation + +## `postgresql_archive` - [0.19.0](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_archive-v0.18.7...postgresql_archive-v0.19.0) - 2025-06-24 + +### Other +- update extractor feature documentation + +## `postgresql_embedded` - [0.18.7](https://github.com/theseus-rs/postgresql-embedded/compare/v0.18.6...v0.18.7) - 2025-06-20 + +### Fixed +- set CREATE_NO_WINDOW creation flag on Windows + +### Other +- update Cargo.toml dependencies + +## `postgresql_commands` - [0.18.7](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_commands-v0.18.6...postgresql_commands-v0.18.7) - 2025-06-20 + +### Fixed +- set CREATE_NO_WINDOW creation flag on Windows + +## `postgresql_archive` - [0.18.7](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_archive-v0.18.6...postgresql_archive-v0.18.7) - 2025-06-20 + +### Other +- update Cargo.toml dependencies + +## `postgresql_extensions` - [0.18.6](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_extensions-v0.18.5...postgresql_extensions-v0.18.6) - 2025-06-17 + +### Added + +- add extractor feature flags + +### Other + +- correct lint errors + +## `postgresql_embedded` - [0.18.6](https://github.com/theseus-rs/postgresql-embedded/compare/v0.18.5...v0.18.6) - 2025-06-17 + +### Added + +- add extractor feature flags + +### Other + +- make liblzma an optional dependency +- add documentation for bundled feature flag +- correct lint errors + +## `postgresql_archive` - [0.18.6](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_archive-v0.18.5...postgresql_archive-v0.18.6) - 2025-06-17 + +### Added + +- add extractor feature flags + +### Other + +- make liblzma an optional dependency +- correct lint errors + +## `postgresql_extensions` - [0.18.5](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_extensions-v0.18.4...postgresql_extensions-v0.18.5) - 2025-05-28 + +### Other +- update Cargo.toml dependencies + +## `postgresql_embedded` - [0.18.5](https://github.com/theseus-rs/postgresql-embedded/compare/v0.18.4...v0.18.5) - 2025-05-28 + +### Fixed +- correct theseus build bundle +- revert SupportFn type change +- custom release url not working and compilation failure + +### Other +- Merge branch 'main' into main +- update to criterion=0.6.0, pgvector=0.4.1, reqwest=0.12.18, sqlx=0.8.6, tokio=1.45.1, zip=4.0.0 +- minor syntax change +- update Cargo.toml dependencies + +## `postgresql_commands` - [0.18.5](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_commands-v0.18.4...postgresql_commands-v0.18.5) - 2025-05-28 + +### Other +- update Cargo.toml dependencies + +## `postgresql_archive` - [0.18.5](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_archive-v0.18.4...postgresql_archive-v0.18.5) - 2025-05-28 + +### Fixed +- correct theseus build bundle +- revert SupportFn type change +- custom release url not working and compilation failure + +### Other +- update to criterion=0.6.0, pgvector=0.4.1, reqwest=0.12.18, sqlx=0.8.6, tokio=1.45.1, zip=4.0.0 +- minor syntax change + ## `postgresql_extensions` - [0.18.4](https://github.com/theseus-rs/postgresql-embedded/compare/postgresql_extensions-v0.18.3...postgresql_extensions-v0.18.4) - 2025-05-15 ### Other diff --git a/Cargo.lock b/Cargo.lock index b9a1a87..2b593a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -40,9 +40,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -55,36 +55,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -105,7 +105,7 @@ dependencies = [ [[package]] name = "archive_async" -version = "0.18.4" +version = "0.19.0" dependencies = [ "postgresql_archive", "tempfile", @@ -114,7 +114,7 @@ dependencies = [ [[package]] name = "archive_sync" -version = "0.18.4" +version = "0.19.0" dependencies = [ "postgresql_archive", "tempfile", @@ -148,9 +148,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -208,7 +208,7 @@ dependencies = [ [[package]] name = "axum_embedded" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "axum", @@ -264,9 +264,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byteorder" @@ -288,9 +288,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.22" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "jobserver", "libc", @@ -299,9 +299,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -338,18 +338,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.38" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.38" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstyle", "clap_lex", @@ -357,15 +357,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "concurrent-queue" @@ -385,7 +385,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "windows-sys 0.59.0", ] @@ -401,9 +401,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -450,25 +450,22 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", - "is-terminal", - "itertools", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -481,7 +478,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -582,9 +579,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.10" +version = "2.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3e1edb1f37b4953dd5176916347289ed43d7119cc2e6c7c3f7849ff44ea506" +checksum = "a917a9209950404d5be011c81d081a2692a822f73c3d6af586f0cab5ff50f614" dependencies = [ "bitflags 2.9.1", "byteorder", @@ -596,9 +593,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68d4216021b3ea446fd2047f5c8f8fe6e98af34508a254a01e4d6bc1e844f84d" +checksum = "52841e97814f407b895d836fa0012091dff79c6268f39ad8155d384c21ae0d26" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -609,7 +606,7 @@ dependencies = [ [[package]] name = "diesel_embedded" -version = "0.18.4" +version = "0.19.0" dependencies = [ "diesel", "diesel_migrations", @@ -668,7 +665,7 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "download_progress_bar" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "indicatif", @@ -705,7 +702,7 @@ dependencies = [ [[package]] name = "embedded_async" -version = "0.18.4" +version = "0.19.0" dependencies = [ "postgresql_embedded", "tokio", @@ -713,7 +710,7 @@ dependencies = [ [[package]] name = "embedded_sync" -version = "0.18.4" +version = "0.19.0" dependencies = [ "postgresql_embedded", ] @@ -753,12 +750,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -809,9 +806,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "libz-rs-sys", @@ -904,7 +901,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.3", + "parking_lot 0.12.4", ] [[package]] @@ -973,7 +970,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -1009,9 +1006,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -1033,12 +1030,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - [[package]] name = "hex" version = "0.4.3" @@ -1140,11 +1131,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -1174,17 +1164,21 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", @@ -1241,9 +1235,9 @@ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", @@ -1257,9 +1251,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -1324,7 +1318,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "vt100", "web-time", ] @@ -1354,14 +1348,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "is-terminal" -version = "0.4.16" +name = "iri-string" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.59.0", + "memchr", + "serde", ] [[package]] @@ -1379,6 +1372,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -1413,24 +1415,24 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "liblzma" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66352d7a8ac12d4877b6e6ea5a9b7650ee094257dc40889955bea5bc5b08c1d0" +checksum = "0791ab7e08ccc8e0ce893f6906eb2703ed8739d8e89b57c0714e71bad09024c8" dependencies = [ "liblzma-sys", ] [[package]] name = "liblzma-sys" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5839bad90c3cc2e0b8c4ed8296b80e86040240f81d46b9c0e9bc8dd51ddd3af1" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" dependencies = [ "cc", "libc", @@ -1445,14 +1447,14 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", ] [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" dependencies = [ "zlib-rs", ] @@ -1471,9 +1473,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1518,9 +1520,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "migrations_internals" @@ -1551,22 +1553,22 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -1636,6 +1638,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "oorandom" version = "11.1.5" @@ -1644,9 +1652,9 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -1676,9 +1684,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -1711,12 +1719,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] [[package]] @@ -1735,13 +1743,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", "smallvec", "windows-targets 0.52.6", ] @@ -1754,9 +1762,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pgvector" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e8871b6d7ca78348c6cd29b911b94851f3429f0cd403130ca17f26c1fb91a6" +checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" dependencies = [ "sqlx", ] @@ -1827,13 +1835,13 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portal_corp_extension" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "indoc", @@ -1891,7 +1899,7 @@ dependencies = [ [[package]] name = "postgres_embedded" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "postgres", @@ -1900,7 +1908,7 @@ dependencies = [ [[package]] name = "postgresql_archive" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "async-trait", @@ -1936,7 +1944,7 @@ dependencies = [ [[package]] name = "postgresql_commands" -version = "0.18.4" +version = "0.19.0" dependencies = [ "test-log", "thiserror 2.0.12", @@ -1946,7 +1954,7 @@ dependencies = [ [[package]] name = "postgresql_embedded" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "criterion", @@ -1966,7 +1974,7 @@ dependencies = [ [[package]] name = "postgresql_extensions" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "async-trait", @@ -2007,9 +2015,9 @@ dependencies = [ [[package]] name = "pq-sys" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c852911b98f5981956037b2ca976660612e548986c30af075e753107bc3400" +checksum = "dfd6cf44cca8f9624bc19df234fc4112873432f5fda1caff174527846d026fa9" dependencies = [ "libc", "vcpkg", @@ -2077,9 +2085,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" dependencies = [ "cfg_aliases", "libc", @@ -2100,9 +2108,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "r2d2" @@ -2111,7 +2119,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ "log", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "scheduled-thread-pool", ] @@ -2215,9 +2223,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags 2.9.1", ] @@ -2274,9 +2282,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", @@ -2289,18 +2297,14 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", - "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", "rustls-native-certs", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -2311,13 +2315,13 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "windows-registry", ] [[package]] @@ -2359,9 +2363,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0eee96990cfb4c09545847385e89b2d2d2e571143d55264a05d77c713780" +checksum = "d70ea85f131b2ee9874f0b160ac5976f8af75f3c9badfe0d955880257d10bd83" dependencies = [ "anyhow", "async-trait", @@ -2398,9 +2402,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -2423,9 +2427,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "once_cell", "ring", @@ -2447,15 +2451,6 @@ dependencies = [ "security-framework 3.2.0", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -2479,9 +2474,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -2513,7 +2508,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "parking_lot 0.12.3", + "parking_lot 0.12.4", ] [[package]] @@ -2542,7 +2537,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ "bitflags 2.9.1", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2611,9 +2606,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2690,27 +2685,24 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2718,9 +2710,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2729,9 +2721,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64", "bytes", @@ -2766,9 +2758,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" dependencies = [ "proc-macro2", "quote", @@ -2779,9 +2771,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ "dotenvy", "either", @@ -2796,16 +2788,15 @@ dependencies = [ "sqlx-core", "sqlx-postgres", "syn", - "tempfile", "tokio", "url", ] [[package]] name = "sqlx-postgres" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", @@ -2840,7 +2831,7 @@ dependencies = [ [[package]] name = "sqlx_embedded" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "postgresql_embedded", @@ -2879,9 +2870,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" dependencies = [ "proc-macro2", "quote", @@ -2940,7 +2931,7 @@ dependencies = [ [[package]] name = "tensor_chord_extension" -version = "0.18.4" +version = "0.19.0" dependencies = [ "anyhow", "indoc", @@ -3016,12 +3007,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -3061,15 +3051,15 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3111,7 +3101,7 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "percent-encoding", "phf", "pin-project-lite", @@ -3160,9 +3150,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -3172,18 +3162,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", @@ -3195,9 +3185,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" @@ -3215,6 +3205,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -3241,9 +3249,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -3252,9 +3260,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -3348,9 +3356,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "untrusted" @@ -3453,9 +3461,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -3597,14 +3605,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.0", + "webpki-roots 1.0.1", ] [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" dependencies = [ "rustls-pki-types", ] @@ -3615,7 +3623,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", "wasite", "web-sys", ] @@ -3651,41 +3659,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -3713,6 +3686,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3746,9 +3728,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", @@ -3900,9 +3882,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] @@ -3958,18 +3940,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", @@ -4038,9 +4020,9 @@ dependencies = [ [[package]] name = "zip" -version = "3.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +checksum = "af7dcdb4229c0e79c2531a24de7726a0e980417a74fb4d030a35f535665439a0" dependencies = [ "arbitrary", "crc32fast", @@ -4052,13 +4034,13 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" [[package]] name = "zonky" -version = "0.18.4" +version = "0.19.0" dependencies = [ "postgresql_archive", "postgresql_embedded", diff --git a/Cargo.toml b/Cargo.toml index 5131922..02301a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,50 +22,50 @@ keywords = ["postgresql", "postgres", "embedded", "database", "server"] license = "(Apache-2.0 OR MIT) AND PostgreSQL" repository = "https://github.com/theseus-rs/postgresql-embedded" rust-version = "1.87.0" -version = "0.18.4" +version = "0.19.0" [workspace.dependencies] anyhow = "1.0.98" async-trait = "0.1.88" axum = "0.8.4" -criterion = "0.5.1" -diesel = "2.2.10" +criterion = "0.6.0" +diesel = "2.2.11" diesel_migrations = "2.2.0" -flate2 = "1.1.1" +flate2 = "1.1.2" futures-util = "0.3.31" hex = "0.4.3" indicatif = "0.17.11" indoc = "2.0.6" -liblzma = "0.4.1" +liblzma = "0.4.2" md-5 = "0.10.6" num-format = "0.4.4" -pgvector = "0.4.0" +pgvector = "0.4.1" postgres = "0.19.10" quick-xml = "0.37.5" r2d2_postgres = "0.18.2" rand = "0.9.1" regex-lite = "0.1.6" -reqwest = { version = "0.12.15", default-features = false } +reqwest = { version = "0.12.20", default-features = false } reqwest-middleware = "0.4.2" reqwest-retry = "0.7.0" -reqwest-tracing = "0.5.7" +reqwest-tracing = "0.5.8" semver = "1.0.26" serde = "1.0.219" serde_json = "1.0.140" sha1 = "0.10.6" sha2 = "0.10.8" -sqlx = { version = "0.8.5", default-features = false, features = ["postgres"] } +sqlx = { version = "0.8.6", default-features = false, features = ["postgres"] } tar = "0.4.44" target-triple = "0.1.4" tempfile = "3.20.0" test-log = "0.2.17" thiserror = "2.0.12" -tokio = "1.45.0" +tokio = "1.45.1" tracing = "0.1.41" tracing-indicatif = "0.3.9" tracing-subscriber = "0.3.19" url = "2.5.4" -zip = { version = "3.0.0", default-features = false, features = ["deflate"] } +zip = { version = "4.1.0", default-features = false, features = ["deflate"] } [workspace.metadata.release] shared-version = true diff --git a/postgresql_archive/Cargo.toml b/postgresql_archive/Cargo.toml index 966aaf6..c415a65 100644 --- a/postgresql_archive/Cargo.toml +++ b/postgresql_archive/Cargo.toml @@ -12,10 +12,10 @@ version.workspace = true [dependencies] async-trait = { workspace = true } -flate2 = { workspace = true } +flate2 = { workspace = true, optional = true } futures-util = { workspace = true } hex = { workspace = true } -liblzma = { workspace = true } +liblzma = { workspace = true, optional = true } md-5 = { workspace = true, optional = true } num-format = { workspace = true } quick-xml = { workspace = true, features = ["serialize"], optional = true } @@ -29,7 +29,7 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, optional = true } sha1 = { workspace = true, optional = true } sha2 = { workspace = true, optional = true } -tar = { workspace = true } +tar = { workspace = true, optional = true } target-triple = { workspace = true, optional = true } tempfile = { workspace = true } thiserror = { workspace = true } @@ -37,7 +37,7 @@ tokio = { workspace = true, features = ["full"], optional = true } tracing = { workspace = true, features = ["log"] } tracing-indicatif = { workspace = true, optional = true } url = { workspace = true } -zip = { workspace = true } +zip = { workspace = true, optional = true } [dev-dependencies] anyhow = { workspace = true } @@ -49,11 +49,12 @@ tokio = { workspace = true } [features] default = [ "native-tls", - "theseus", + "theseus" ] blocking = ["dep:tokio"] github = [ "dep:serde_json", + "dep:target-triple", ] indicatif = [ "dep:tracing-indicatif" @@ -69,13 +70,27 @@ native-tls = ["reqwest/native-tls"] rustls = ["reqwest/rustls-tls-native-roots"] sha1 = ["dep:sha1"] sha2 = ["dep:sha2"] +tar-gz = [ + "dep:flate2", + "dep:tar", +] +tar-xz = [ + "dep:liblzma", + "dep:tar", +] theseus = [ "dep:target-triple", "github", "sha2", + "tar-gz", +] +zip = [ + "dep:zip", ] zonky = [ "maven", + "tar-xz", + "zip", ] [package.metadata.docs.rs] diff --git a/postgresql_archive/README.md b/postgresql_archive/README.md index 1c0d441..9bc0d87 100644 --- a/postgresql_archive/README.md +++ b/postgresql_archive/README.md @@ -63,6 +63,14 @@ The following features are available: | `theseus` | Enables theseus PostgreSQL binaries | Yes | | `zonky` | Enables zonky PostgreSQL binaries | No | +### Extractors + +| Name | Description | Default? | +|----------|--------------------------|----------| +| `tar-gz` | Enables tar gz extractor | Yes | +| `tar-xz` | Enables tar xz extractor | No | +| `zip` | Enables zip extractor | No | + ### Hashers | Name | Description | Default? | diff --git a/postgresql_archive/src/archive.rs b/postgresql_archive/src/archive.rs index 47c85c6..d55b40d 100644 --- a/postgresql_archive/src/archive.rs +++ b/postgresql_archive/src/archive.rs @@ -45,7 +45,7 @@ pub async fn extract(url: &str, bytes: &Vec, out_dir: &Path) -> Result +/// +/// # Errors +/// * If the asset matcher fails. +pub fn matcher(_url: &str, name: &str, version: &Version) -> crate::Result { + let target = target_triple::TARGET; + // TODO: consider relaxing the version format to allow for more flexibility in where the version + // and target appear in the filename. + let expected_name = format!("postgresql-{version}-{target}.tar.gz"); + Ok(name == expected_name) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{Result, matcher}; + + const TEST_URL: &str = "https://github.com/owner/repo"; + + #[test] + fn test_register_custom_repo() -> Result<()> { + #[expect(clippy::unnecessary_wraps)] + fn supports_fn(url: &str) -> Result { + Ok(url == TEST_URL) + } + matcher::registry::register(supports_fn, matcher)?; + + let matcher = matcher::registry::get(TEST_URL)?; + let version = Version::new(16, 3, 0); + let expected_name = format!("postgresql-{}-{}.tar.gz", version, target_triple::TARGET); + assert!(matcher("", &expected_name, &version)?); + Ok(()) + } +} diff --git a/postgresql_archive/src/configuration/custom/mod.rs b/postgresql_archive/src/configuration/custom/mod.rs new file mode 100644 index 0000000..3c4d8c4 --- /dev/null +++ b/postgresql_archive/src/configuration/custom/mod.rs @@ -0,0 +1,3 @@ +pub mod matcher; + +pub use matcher::matcher; diff --git a/postgresql_archive/src/configuration/mod.rs b/postgresql_archive/src/configuration/mod.rs index 5ff0e25..a8c605d 100644 --- a/postgresql_archive/src/configuration/mod.rs +++ b/postgresql_archive/src/configuration/mod.rs @@ -1,3 +1,4 @@ +pub mod custom; #[cfg(feature = "theseus")] pub mod theseus; #[cfg(feature = "zonky")] diff --git a/postgresql_archive/src/configuration/theseus/extractor.rs b/postgresql_archive/src/configuration/theseus/extractor.rs index 3122107..9366aef 100644 --- a/postgresql_archive/src/configuration/theseus/extractor.rs +++ b/postgresql_archive/src/configuration/theseus/extractor.rs @@ -13,7 +13,7 @@ use tracing::{debug, instrument, warn}; /// # Errors /// Returns an error if the extraction fails. #[instrument(skip(bytes))] -pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Result> { +pub fn extract(bytes: &Vec, extract_directories: &ExtractDirectories) -> Result> { let out_dir = extract_directories.get_path(".")?; let parent_dir = if let Some(parent) = out_dir.parent() { @@ -41,7 +41,7 @@ pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Resu debug!("Extracting archive to {}", extract_dir.to_string_lossy()); let mut archive_extract_directories = ExtractDirectories::default(); archive_extract_directories.add_mapping(Regex::new(".*")?, extract_dir.clone()); - let files = tar_gz_extract(bytes, archive_extract_directories)?; + let files = tar_gz_extract(bytes, &archive_extract_directories)?; if out_dir.exists() { debug!( diff --git a/postgresql_archive/src/configuration/zonky/extractor.rs b/postgresql_archive/src/configuration/zonky/extractor.rs index 12dc383..bacdab6 100644 --- a/postgresql_archive/src/configuration/zonky/extractor.rs +++ b/postgresql_archive/src/configuration/zonky/extractor.rs @@ -16,7 +16,7 @@ use zip::ZipArchive; /// Returns an error if the extraction fails. #[expect(clippy::case_sensitive_file_extension_comparisons)] #[instrument(skip(bytes))] -pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Result> { +pub fn extract(bytes: &Vec, extract_directories: &ExtractDirectories) -> Result> { let out_dir = extract_directories.get_path(".")?; let parent_dir = if let Some(parent) = out_dir.parent() { parent @@ -63,7 +63,7 @@ pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Resu let mut archive_extract_directories = ExtractDirectories::default(); archive_extract_directories.add_mapping(Regex::new(".*")?, extract_dir.clone()); - let files = tar_xz_extract(&archive_bytes, archive_extract_directories)?; + let files = tar_xz_extract(&archive_bytes, &archive_extract_directories)?; if out_dir.exists() { debug!( diff --git a/postgresql_archive/src/error.rs b/postgresql_archive/src/error.rs index 7a06398..7c364e9 100644 --- a/postgresql_archive/src/error.rs +++ b/postgresql_archive/src/error.rs @@ -136,7 +136,7 @@ mod test { assert!(result.is_err()); if let Err(error) = result { let error = Error::from(error); - assert!(error.to_string().contains("https://a.com")); + assert!(error.to_string().contains("error sending request")); } } @@ -175,8 +175,8 @@ mod test { #[test] fn test_from_strip_prefix_error() { let path = PathBuf::from("test"); - let stip_prefix_error = path.strip_prefix("foo").expect_err("strip prefix error"); - let error = Error::from(stip_prefix_error); + let strip_prefix_error = path.strip_prefix("foo").expect_err("strip prefix error"); + let error = Error::from(strip_prefix_error); assert_eq!(error.to_string(), "prefix not found"); } diff --git a/postgresql_archive/src/extractor/mod.rs b/postgresql_archive/src/extractor/mod.rs index 56b41b9..a00f086 100644 --- a/postgresql_archive/src/extractor/mod.rs +++ b/postgresql_archive/src/extractor/mod.rs @@ -1,10 +1,16 @@ mod model; pub mod registry; +#[cfg(feature = "tar-gz")] mod tar_gz_extractor; +#[cfg(feature = "tar-xz")] mod tar_xz_extractor; +#[cfg(feature = "zip")] mod zip_extractor; pub use model::ExtractDirectories; +#[cfg(feature = "tar-gz")] pub use tar_gz_extractor::extract as tar_gz_extract; +#[cfg(feature = "tar-xz")] pub use tar_xz_extractor::extract as tar_xz_extract; +#[cfg(feature = "zip")] pub use zip_extractor::extract as zip_extract; diff --git a/postgresql_archive/src/extractor/registry.rs b/postgresql_archive/src/extractor/registry.rs index 56394c8..ea95715 100644 --- a/postgresql_archive/src/extractor/registry.rs +++ b/postgresql_archive/src/extractor/registry.rs @@ -12,7 +12,7 @@ static REGISTRY: LazyLock>> = LazyLock::new(|| Arc::new(Mutex::new(RepositoryRegistry::default()))); type SupportsFn = fn(&str) -> Result; -type ExtractFn = fn(&Vec, ExtractDirectories) -> Result>; +type ExtractFn = fn(&Vec, &ExtractDirectories) -> Result>; /// Singleton struct to store extractors #[expect(clippy::type_complexity)] @@ -107,7 +107,7 @@ mod tests { let extractor = get(url)?; let mut extract_directories = ExtractDirectories::default(); extract_directories.add_mapping(Regex::new(".*")?, PathBuf::from("test")); - assert!(extractor(&Vec::new(), extract_directories).is_ok()); + assert!(extractor(&Vec::new(), &extract_directories).is_ok()); Ok(()) } diff --git a/postgresql_archive/src/extractor/tar_gz_extractor.rs b/postgresql_archive/src/extractor/tar_gz_extractor.rs index 0947fb4..0673436 100644 --- a/postgresql_archive/src/extractor/tar_gz_extractor.rs +++ b/postgresql_archive/src/extractor/tar_gz_extractor.rs @@ -14,7 +14,7 @@ use tracing::{debug, instrument, warn}; /// # Errors /// Returns an error if the extraction fails. #[instrument(skip(bytes))] -pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Result> { +pub fn extract(bytes: &Vec, extract_directories: &ExtractDirectories) -> Result> { let mut files = Vec::new(); let input = BufReader::new(Cursor::new(bytes)); let decoder = GzDecoder::new(input); diff --git a/postgresql_archive/src/extractor/tar_xz_extractor.rs b/postgresql_archive/src/extractor/tar_xz_extractor.rs index 93caea5..3680b3d 100644 --- a/postgresql_archive/src/extractor/tar_xz_extractor.rs +++ b/postgresql_archive/src/extractor/tar_xz_extractor.rs @@ -14,7 +14,7 @@ use tracing::{debug, instrument, warn}; /// # Errors /// Returns an error if the extraction fails. #[instrument(skip(bytes))] -pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Result> { +pub fn extract(bytes: &Vec, extract_directories: &ExtractDirectories) -> Result> { let mut files = Vec::new(); let input = BufReader::new(Cursor::new(bytes)); let decoder = XzDecoder::new(input); diff --git a/postgresql_archive/src/extractor/zip_extractor.rs b/postgresql_archive/src/extractor/zip_extractor.rs index 350809a..4419422 100644 --- a/postgresql_archive/src/extractor/zip_extractor.rs +++ b/postgresql_archive/src/extractor/zip_extractor.rs @@ -13,7 +13,7 @@ use zip::ZipArchive; /// # Errors /// Returns an error if the extraction fails. #[instrument(skip(bytes))] -pub fn extract(bytes: &Vec, extract_directories: ExtractDirectories) -> Result> { +pub fn extract(bytes: &Vec, extract_directories: &ExtractDirectories) -> Result> { let mut files = Vec::new(); let reader = Cursor::new(bytes); let mut archive = ZipArchive::new(reader).map_err(|_| io::Error::other("Zip error"))?; diff --git a/postgresql_archive/src/lib.rs b/postgresql_archive/src/lib.rs index 66d647a..a729ad2 100644 --- a/postgresql_archive/src/lib.rs +++ b/postgresql_archive/src/lib.rs @@ -68,6 +68,14 @@ //! | `theseus` | Enables theseus PostgreSQL binaries | Yes | //! | `zonky` | Enables zonky PostgreSQL binaries | No | //! +//! ### Extractors +//! +//! | Name | Description | Default? | +//! |----------|--------------------------|----------| +//! | `tar-gz` | Enables tar gz extractor | Yes | +//! | `tar-xz` | Enables tar xz extractor | No | +//! | `zip` | Enables zip extractor | No | +//! //! ### Hashers //! //! | Name | Description | Default? | diff --git a/postgresql_commands/src/traits.rs b/postgresql_commands/src/traits.rs index e688d0e..391ed90 100644 --- a/postgresql_commands/src/traits.rs +++ b/postgresql_commands/src/traits.rs @@ -2,11 +2,23 @@ use crate::error::{Error, Result}; use std::env::consts::OS; use std::ffi::{OsStr, OsString}; use std::fmt::Debug; +#[cfg(target_os = "windows")] +use std::os::windows::process::CommandExt; use std::path::PathBuf; use std::process::ExitStatus; use std::time::Duration; use tracing::debug; +/// Constant for the `CREATE_NO_WINDOW` flag on Windows to prevent the creation of a console window +/// when executing commands. This is useful for background processes or services that do not require +/// user interaction. +/// +/// # References +/// +/// - [Windows API: Process Creation Flags](https://learn.microsoft.com/en-us/windows/win32/procthread/process-creation-flags#flags) +#[cfg(target_os = "windows")] +const CREATE_NO_WINDOW: u32 = 0x0800_0000; + /// Interface for `PostgreSQL` settings pub trait Settings { fn get_binary_dir(&self) -> PathBuf; @@ -79,6 +91,11 @@ pub trait CommandBuilder: Debug { let program_file = self.get_program_file(); let mut command = std::process::Command::new(program_file); + #[cfg(target_os = "windows")] + { + command.creation_flags(CREATE_NO_WINDOW); + } + command.args(self.get_args()); command.envs(self.get_envs()); command @@ -93,6 +110,11 @@ pub trait CommandBuilder: Debug { let program_file = self.get_program_file(); let mut command = tokio::process::Command::new(program_file); + #[cfg(target_os = "windows")] + { + command.creation_flags(CREATE_NO_WINDOW); + } + command.args(self.get_args()); command.envs(self.get_envs()); command diff --git a/postgresql_embedded/Cargo.toml b/postgresql_embedded/Cargo.toml index 2faa2d2..51c7066 100644 --- a/postgresql_embedded/Cargo.toml +++ b/postgresql_embedded/Cargo.toml @@ -13,14 +13,14 @@ version.workspace = true [build-dependencies] anyhow = { workspace = true } -postgresql_archive = { path = "../postgresql_archive", version = "0.18.4", default-features = false } +postgresql_archive = { path = "../postgresql_archive", version = "0.19.0", default-features = false } target-triple = { workspace = true } tokio = { workspace = true, features = ["full"] } url = { workspace = true } [dependencies] -postgresql_archive = { path = "../postgresql_archive", version = "0.18.4", default-features = false } -postgresql_commands = { path = "../postgresql_commands", version = "0.18.4" } +postgresql_archive = { path = "../postgresql_archive", version = "0.19.0", default-features = false } +postgresql_commands = { path = "../postgresql_commands", version = "0.19.0" } rand = { workspace = true } semver = { workspace = true } sqlx = { workspace = true, features = ["runtime-tokio"] } diff --git a/postgresql_embedded/README.md b/postgresql_embedded/README.md index c49946f..76320ff 100644 --- a/postgresql_embedded/README.md +++ b/postgresql_embedded/README.md @@ -110,6 +110,30 @@ The following features are available: | `tokio` | Enables using tokio for async | No | | `zonky` | Enables zonky PostgreSQL binaries | No | +## Bundling PostgreSQL + +To bundle PostgreSQL with your application, you can enable the `bundled` feature. This will download the PostgreSQL +archive at compile time and include it in your binary. You should specify the version of PostgreSQL to bundle by +setting the environment variable `POSTGRESQL_VERSION` to a specific version, e.g. `=17.2.0`. In order to use the bundled +PostgreSQL, you will also need to set an explicit matching version at runtime in `Settings`: + +```rust +use postgresql_embedded::{Result, Settings, VersionReq}; + +#[tokio::main] +async fn main() -> Result<()> { + let settings = Settings { + version: VersionReq::from_str("=17.2.0")?, + ..Default::default() + }; + Ok(()) +} +``` + +The PostgreSQL binaries can also be obtained from a different GitHub source by setting the `POSTGRESQL_RELEASES_URL` +environment variable. The repository must contain the releases with archives in same structure as +[theseus-rs/postgresql_binaries](https://github.com/theseus-rs/postgresql-binaries). + ## Safety This crate uses `#![forbid(unsafe_code)]` to ensure everything is implemented in 100% safe Rust. diff --git a/postgresql_embedded/build/bundle.rs b/postgresql_embedded/build/bundle.rs index 395e58a..fb2171e 100644 --- a/postgresql_embedded/build/bundle.rs +++ b/postgresql_embedded/build/bundle.rs @@ -1,8 +1,9 @@ #![allow(dead_code)] use anyhow::Result; -use postgresql_archive::VersionReq; +use postgresql_archive::configuration::{custom, theseus}; use postgresql_archive::repository::github::repository::GitHub; +use postgresql_archive::{VersionReq, matcher}; use postgresql_archive::{get_archive, repository}; use std::fs::File; use std::io::Write; @@ -16,11 +17,23 @@ use url::Url; /// self-contained binary that does not require the PostgreSQL archive to be /// downloaded at runtime. pub(crate) async fn stage_postgresql_archive() -> Result<()> { + println!("cargo:rerun-if-env-changed=POSTGRESQL_VERSION"); + println!("cargo:rerun-if-env-changed=POSTGRESQL_RELEASES_URL"); #[cfg(feature = "theseus")] let default_releases_url = postgresql_archive::configuration::theseus::URL.to_string(); #[cfg(not(feature = "theseus"))] let default_releases_url = String::new(); - let releases_url = env::var("POSTGRESQL_RELEASES_URL").unwrap_or(default_releases_url); + + let releases_url = match env::var("POSTGRESQL_RELEASES_URL") { + Ok(custom_url) if !default_releases_url.is_empty() => { + register_custom_repository()?; + custom_url + } + _ => { + register_theseus_repository()?; + default_releases_url + } + }; println!("PostgreSQL releases URL: {releases_url}"); let postgres_version_req = env::var("POSTGRESQL_VERSION").unwrap_or("*".to_string()); let version_req = VersionReq::from_str(postgres_version_req.as_str())?; @@ -40,7 +53,6 @@ pub(crate) async fn stage_postgresql_archive() -> Result<()> { return Ok(()); } - register_github_repository()?; let (asset_version, archive) = get_archive(&releases_url, &version_req).await?; fs::write(archive_version_file.clone(), asset_version.to_string())?; @@ -52,14 +64,20 @@ pub(crate) async fn stage_postgresql_archive() -> Result<()> { Ok(()) } -fn register_github_repository() -> Result<()> { - repository::registry::register( - |url| { - let parsed_url = Url::parse(url)?; - let host = parsed_url.host_str().unwrap_or_default(); - Ok(host.ends_with("github.com")) - }, - Box::new(GitHub::new), - )?; +fn supports_github_url(url: &str) -> postgresql_archive::Result { + let parsed_url = Url::parse(url)?; + let host = parsed_url.host_str().unwrap_or_default(); + Ok(host.ends_with("github.com")) +} + +fn register_custom_repository() -> Result<()> { + repository::registry::register(supports_github_url, Box::new(GitHub::new))?; + matcher::registry::register(supports_github_url, custom::matcher)?; + Ok(()) +} + +fn register_theseus_repository() -> Result<()> { + repository::registry::register(supports_github_url, Box::new(GitHub::new))?; + matcher::registry::register(supports_github_url, theseus::matcher)?; Ok(()) } diff --git a/postgresql_embedded/src/postgresql.rs b/postgresql_embedded/src/postgresql.rs index 538d36f..346bfaf 100644 --- a/postgresql_embedded/src/postgresql.rs +++ b/postgresql_embedded/src/postgresql.rs @@ -55,16 +55,17 @@ impl PostgreSQL { // conflicts with other versions. This will also facilitate setting the status of the // server to the correct initial value. If the minor and release version are not set, the // installation directory will be determined dynamically during the installation process. - if let Some(version) = postgresql.settings.version.exact_version() { - let path = &postgresql.settings.installation_dir; - let version_string = version.to_string(); - - if !path.ends_with(&version_string) { - postgresql.settings.installation_dir = - postgresql.settings.installation_dir.join(version_string); + if !postgresql.settings.trust_installation_dir { + if let Some(version) = postgresql.settings.version.exact_version() { + let path = &postgresql.settings.installation_dir; + let version_string = version.to_string(); + + if !path.ends_with(&version_string) { + postgresql.settings.installation_dir = + postgresql.settings.installation_dir.join(version_string); + } } } - postgresql } @@ -93,6 +94,10 @@ impl PostgreSQL { /// If it doesn't, it will search all the child directories for the latest version that matches the requirement. /// If it returns None, we couldn't find a matching installation. fn installed_dir(&self) -> Option { + if self.settings.trust_installation_dir { + return Some(self.settings.installation_dir.clone()); + } + let path = &self.settings.installation_dir; let maybe_path_version = path .file_name() @@ -145,6 +150,10 @@ impl PostgreSQL { /// Set up the database by extracting the archive and initializing the database. /// If the installation directory already exists, the archive will not be extracted. /// If the data directory already exists, the database will not be initialized. + /// + /// # Errors + /// + /// If the installation fails, an error will be returned. #[instrument(skip(self))] pub async fn setup(&mut self) -> Result<()> { match self.installed_dir() { @@ -259,6 +268,10 @@ impl PostgreSQL { /// Start the database and wait for the startup to complete. /// If the port is set to `0`, the database will be started on a random port. + /// + /// # Errors + /// + /// If the database fails to start, an error will be returned. #[instrument(skip(self))] pub async fn start(&mut self) -> Result<()> { if self.settings.port == 0 { @@ -299,6 +312,10 @@ impl PostgreSQL { } /// Stop the database gracefully (smart mode) and wait for the shutdown to complete. + /// + /// # Errors + /// + /// If the database fails to stop, an error will be returned. #[instrument(skip(self))] pub async fn stop(&self) -> Result<()> { debug!( @@ -333,6 +350,10 @@ impl PostgreSQL { } /// Create a new database with the given name. + /// + /// # Errors + /// + /// If the database creation fails, an error will be returned. #[instrument(skip(self))] pub async fn create_database(&self, database_name: S) -> Result<()> where @@ -359,6 +380,10 @@ impl PostgreSQL { } /// Check if a database with the given name exists. + /// + /// # Errors + /// + /// If the query fails, an error will be returned. #[instrument(skip(self))] pub async fn database_exists(&self, database_name: S) -> Result where @@ -383,6 +408,10 @@ impl PostgreSQL { } /// Drop a database with the given name. + /// + /// # Errors + /// + /// If the database does not exist or if the drop command fails, an error will be returned. #[instrument(skip(self))] pub async fn drop_database(&self, database_name: S) -> Result<()> where diff --git a/postgresql_embedded/src/settings.rs b/postgresql_embedded/src/settings.rs index 019eec6..9f09dfa 100644 --- a/postgresql_embedded/src/settings.rs +++ b/postgresql_embedded/src/settings.rs @@ -58,6 +58,8 @@ pub struct Settings { pub timeout: Option, /// Server configuration options pub configuration: HashMap, + /// Skip installation and inferrence of the installation dir. Trust what the user provided. + pub trust_installation_dir: bool, } /// Settings implementation @@ -65,12 +67,12 @@ impl Settings { /// Create a new instance of [`Settings`] pub fn new() -> Self { let home_dir = home_dir().unwrap_or_else(|| env::current_dir().unwrap_or_default()); - let passwword_file_name = ".pgpass"; + let password_file_name = ".pgpass"; let password_file = if let Ok(dir) = tempfile::tempdir() { - dir.into_path().join(passwword_file_name) + dir.into_path().join(password_file_name) } else { let current_dir = current_dir().unwrap_or(PathBuf::from(".")); - current_dir.join(passwword_file_name) + current_dir.join(password_file_name) }; let data_dir = if let Ok(dir) = tempfile::tempdir() { dir.into_path() @@ -109,6 +111,7 @@ impl Settings { temporary: true, timeout: Some(Duration::from_secs(5)), configuration: HashMap::new(), + trust_installation_dir: false, } } @@ -190,6 +193,9 @@ impl Settings { } }; } + if let Some(trust_installation_dir) = query_parameters.get("trust_installation_dir") { + settings.trust_installation_dir = trust_installation_dir == "true"; + } let configuration_prefix = "configuration."; for (key, value) in &query_parameters { if key.starts_with(configuration_prefix) { @@ -296,10 +302,11 @@ mod tests { let password_file = "password_file=/tmp/.pgpass"; let data_dir = "data_dir=/tmp/data"; let temporary = "temporary=false"; + let trust_installation_dir = "trust_installation_dir=true"; let timeout = "timeout=10"; let configuration = "configuration.max_connections=42"; let url = format!( - "{base_url}?{releases_url}&{version}&{installation_dir}&{password_file}&{data_dir}&{temporary}&{temporary}&{timeout}&{configuration}" + "{base_url}?{releases_url}&{version}&{installation_dir}&{password_file}&{data_dir}&{temporary}&{trust_installation_dir}&{timeout}&{configuration}" ); let settings = Settings::from_url(url)?; @@ -314,6 +321,7 @@ mod tests { assert_eq!(BOOTSTRAP_SUPERUSER, settings.username); assert_eq!("password", settings.password); assert!(!settings.temporary); + assert!(settings.trust_installation_dir); assert_eq!(Some(Duration::from_secs(10)), settings.timeout); let configuration = HashMap::from([("max_connections".to_string(), "42".to_string())]); assert_eq!(configuration, settings.configuration); diff --git a/postgresql_extensions/Cargo.toml b/postgresql_extensions/Cargo.toml index 633ab25..d7428d5 100644 --- a/postgresql_extensions/Cargo.toml +++ b/postgresql_extensions/Cargo.toml @@ -12,8 +12,8 @@ version.workspace = true [dependencies] async-trait = { workspace = true } -postgresql_archive = { path = "../postgresql_archive", version = "0.18.4", default-features = false } -postgresql_commands = { path = "../postgresql_commands", version = "0.18.4", default-features = false } +postgresql_archive = { path = "../postgresql_archive", version = "0.19.0", default-features = false } +postgresql_commands = { path = "../postgresql_commands", version = "0.19.0", default-features = false } regex-lite = { workspace = true } reqwest = { workspace = true, default-features = false, features = ["json"] } semver = { workspace = true, features = ["serde"] } @@ -28,7 +28,7 @@ url = { workspace = true } [dev-dependencies] anyhow = { workspace = true } -postgresql_embedded = { path = "../postgresql_embedded", version = "0.18.4" } +postgresql_embedded = { path = "../postgresql_embedded", version = "0.19.0" } test-log = { workspace = true } tokio = { workspace = true, features = ["full"] } @@ -43,14 +43,17 @@ blocking = ["tokio"] portal-corp = [ "dep:target-triple", "postgresql_archive/github", + "postgresql_archive/zip", ] steampipe = [ "dep:serde_json", "postgresql_archive/github", + "postgresql_archive/tar-gz", ] tensor-chord = [ "dep:target-triple", "postgresql_archive/github", + "postgresql_archive/zip", ] tokio = [ "postgresql_commands/tokio", diff --git a/postgresql_extensions/src/repository/portal_corp/repository.rs b/postgresql_extensions/src/repository/portal_corp/repository.rs index d54357b..40d2cf9 100644 --- a/postgresql_extensions/src/repository/portal_corp/repository.rs +++ b/postgresql_extensions/src/repository/portal_corp/repository.rs @@ -80,7 +80,7 @@ impl Repository for PortalCorp { extract_directories.add_mapping(Regex::new(r"\.(dll|dylib|so)$")?, library_dir); extract_directories.add_mapping(Regex::new(r"\.(control|sql)$")?, extension_dir); let bytes = &archive.to_vec(); - let files = zip_extract(bytes, extract_directories)?; + let files = zip_extract(bytes, &extract_directories)?; Ok(files) } } diff --git a/postgresql_extensions/src/repository/steampipe/repository.rs b/postgresql_extensions/src/repository/steampipe/repository.rs index f980b1d..f05fd1e 100644 --- a/postgresql_extensions/src/repository/steampipe/repository.rs +++ b/postgresql_extensions/src/repository/steampipe/repository.rs @@ -93,7 +93,7 @@ impl Repository for Steampipe { extract_directories.add_mapping(Regex::new(r"\.(dll|dylib|so)$")?, library_dir); extract_directories.add_mapping(Regex::new(r"\.(control|sql)$")?, extension_dir); let bytes = &archive.to_vec(); - let files = tar_gz_extract(bytes, extract_directories)?; + let files = tar_gz_extract(bytes, &extract_directories)?; Ok(files) } } diff --git a/postgresql_extensions/src/repository/tensor_chord/repository.rs b/postgresql_extensions/src/repository/tensor_chord/repository.rs index ac9b0c8..9a992b8 100644 --- a/postgresql_extensions/src/repository/tensor_chord/repository.rs +++ b/postgresql_extensions/src/repository/tensor_chord/repository.rs @@ -80,7 +80,7 @@ impl Repository for TensorChord { extract_directories.add_mapping(Regex::new(r"\.(dll|dylib|so)$")?, library_dir); extract_directories.add_mapping(Regex::new(r"\.(control|sql)$")?, extension_dir); let bytes = &archive.to_vec(); - let files = zip_extract(bytes, extract_directories)?; + let files = zip_extract(bytes, &extract_directories)?; Ok(files) } }