diff --git a/Cargo.lock b/Cargo.lock index 5204a29a..ac2c4dff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,7 +274,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap", + "indexmap 2.2.3", "lexical-core", "num", "serde", @@ -513,13 +513,53 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bollard" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aed08d3adb6ebe0eff737115056652670ae290f177759aac19c30456135f94c" +dependencies = [ + "base64 0.22.0", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "home", + "http 1.1.0", + "http-body-util", + "hyper 1.3.1", + "hyper-named-pipe", + "hyper-rustls 0.26.0", + "hyper-util", + "hyperlocal-next", + "log", + "pin-project-lite", + "rustls 0.22.2", + "rustls-native-certs 0.7.0", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror", + "tokio", + "tokio-util", + "tower-service", + "url", + "winapi", +] + [[package]] name = "bollard-stubs" -version = "1.42.0-rc.3" +version = "1.44.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed59b5c00048f48d7af971b71f800fdf23e858844a6f9e4d32ca72e9399e7864" +checksum = "709d9aa1c37abb89d40f19f5d0ad6f0d88cb1581264e571c9350fc5bb89cf1c5" dependencies = [ "serde", + "serde_repr", "serde_with", ] @@ -840,9 +880,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -850,27 +890,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.10.0", - "syn 1.0.109", + "syn 2.0.50", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.50", ] [[package]] @@ -930,12 +970,56 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dns-lookup" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc" +dependencies = [ + "cfg-if", + "libc", + "socket2", + "windows-sys 0.48.0", +] + [[package]] name = "doc-comment" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "docker_credential" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31951f49556e34d90ed28342e1df7e1cb7a229c4cab0aecc627b5d91edd41d07" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -1341,7 +1425,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1558,6 +1642,21 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-named-pipe" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +dependencies = [ + "hex", + "hyper 1.3.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", + "winapi", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1569,7 +1668,7 @@ dependencies = [ "hyper 0.14.28", "log", "rustls 0.21.10", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -1584,7 +1683,9 @@ dependencies = [ "http 1.1.0", "hyper 1.3.1", "hyper-util", + "log", "rustls 0.22.2", + "rustls-native-certs 0.7.0", "rustls-pki-types", "tokio", "tokio-rustls 0.25.0", @@ -1611,6 +1712,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "hyperlocal-next" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acf569d43fa9848e510358c07b80f4adf34084ddc28c6a4a651ee8474c070dcc" +dependencies = [ + "hex", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -1650,6 +1766,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.2.3" @@ -1658,6 +1785,7 @@ checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", ] [[package]] @@ -1863,6 +1991,16 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.4.2", + "libc", +] + [[package]] name = "libsqlite3-sys" version = "0.27.0" @@ -2134,6 +2272,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "parking_lot" version = "0.11.2" @@ -2182,6 +2326,31 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "parse-display" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06af5f9333eb47bd9ba8462d612e37a8328a5cb80b13f0af4de4c3b89f52dee5" +dependencies = [ + "parse-display-derive", + "regex", + "regex-syntax", +] + +[[package]] +name = "parse-display-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc9252f259500ee570c75adcc4e317fa6f57a1e47747d622e0bf838002a7b790" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "regex-syntax", + "structmeta", + "syn 2.0.50", +] + [[package]] name = "paste" version = "1.0.14" @@ -2272,7 +2441,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.2.3", ] [[package]] @@ -2656,6 +2825,17 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.10.4" @@ -2718,7 +2898,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.10", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "serde", "serde_json", @@ -3024,6 +3204,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3182,6 +3375,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3196,24 +3400,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ + "base64 0.22.0", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.3", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.50", ] [[package]] @@ -3222,7 +3434,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -3465,7 +3677,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap", + "indexmap 2.2.3", "log", "memchr", "once_cell", @@ -3663,6 +3875,29 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.50", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "strum" version = "0.25.0" @@ -3789,26 +4024,32 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "testcontainers" -version = "0.15.0" +version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d2931d7f521af5bae989f716c3fa43a6af9af7ec7a5e21b59ae40878cec00" +checksum = "69d47265a44d1035a322691cf0a6cc227d79b62ef86ffb0dbc204b394fee3d07" dependencies = [ + "async-trait", + "bollard", "bollard-stubs", + "dirs", + "dns-lookup", + "docker_credential", "futures", - "hex", - "hmac", "log", - "rand", + "parse-display", "serde", "serde_json", - "sha2", + "serde_with", + "tokio", + "tokio-util", + "url", ] [[package]] name = "testcontainers-modules" -version = "0.3.7" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8debb5e215d9e89ea93255fffff00bf037ea44075d7a2669a21a8a988d6b52fd" +checksum = "e8da66a6ebd55684c8e3c58c7374dc2b2d0d1884ac688987e7ffb2d02103a3ee" dependencies = [ "testcontainers", ] @@ -3978,7 +4219,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap", + "indexmap 2.2.3", "toml_datetime", "winnow", ] @@ -4121,6 +4362,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] diff --git a/rust/quary-databases/Cargo.toml b/rust/quary-databases/Cargo.toml index 93a772fb..1612ac0f 100644 --- a/rust/quary-databases/Cargo.toml +++ b/rust/quary-databases/Cargo.toml @@ -26,5 +26,5 @@ snowflake-api = "0.8.0" [dev-dependencies] assert_cmd = "2" tempfile = "3" -testcontainers = "0.15.0" -testcontainers-modules = { version = "0.3.7", features = ["postgres", "minio"] } +testcontainers = "0.16.7" +testcontainers-modules = { version = "0.4.2", features = ["postgres"] } diff --git a/rust/quary-databases/src/databases_postgres.rs b/rust/quary-databases/src/databases_postgres.rs index 433dbff7..12479bc0 100644 --- a/rust/quary-databases/src/databases_postgres.rs +++ b/rust/quary-databases/src/databases_postgres.rs @@ -1,17 +1,19 @@ +use std::collections::HashMap; +use std::fmt::Debug; +use std::str::FromStr; + use async_trait::async_trait; use chrono::{DateTime, Utc}; +use sqlx::postgres::{PgConnectOptions, PgPoolOptions, PgRow}; +use sqlx::types::BigDecimal; +use sqlx::{Column, Pool, Row}; +use sqlx::{Error, TypeInfo}; + use quary_core::database_postgres::DatabaseQueryGeneratorPostgres; use quary_core::databases::{ ColumnWithDetails, DatabaseConnection, DatabaseQueryGenerator, QueryError, QueryResult, }; use quary_proto::TableAddress; -use sqlx::postgres::{PgConnectOptions, PgPoolOptions, PgRow}; -use sqlx::types::BigDecimal; -use sqlx::{Column, Pool, Row}; -use sqlx::{Error, TypeInfo}; -use std::collections::HashMap; -use std::fmt::Debug; -use std::str::FromStr; #[derive(Debug)] pub struct Postgres { @@ -310,24 +312,28 @@ impl DatabaseConnection for Postgres { #[cfg(test)] mod tests { - use super::*; + use std::time::SystemTime; + use chrono::{DateTime, NaiveDateTime, Utc}; use prost::bytes::Bytes; + use testcontainers::runners::AsyncRunner; + use testcontainers::RunnableImage; + use testcontainers_modules::postgres::Postgres as TestcontainersPostgres; + use quary_core::project::{ parse_project, project_and_fs_to_sql_for_snapshots, project_and_fs_to_sql_for_views, }; use quary_core::project_tests::return_tests_sql; use quary_proto::{File, FileSystem}; - use std::time::SystemTime; - use testcontainers::{clients, RunnableImage}; - use testcontainers_modules::postgres::Postgres as TestcontainersPostgres; + + use super::*; #[tokio::test] async fn run_build_with_project_twice() { - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let quary_postgres = Postgres::new( "localhost", @@ -393,11 +399,10 @@ mod tests { #[tokio::test] async fn test_postgres_list_tables_and_views() { - // Start a PostgreSQL container - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let quary_postgres = Postgres::new( "localhost", @@ -509,11 +514,10 @@ mod tests { #[tokio::test] async fn list_columns_in_table() { - // Start a PostgreSQL container - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let database = Postgres::new( "localhost", @@ -590,11 +594,10 @@ mod tests { #[tokio::test] async fn test_postgres_foreign_relationship_test_with_schema() { - // Start a PostgreSQL container - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let database = Postgres::new( "localhost", @@ -713,11 +716,10 @@ models: #[tokio::test] async fn test_postgres_foreign_relationship_test_with_materialized_view_table() { - // Start a PostgreSQL container - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let database = Postgres::new( "localhost", @@ -859,11 +861,10 @@ models: #[tokio::test] async fn test_list_tables_outside_the_schema() { - // Start a PostgreSQL container - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let database = Postgres::new( "localhost", @@ -934,10 +935,10 @@ models: #[tokio::test] async fn test_list_columns_with_case_sensitive_columns() { - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; let database = Postgres::new( "localhost", @@ -1000,11 +1001,12 @@ models: #[tokio::test] async fn test_snapshot_with_no_time_override() { + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; + let schema = "analytics"; - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); let database: Box = Box::new( Postgres::new( "localhost", @@ -1117,12 +1119,12 @@ snapshots: #[tokio::test] async fn test_snapshots_with_schema() { - let schema = "analytics"; + let postgres_image = RunnableImage::from(TestcontainersPostgres::default()) + .start() + .await; + let pg_port = postgres_image.get_host_port_ipv4(5432).await; - let docker = clients::Cli::default(); - let postgres_image = RunnableImage::from(TestcontainersPostgres::default()); - let pg_container = docker.run(postgres_image); - let pg_port = pg_container.get_host_port_ipv4(5432); + let schema = "analytics"; let database: Box = Box::new( Postgres::new( "localhost",