From ab7ac16974a39bc634acd99c6386369a945639f0 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Sat, 22 Apr 2023 07:40:21 -0700 Subject: [PATCH 01/20] reqs --- .circleci/run_tests.sh | 1 + src/client.rs | 52 ++++++++++++++++++++++++++------ src/pool.rs | 6 +++- src/server.rs | 28 ++++++++++++++--- tests/python/async_test.py | 57 +++++++++++++++++++++++++++++++++++ tests/python/requirements.txt | 11 ++++++- 6 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 tests/python/async_test.py diff --git a/.circleci/run_tests.sh b/.circleci/run_tests.sh index 4ba497c3..e44f80f8 100644 --- a/.circleci/run_tests.sh +++ b/.circleci/run_tests.sh @@ -107,6 +107,7 @@ cd ../.. # pip3 install -r tests/python/requirements.txt python3 tests/python/tests.py || exit 1 +python3 tests/python/async_test.py start_pgcat "info" diff --git a/src/client.rs b/src/client.rs index 5098ec6f..60dc41d7 100644 --- a/src/client.rs +++ b/src/client.rs @@ -932,7 +932,7 @@ where } // Grab a server from the pool. - let connection = match pool + let mut connection = match pool .get(query_router.shard(), query_router.role(), &self.stats) .await { @@ -975,9 +975,8 @@ where } }; - let mut reference = connection.0; + let server = &mut *connection.0; let address = connection.1; - let server = &mut *reference; // Server is assigned to the client in case the client wants to // cancel a query later. @@ -1000,6 +999,7 @@ where // Set application_name. server.set_name(&self.application_name).await?; + server.switch_async(false); let mut initial_message = Some(message); @@ -1019,12 +1019,37 @@ where None => { trace!("Waiting for message inside transaction or in session mode"); - match tokio::time::timeout( - idle_client_timeout_duration, - read_message(&mut self.read), - ) - .await - { + let message = tokio::select! { + message = tokio::time::timeout( + idle_client_timeout_duration, + read_message(&mut self.read), + ) => message, + + server_message = server.recv() => { + debug!("Got async message"); + + let server_message = match server_message { + Ok(message) => message, + Err(err) => { + pool.ban(&address, BanReason::MessageReceiveFailed, Some(&self.stats)); + server.mark_bad(); + return Err(err); + } + }; + + match write_all_half(&mut self.write, &server_message).await { + Ok(_) => (), + Err(err) => { + server.mark_bad(); + return Err(err); + } + }; + + continue; + } + }; + + match message { Ok(Ok(message)) => message, Ok(Err(err)) => { // Client disconnected inside a transaction. @@ -1141,9 +1166,14 @@ where // Sync // Frontend (client) is asking for the query result now. - 'S' => { + 'S' | 'H' => { debug!("Sending query to server"); + if code == 'H' { + server.switch_async(true); + debug!("Client requested flush, going async"); + } + self.buffer.put(&message[..]); let first_message_code = (*self.buffer.get(0).unwrap_or(&0)) as char; @@ -1318,6 +1348,8 @@ where } }; + debug!("Wrote to client"); + if !server.is_data_available() { break; } diff --git a/src/pool.rs b/src/pool.rs index 7f8e41c0..abb123ed 100644 --- a/src/pool.rs +++ b/src/pool.rs @@ -777,6 +777,7 @@ impl ConnectionPool { self.databases.len() } + /// Retrieve all bans for all servers. pub fn get_bans(&self) -> Vec<(Address, (BanReason, NaiveDateTime))> { let mut bans: Vec<(Address, (BanReason, NaiveDateTime))> = Vec::new(); let guard = self.banlist.read(); @@ -788,7 +789,7 @@ impl ConnectionPool { return bans; } - /// Get the address from the host url + /// Get the address from the host url. pub fn get_addresses_from_host(&self, host: &str) -> Vec
{ let mut addresses = Vec::new(); for shard in 0..self.shards() { @@ -827,10 +828,13 @@ impl ConnectionPool { &self.addresses[shard][server] } + /// Get server settings retrieved at connection setup. pub fn server_info(&self) -> BytesMut { self.server_info.read().clone() } + /// Calculate how many used connections in the pool + /// for the given server. fn busy_connection_count(&self, address: &Address) -> u32 { let state = self.pool_state(address.shard, address.address_index); let idle = state.idle_connections; diff --git a/src/server.rs b/src/server.rs index 84bed6cc..8c1ab70e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -38,6 +38,7 @@ pub struct Server { /// Our server response buffer. We buffer data before we give it to the client. buffer: BytesMut, + is_async: bool, /// Server information the server sent us over on startup. server_info: BytesMut, @@ -450,6 +451,7 @@ impl Server { read: BufReader::new(read), write, buffer: BytesMut::with_capacity(8196), + is_async: false, server_info, process_id, secret_key, @@ -537,6 +539,16 @@ impl Server { } } + /// Switch to async mode, flushing messages as soon + /// as we receive them without buffering or waiting for "ReadyForQuery". + pub fn switch_async(&mut self, on: bool) { + if on { + self.is_async = true; + } else { + self.is_async = false; + } + } + /// Receive data from the server in response to a client request. /// This method must be called multiple times while `self.is_data_available()` is true /// in order to receive all data the server has to offer. @@ -557,8 +569,6 @@ impl Server { let code = message.get_u8() as char; let _len = message.get_i32(); - trace!("Message: {}", code); - match code { // ReadyForQuery 'Z' => { @@ -632,7 +642,10 @@ impl Server { // DataRow 'D' => { // More data is available after this message, this is not the end of the reply. - self.data_available = true; + // If we're async, flush to client now. + if !self.is_async { + self.data_available = true; + } // Don't flush yet, the more we buffer, the faster this goes...up to a limit. if self.buffer.len() >= 8196 { @@ -645,7 +658,10 @@ impl Server { // CopyOutResponse: copy is starting from the server to the client. 'H' => { - self.data_available = true; + // If we're in async mode, flush now. + if !self.is_async { + self.data_available = true; + } break; } @@ -665,6 +681,10 @@ impl Server { // Keep buffering until ReadyForQuery shows up. _ => (), }; + + if self.is_async { + break; + } } let bytes = self.buffer.clone(); diff --git a/tests/python/async_test.py b/tests/python/async_test.py new file mode 100644 index 00000000..27038ffb --- /dev/null +++ b/tests/python/async_test.py @@ -0,0 +1,57 @@ +import psycopg2 +import asyncio +import asyncpg + + +def regular_main(): + # Connect to the PostgreSQL database + conn = psycopg2.connect( + host="localhost", + database="sharded_db", + user="sharding_user", + password="sharding_user", + port=6432, + ) + + # Open a cursor to perform database operations + cur = conn.cursor() + + # Execute a SQL query + cur.execute("SELECT 1") + + # Fetch the results + rows = cur.fetchall() + + # Print the results + for row in rows: + print(row[0]) + + # Close the cursor and the database connection + cur.close() + conn.close() + + +async def main(): + # Connect to the PostgreSQL database + conn = await asyncpg.connect( + host="localhost", + database="sharded_db", + user="sharding_user", + password="sharding_user", + port=6432, + ) + + # Execute a SQL query + for _ in range(25): + rows = await conn.fetch("SELECT 1") + + # Print the results + for row in rows: + print(row[0]) + + # Close the database connection + await conn.close() + + +regular_main() +asyncio.run(main()) diff --git a/tests/python/requirements.txt b/tests/python/requirements.txt index eebd9c90..71c94103 100644 --- a/tests/python/requirements.txt +++ b/tests/python/requirements.txt @@ -1,2 +1,11 @@ +asyncio==3.4.3 +asyncpg==0.27.0 +black==23.3.0 +click==8.1.3 +mypy-extensions==1.0.0 +packaging==23.1 +pathspec==0.11.1 +platformdirs==3.2.0 +psutil==5.9.1 psycopg2==2.9.3 -psutil==5.9.1 \ No newline at end of file +tomli==2.0.1 From 088f1a7dae1fd7472d11544087817e1228901850 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Sat, 22 Apr 2023 07:47:19 -0700 Subject: [PATCH 02/20] remove debug msg --- src/client.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index 60dc41d7..45455015 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1348,8 +1348,6 @@ where } }; - debug!("Wrote to client"); - if !server.is_data_available() { break; } From fd3623ff139c9669fc9344fe5888e59ff0eebabe Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Sat, 22 Apr 2023 08:02:20 -0700 Subject: [PATCH 03/20] mm --- .circleci/run_tests.sh | 3 +++ src/server.rs | 2 ++ tests/python/async_test.py | 11 +++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.circleci/run_tests.sh b/.circleci/run_tests.sh index e44f80f8..ccbb71ac 100644 --- a/.circleci/run_tests.sh +++ b/.circleci/run_tests.sh @@ -107,6 +107,9 @@ cd ../.. # pip3 install -r tests/python/requirements.txt python3 tests/python/tests.py || exit 1 + +start_pgcat "info" + python3 tests/python/async_test.py start_pgcat "info" diff --git a/src/server.rs b/src/server.rs index 8c1ab70e..be731fb5 100644 --- a/src/server.rs +++ b/src/server.rs @@ -569,6 +569,8 @@ impl Server { let code = message.get_u8() as char; let _len = message.get_i32(); + trace!("Message: {}", code); + match code { // ReadyForQuery 'Z' => { diff --git a/tests/python/async_test.py b/tests/python/async_test.py index 27038ffb..34a65e03 100644 --- a/tests/python/async_test.py +++ b/tests/python/async_test.py @@ -2,15 +2,18 @@ import asyncio import asyncpg +PGCAT_HOST = "127.0.0.1" +PGCAT_PORT = "6432" + def regular_main(): # Connect to the PostgreSQL database conn = psycopg2.connect( - host="localhost", + host=PGCAT_HOST, database="sharded_db", user="sharding_user", password="sharding_user", - port=6432, + port=PGCAT_PORT, ) # Open a cursor to perform database operations @@ -34,11 +37,11 @@ def regular_main(): async def main(): # Connect to the PostgreSQL database conn = await asyncpg.connect( - host="localhost", + host=PGCAT_HOST, database="sharded_db", user="sharding_user", password="sharding_user", - port=6432, + port=PGCAT_PORT, ) # Execute a SQL query From f986b072f01dcca963f5f39baf0e4a0ce44e9f05 Mon Sep 17 00:00:00 2001 From: Ishant Dahiya Date: Mon, 25 Mar 2024 15:05:00 +0530 Subject: [PATCH 04/20] add async support --- src/client.rs | 12 +++++------- src/pool.rs | 3 --- src/server.rs | 1 - 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/client.rs b/src/client.rs index 0c34ae74..82fad542 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1079,7 +1079,7 @@ where // TODO: investigate other parameters and set them too. // Set application_name. - server.set_name(&self.application_name).await?; + // server.set_name(&self.application_name).await?; server.switch_async(false); let mut initial_message = Some(message); @@ -1106,14 +1106,14 @@ where read_message(&mut self.read), ) => message, - server_message = server.recv() => { + server_message = server.recv(Some(&mut self.server_parameters)) => { debug!("Got async message"); let server_message = match server_message { Ok(message) => message, Err(err) => { pool.ban(&address, BanReason::MessageReceiveFailed, Some(&self.stats)); - server.mark_bad(); + server.mark_bad(&format!("Failed to receive message from server: {:?}", err)); return Err(err); } }; @@ -1121,7 +1121,7 @@ where match write_all_half(&mut self.write, &server_message).await { Ok(_) => (), Err(err) => { - server.mark_bad(); + server.mark_bad(&format!("Failed to write message to client: {:?}", err)); return Err(err); } }; @@ -1312,8 +1312,6 @@ where continue; } - self.buffer.put(&message[..]); - Some(PluginOutput::Intercept(result)) => { write_all(&mut self.write, result).await?; plugin_output = None; @@ -1322,7 +1320,7 @@ where } _ => (), - }; + } // Prepared statements can arrive like this // 1. Without named describe diff --git a/src/pool.rs b/src/pool.rs index 9863070b..307d9e5b 100644 --- a/src/pool.rs +++ b/src/pool.rs @@ -1046,9 +1046,6 @@ impl ConnectionPool { /// Get the number of checked out connection for an address /// Get server settings retrieved at connection setup. - pub fn server_info(&self) -> BytesMut { - self.server_info.read().clone() - } /// Calculate how many used connections in the pool /// for the given server. diff --git a/src/server.rs b/src/server.rs index e1b2f2a8..0b04fa19 100644 --- a/src/server.rs +++ b/src/server.rs @@ -803,7 +803,6 @@ impl Server { buffer: BytesMut::with_capacity(8196), server_parameters, is_async: false, - server_info, process_id, secret_key, in_transaction: false, From df63d7854b2892793a2bd3a64fef3c2a28c9970a Mon Sep 17 00:00:00 2001 From: Ishant Dahiya Date: Mon, 25 Mar 2024 18:08:21 +0530 Subject: [PATCH 05/20] remove set name --- src/client.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index 82fad542..8326a594 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1078,8 +1078,6 @@ where server.sync_parameters(&self.server_parameters).await?; // TODO: investigate other parameters and set them too. - // Set application_name. - // server.set_name(&self.application_name).await?; server.switch_async(false); let mut initial_message = Some(message); From 9ff4212d1092bac442380d879148b4b46cbafbfd Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Wed, 4 Jun 2025 21:37:22 -0300 Subject: [PATCH 06/20] adding simple makefile --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..4fbbd0f5 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +BASE_IMAGE_NAME:=pgcat + +build: + docker build \ + -t $(REPO_URL)/$(BASE_IMAGE_NAME) \ + . + +release: + docker push $(REPO_URL)/$(BASE_IMAGE_NAME) From 28d7d7fc19877172a0e05210b27a4461605a301c Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 5 Jun 2025 13:35:11 -0300 Subject: [PATCH 07/20] semi-colon --- src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.rs b/src/server.rs index 882450ea..4dc07148 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1328,7 +1328,7 @@ impl Server { // Instead, we ROLLBACK that transaction before putting the connection back in the pool if self.in_transaction() { warn!(target: "pgcat::server::cleanup", "Server returned while still in transaction, rolling back transaction"); - self.query("ROLLBACK").await?; + self.query("ROLLBACK;").await?; } // Client disconnected but it performed session-altering operations such as From db9e5c6cd8f39396359c6aacb367fc19964d10a2 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 5 Jun 2025 14:29:21 -0300 Subject: [PATCH 08/20] forcefully discard all state when returning connection to the pool --- src/server.rs | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/server.rs b/src/server.rs index 4dc07148..e8bed5d6 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1336,25 +1336,14 @@ impl Server { // to avoid leaking state between clients. For performance reasons we only // send `RESET ALL` if we think the session is altered instead of just sending // it before each checkin. - if self.cleanup_state.needs_cleanup() && self.cleanup_connections { - info!(target: "pgcat::server::cleanup", "Server returned with session state altered, discarding state ({}) for application {}", self.cleanup_state, self.application_name); - let mut reset_string = String::from("RESET ROLE;"); - - if self.cleanup_state.needs_cleanup_set { - reset_string.push_str("RESET ALL;"); - }; - - if self.cleanup_state.needs_cleanup_prepare { - reset_string.push_str("DEALLOCATE ALL;"); - // Since we deallocated all prepared statements, we need to clear the cache - if let Some(cache) = &mut self.prepared_statement_cache { - cache.clear(); - } - }; - - self.query(&reset_string).await?; - self.cleanup_state.reset(); - } + debug!(target: "pgcat::server::cleanup", "Discarding state ({}) for application {}", self.cleanup_state, self.application_name); + let mut reset_string = String::from("DISCARD ALL;"); + // Since we deallocated all prepared statements, we need to clear the cache + if let Some(cache) = &mut self.prepared_statement_cache { + cache.clear(); + }; + self.query(&reset_string).await?; + self.cleanup_state.reset(); if self.in_copy_mode() { warn!(target: "pgcat::server::cleanup", "Server returned while still in copy-mode"); From d939b7abf959371b22ff61b4ef35a906506fee5a Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Wed, 26 Nov 2025 20:30:51 -0300 Subject: [PATCH 09/20] re-applying fixes --- src/client.rs | 8 ++++++-- src/server.rs | 41 ++++++++++++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/client.rs b/src/client.rs index e75c1393..c4354595 100644 --- a/src/client.rs +++ b/src/client.rs @@ -327,6 +327,10 @@ where Ok(len) => len, Err(_) => return Err(Error::ClientBadStartup), }; + if len < 8 { + // 4 bytes length + 4 bytes code is the minimum + return Err(Error::ClientBadStartup); + } // Get the rest of the message. let mut startup = vec![0u8; len as usize - 4]; @@ -1525,7 +1529,7 @@ where let mut should_send_to_server = true; // If we have just a sync message left (maybe after omitting sending some messages to the server) no need to send it to the server - if *self.buffer.first().unwrap() == b'S' { + if matches!(self.buffer.first(), Some(b'S')) { should_send_to_server = false; // queue up a ready for query message to send to the client, respecting the transaction state of the server self.response_message_queue_buffer @@ -1667,8 +1671,8 @@ where Err(Error::ClientError(format!( "Invalid pool name {{ username: {}, pool_name: {}, application_name: {} }}", - self.pool_name, self.username, + self.pool_name, self.server_parameters.get_application_name() ))) } diff --git a/src/server.rs b/src/server.rs index 8ad0202e..4d45070f 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1342,6 +1342,28 @@ impl Server { Ok(()) } + /// Ensure the server is ready for simple-query messages by ending any in-flight + /// extended-protocol pipeline (triggered when the client requested async/flush). + async fn ensure_ready_for_simple_query(&mut self) -> Result<(), Error> { + if self.is_async { + // Send a Sync to terminate any extended-protocol pipeline and drain until ReadyForQuery + let mut bytes = BytesMut::new(); + bytes.extend_from_slice(&sync()); + self.send(&bytes).await?; + + loop { + self.recv(None).await?; + if !self.is_data_available() { + break; + } + } + + // Back to normal (non-async) mode + self.switch_async(false); + } + Ok(()) + } + /// Perform any necessary cleanup before putting the server /// connection back in the pool pub async fn checkin_cleanup(&mut self) -> Result<(), Error> { @@ -1359,13 +1381,18 @@ impl Server { // to avoid leaking state between clients. For performance reasons we only // send `RESET ALL` if we think the session is altered instead of just sending // it before each checkin. - debug!(target: "pgcat::server::cleanup", "Discarding state ({}) for application {}", self.cleanup_state, self.application_name); - let mut reset_string = String::from("DISCARD ALL;"); - // Since we deallocated all prepared statements, we need to clear the cache - if let Some(cache) = &mut self.prepared_statement_cache { - cache.clear(); - }; - self.query(&reset_string).await?; + if self.cleanup_connections || self.cleanup_state.needs_cleanup() { + // If the last client interaction used async/flush (pipeline-like), exit it first so + // that DISCARD ALL is allowed by the server. + self.ensure_ready_for_simple_query().await?; + + debug!(target: "pgcat::server::cleanup", "Discarding state ({}) for application {}", self.cleanup_state, self.application_name); + // Since we deallocated all prepared statements, we need to clear the cache + if let Some(cache) = &mut self.prepared_statement_cache { + cache.clear(); + }; + self.query("DISCARD ALL;").await?; + } self.cleanup_state.reset(); if self.in_copy_mode() { From 824fde5ad0bbadf8805fd9aa0540a87a0e3947e2 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Wed, 26 Nov 2025 21:26:42 -0300 Subject: [PATCH 10/20] fix copy mode --- src/server.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/server.rs b/src/server.rs index 4d45070f..2be42433 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1086,10 +1086,10 @@ impl Server { // CopyOutResponse: copy is starting from the server to the client. 'H' => { + // CopyOutResponse: copy is starting from the server to the client. self.in_copy_mode = true; - self.data_available = true; - // If we're in async mode, flush now. if !self.is_async { + // In non-async mode, indicate more data is expected so caller continues reading. self.data_available = true; } break; @@ -1122,14 +1122,11 @@ impl Server { } } - let bytes = self.buffer.clone(); + let bytes = mem::take(&mut self.buffer); // Keep track of how much data we got from the server for stats. self.stats().data_received(bytes.len()); - // Clear the buffer for next query. - self.buffer.clear(); - // Successfully received data from server self.last_activity = SystemTime::now(); From 032360d1d451abf8ff41663e63e4a7fea50038ba Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 16:45:03 -0300 Subject: [PATCH 11/20] fixing issues with extended protocol --- src/client.rs | 44 +++++++++++++++++++++++++++++--------------- src/server.rs | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/client.rs b/src/client.rs index c4354595..23f835f3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1527,14 +1527,8 @@ where self.buffer.put(&message[..]); let mut should_send_to_server = true; - - // If we have just a sync message left (maybe after omitting sending some messages to the server) no need to send it to the server - if matches!(self.buffer.first(), Some(b'S')) { - should_send_to_server = false; - // queue up a ready for query message to send to the client, respecting the transaction state of the server - self.response_message_queue_buffer - .put(ready_for_query(server.in_transaction())); - } + // Always send Sync to the server to properly terminate any extended-protocol cycle. + // Avoid fabricating ReadyForQuery without server acknowledgement. // Send all queued messages to the client // NOTE: it's possible we don't perfectly send things back in the same order as postgres would, @@ -1568,7 +1562,9 @@ where self.buffer.clear(); - if !server.in_transaction() { + // Only Sync (S) marks the end of an extended-protocol cycle. + // Flush (H) just flushes currently available results. + if code == 'S' && !server.in_transaction() { self.stats.transaction(); server .stats() @@ -2025,9 +2021,11 @@ where .await?; let query_start = Instant::now(); - // Read all data the server has to offer, which can be multiple messages - // buffered in 8196 bytes chunks. - loop { + + if code == 'H' { + // Flush (H) should not eagerly drain the entire extended-protocol cycle. + // We read a single server response chunk here; further messages will be + // delivered via the async recv branch in the main loop. let response = self .receive_server_message(server, address, pool, client_stats) .await?; @@ -2035,14 +2033,30 @@ where match write_all_flush(&mut self.write, &response).await { Ok(_) => (), Err(err) => { - // We might be in some kind of error/in between protocol state, better to just kill this server server.mark_bad(err.to_string().as_str()); return Err(err); } }; + } else { + // For Sync (S) and all other commands, drain until the server + // indicates there is no more data available (i.e. until ReadyForQuery). + loop { + let response = self + .receive_server_message(server, address, pool, client_stats) + .await?; - if !server.is_data_available() { - break; + match write_all_flush(&mut self.write, &response).await { + Ok(_) => (), + Err(err) => { + // We might be in some kind of error/in between protocol state, better to just kill this server + server.mark_bad(err.to_string().as_str()); + return Err(err); + } + }; + + if !server.is_data_available() { + break; + } } } diff --git a/src/server.rs b/src/server.rs index 2be42433..5fa43f2c 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1064,6 +1064,22 @@ impl Server { self.server_parameters.set_param(key, value, false); } + // RowDescription + 'T' => { + // More messages (DataRow/CommandComplete/ReadyForQuery) will follow in non-async mode. + if !self.is_async { + self.data_available = true; + } + } + + // ParameterDescription + 't' => { + // More messages will follow in non-async cycles. + if !self.is_async { + self.data_available = true; + } + } + // DataRow 'D' => { // More data is available after this message, this is not the end of the reply. @@ -1110,6 +1126,26 @@ impl Server { // Parse complete successfully '1' => { self.registering_prepared_statement.pop_front(); + // Expect ReadyForQuery next (non-async) + if !self.is_async { + self.data_available = true; + } + } + + // BindComplete + '2' => { + // Expect more messages (e.g., CommandComplete/ReadyForQuery) in non-async mode + if !self.is_async { + self.data_available = true; + } + } + + // CloseComplete + '3' => { + // Expect ReadyForQuery next (non-async) + if !self.is_async { + self.data_available = true; + } } // Anything else, e.g. errors, notices, etc. @@ -1118,6 +1154,9 @@ impl Server { }; if self.is_async { + // In async mode, keep signaling that more data may be available until ReadyForQuery is received. + // The 'Z' branch above sets data_available = false and breaks, so we won't get here for 'Z'. + self.data_available = true; break; } } From 905e6a429c405b551461c607501a323109007bf6 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 17:09:10 -0300 Subject: [PATCH 12/20] fix idle in transaction in session mode --- src/client.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/client.rs b/src/client.rs index 23f835f3..6fc72f9d 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1164,9 +1164,15 @@ where let mut initial_message = Some(message); - let idle_client_timeout_duration = match get_idle_client_in_transaction_timeout() { - 0 => tokio::time::Duration::MAX, - timeout => tokio::time::Duration::from_millis(timeout), + // Only apply idle-in-transaction timeout when running in transaction pool mode. + // In session mode, long-lived idle sessions are expected, so we do not time them out here. + let idle_client_timeout_duration = if self.transaction_mode { + match get_idle_client_in_transaction_timeout() { + 0 => tokio::time::Duration::MAX, + timeout => tokio::time::Duration::from_millis(timeout), + } + } else { + tokio::time::Duration::MAX }; // Transaction loop. Multiple queries can be issued by the client here. @@ -1526,7 +1532,7 @@ where // Add the sync message self.buffer.put(&message[..]); - let mut should_send_to_server = true; + let should_send_to_server = true; // Always send Sync to the server to properly terminate any extended-protocol cycle. // Avoid fabricating ReadyForQuery without server acknowledgement. From a773076087c2f6d68d5dc92aab61370b62b84f09 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 17:09:17 -0300 Subject: [PATCH 13/20] plain build logs --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4fbbd0f5..ca956eeb 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ BASE_IMAGE_NAME:=pgcat build: - docker build \ + docker buildx build --output plain \ -t $(REPO_URL)/$(BASE_IMAGE_NAME) \ . From 3c5424c505f0f4793d06cd0bfd83e9c9658e4c63 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 17:26:06 -0300 Subject: [PATCH 14/20] better handling of idle in transaction --- src/client.rs | 53 +++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/client.rs b/src/client.rs index 6fc72f9d..1032983c 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1164,15 +1164,11 @@ where let mut initial_message = Some(message); - // Only apply idle-in-transaction timeout when running in transaction pool mode. - // In session mode, long-lived idle sessions are expected, so we do not time them out here. - let idle_client_timeout_duration = if self.transaction_mode { - match get_idle_client_in_transaction_timeout() { - 0 => tokio::time::Duration::MAX, - timeout => tokio::time::Duration::from_millis(timeout), - } - } else { - tokio::time::Duration::MAX + // Use the configured idle_client_in_transaction_timeout for both pool modes. + // Whether it results in an error depends on whether a transaction is actually open. + let idle_client_timeout_duration = match get_idle_client_in_transaction_timeout() { + 0 => tokio::time::Duration::MAX, + timeout => tokio::time::Duration::from_millis(timeout), }; // Transaction loop. Multiple queries can be issued by the client here. @@ -1227,23 +1223,30 @@ where return Err(err); } Err(_) => { - // Client idle in transaction timeout - error_response(&mut self.write, "idle transaction timeout").await?; - error!( - "Client idle in transaction timeout: \ - {{ \ - pool_name: {}, \ - username: {}, \ - shard: {:?}, \ - role: \"{:?}\" \ - }}", - self.pool_name, - self.username, - query_router.shard(), - query_router.role() - ); + // Timeout while waiting for the next client message. + // Only treat this as an idle *transaction* timeout if we're actually in a transaction. + if server.in_transaction() { + error_response(&mut self.write, "idle transaction timeout").await?; + error!( + "Client idle in transaction timeout: \ + {{ \ + pool_name: {}, \ + username: {}, \ + shard: {:?}, \ + role: \"{:?}\" \ + }}", + self.pool_name, + self.username, + query_router.shard(), + query_router.role() + ); - break; + break; + } else { + // Not in a transaction (e.g. session mode idle, or between transactions). + // Just continue waiting for the next client message. + continue; + } } } } From 052bf151129e5528d26d663fd8627444537fa20f Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 17:27:10 -0300 Subject: [PATCH 15/20] plain progress output --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ca956eeb..1ed0d4fb 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ BASE_IMAGE_NAME:=pgcat build: - docker buildx build --output plain \ + docker buildx build --progress plain \ -t $(REPO_URL)/$(BASE_IMAGE_NAME) \ . From 98d9fd629ec4d924e3690893455baa1c569c1257 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 19:30:14 -0300 Subject: [PATCH 16/20] upgrades --- .github/workflows/chart-lint-test.yaml | 2 +- .github/workflows/publish-ci-docker-image.yml | 2 +- Cargo.lock | 1690 ++++++++++------- Cargo.toml | 2 +- src/server.rs | 8 +- tests/ruby/Gemfile.lock | 4 +- 6 files changed, 1063 insertions(+), 645 deletions(-) diff --git a/.github/workflows/chart-lint-test.yaml b/.github/workflows/chart-lint-test.yaml index c19789fb..0a6d067d 100644 --- a/.github/workflows/chart-lint-test.yaml +++ b/.github/workflows/chart-lint-test.yaml @@ -22,7 +22,7 @@ jobs: # Python is required because `ct lint` runs Yamale (https://github.com/23andMe/Yamale) and # yamllint (https://github.com/adrienverge/yamllint) which require Python - name: Set up Python - uses: actions/setup-python@v5.1.0 + uses: actions/setup-python@v5.3.0 with: python-version: 3.7 diff --git a/.github/workflows/publish-ci-docker-image.yml b/.github/workflows/publish-ci-docker-image.yml index 5df4fd48..dbbf9f63 100644 --- a/.github/workflows/publish-ci-docker-image.yml +++ b/.github/workflows/publish-ci-docker-image.yml @@ -8,7 +8,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Login to GitHub Container Registry - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} diff --git a/Cargo.lock b/Cargo.lock index 2f94c390..26c20a58 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,53 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] +version = 4 [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "android-tzdata" -version = "0.1.1" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" @@ -60,64 +28,65 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "windows-sys", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -126,24 +95,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -165,30 +134,21 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "backtrace" -version = "0.3.68" +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.21.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bb8" @@ -210,9 +170,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-buffer" @@ -225,42 +185,42 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "camino" -version = "1.1.9" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -280,47 +240,48 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +dependencies = [ + "find-msvc-tools", + "shlex", +] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "time", "wasm-bindgen", - "winapi", + "windows-link", ] [[package]] name = "clap" -version = "4.3.15" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f644d0dac522c8b05ddc39aaaccc5b136d5dc4ff216610c5641e3be5becf56c" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.15" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af410122b9778e024f9e0fb35682cc09cc3f85cad5e8d3ba8f47a9702df6e73d" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -330,63 +291,63 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -399,7 +360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -407,9 +368,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "digest" @@ -422,11 +383,22 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "either" -version = "1.8.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "enum-as-inner" @@ -434,7 +406,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 1.0.109", @@ -442,29 +414,18 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "cc", "libc", + "windows-sys 0.61.2", ] [[package]] @@ -490,9 +451,15 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" @@ -500,20 +467,26 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -526,9 +499,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -536,15 +509,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -553,38 +526,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -610,32 +583,38 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] -name = "gimli" -version = "0.27.3" +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] [[package]] name = "glob" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" -version = "0.4.6" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -652,25 +631,44 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hmac" @@ -681,25 +679,13 @@ dependencies = [ "digest", ] -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - [[package]] name = "http" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -715,12 +701,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -728,25 +714,26 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.4.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -754,6 +741,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -761,12 +749,12 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "hyper", @@ -776,16 +764,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -797,6 +786,87 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "idna" version = "0.2.3" @@ -810,22 +880,33 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "indexmap" -version = "2.0.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", ] [[package]] @@ -834,28 +915,23 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.10", "widestring", - "windows-sys", + "windows-sys 0.48.0", "winreg", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "is-terminal" -version = "0.4.9" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -868,15 +944,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jemalloc-sys" -version = "0.5.3+5.3.0-patched" +version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bd5d616ea7ed58b571b2e209a65759664d7fb021a0819d7a790afc67e47ca1" +checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" dependencies = [ "cc", "libc", @@ -884,9 +960,9 @@ dependencies = [ [[package]] name = "jemallocator" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c2514137880c52b0b4822b563fadd38257c1f380858addb74a400889696ea6" +checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" dependencies = [ "jemalloc-sys", "libc", @@ -894,24 +970,25 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "linked-hash-map" @@ -921,33 +998,38 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.19" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru" -version = "0.12.0" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efa59af2ddfad1854ae27d75009d538d0998b4b2fd47083e743ac1a10e46c60" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown", + "hashbrown 0.15.5", ] [[package]] @@ -959,19 +1041,13 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -982,18 +1058,19 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -1019,95 +1096,75 @@ dependencies = [ "triomphe", ] -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - [[package]] name = "mio" -version = "0.8.8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset", "pin-utils", - "static_assertions", ] [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.61.2", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", ] -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "overload" -version = "0.1.1" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1115,22 +1172,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pgcat" @@ -1139,7 +1196,7 @@ dependencies = [ "arc-swap", "async-trait", "atomic_enum", - "base64", + "base64 0.21.7", "bb8", "bytes", "chrono", @@ -1164,7 +1221,7 @@ dependencies = [ "phf", "pin-project", "postgres-protocol", - "rand", + "rand 0.8.5", "regex", "rustls", "rustls-pemfile", @@ -1174,7 +1231,7 @@ dependencies = [ "serial_test", "sha-1", "sha2", - "socket2 0.4.9", + "socket2 0.4.10", "sqlparser", "stringprep", "tokio", @@ -1184,14 +1241,14 @@ dependencies = [ "tracing", "tracing-subscriber", "trust-dns-resolver", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", @@ -1199,61 +1256,61 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand", + "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1263,33 +1320,45 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres-protocol" -version = "0.6.5" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7fa9f396f51dffd61546fd8573ee20592287996568e6175ceb0f8699ad75d" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" dependencies = [ - "base64", + "base64 0.22.1", "byteorder", "bytes", "fallible-iterator", "hmac", "md-5", "memchr", - "rand", + "rand 0.9.2", "sha2", "stringprep", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1300,26 +1369,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.10.0", "memchr", "unicase", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.37" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1327,8 +1396,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1338,7 +1417,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1347,152 +1436,137 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "rand_core" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "bitflags 1.3.2", + "getrandom 0.3.4", ] [[package]] -name = "regex" -version = "1.9.1" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.3.3", - "regex-syntax 0.7.4", + "bitflags 2.10.0", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "regex" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ - "regex-syntax 0.6.29", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error", -] +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "ring" -version = "0.16.20" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", + "cfg-if", + "getrandom 0.2.16", "libc", - "once_cell", - "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.52.0", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustix" -version = "0.38.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.21.5" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", - "rustls-webpki 0.101.1", + "rustls-webpki", "sct", ] [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] -name = "rustls-webpki" -version = "0.100.2" +name = "rustls-pki-types" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab" -dependencies = [ - "ring", - "untrusted", -] +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" [[package]] name = "rustls-webpki" -version = "0.101.1" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -1505,9 +1579,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.2.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d25269dd3a12467afe2e510f69fb0b46b698e5afb296b59f2145259deaf8e8" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ "sdd", ] @@ -1520,9 +1594,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -1530,64 +1604,77 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.4" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.214" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] [[package]] name = "serial_test" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" dependencies = [ "futures", "log", @@ -1599,13 +1686,13 @@ dependencies = [ [[package]] name = "serial_test_derive" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -1621,9 +1708,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -1632,27 +1719,33 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] [[package]] name = "siphasher" -version = "0.3.10" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "skeptic" @@ -1671,24 +1764,21 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -1696,19 +1786,23 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] -name = "spin" -version = "0.5.2" +name = "socket2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] [[package]] name = "sqlparser" @@ -1728,36 +1822,37 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stable_deref_trait" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stringprep" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -1772,15 +1867,26 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -1789,63 +1895,61 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.8.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "redox_syscall", + "getrandom 0.3.4", + "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] -name = "time" -version = "0.1.45" +name = "tinystr" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "displaydoc", + "zerovec", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -1858,33 +1962,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "autocfg", - "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.4.9", + "socket2 0.6.1", "tokio-macros", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -1899,9 +2000,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -1910,9 +2011,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" dependencies = [ "async-stream", "bytes", @@ -1923,23 +2024,22 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", @@ -1949,18 +2049,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "serde", @@ -1971,11 +2071,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1983,20 +2082,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -2004,20 +2103,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -2025,14 +2124,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -2046,9 +2145,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" [[package]] name = "trust-dns-proto" @@ -2066,7 +2165,7 @@ dependencies = [ "idna 0.2.3", "ipnet", "lazy_static", - "rand", + "rand 0.8.5", "smallvec", "thiserror", "tinyvec", @@ -2097,77 +2196,90 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.0" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 1.1.0", "percent-encoding", + "serde", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -2190,46 +2302,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" +name = "wasm-bindgen" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ - "bumpalo", - "log", + "cfg-if", "once_cell", - "proc-macro2", - "quote", - "syn 2.0.87", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2237,47 +2340,49 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.87", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] [[package]] -name = "web-sys" -version = "0.3.64" +name = "webpki-roots" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "js-sys", - "wasm-bindgen", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "0.23.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ - "rustls-webpki 0.100.2", + "rustls-pki-types", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -2297,11 +2402,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -2311,12 +2416,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] @@ -2325,71 +2480,227 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +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.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.5.0" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -2401,5 +2712,114 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] diff --git a/Cargo.toml b/Cargo.toml index 07737424..d7186c61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ atomic_enum = "0.2.0" postgres-protocol = "0.6.5" fallible-iterator = "0.2" pin-project = "1" -webpki-roots = "0.23" +webpki-roots = "0.26" rustls = { version = "0.21", features = ["dangerous_configuration"] } trust-dns-resolver = "0.22.0" tokio-test = "0.4.2" diff --git a/src/server.rs b/src/server.rs index 882450ea..efc30802 100644 --- a/src/server.rs +++ b/src/server.rs @@ -401,11 +401,11 @@ impl Server { let mut root_store = RootCertStore::empty(); root_store.add_server_trust_anchors( - webpki_roots::TLS_SERVER_ROOTS.0.iter().map(|ta| { + webpki_roots::TLS_SERVER_ROOTS.iter().map(|ta| { OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, + ta.subject.to_vec(), + ta.subject_public_key_info.to_vec(), + ta.name_constraints.as_ref().map(|nc| nc.to_vec()), ) }), ); diff --git a/tests/ruby/Gemfile.lock b/tests/ruby/Gemfile.lock index ba6999ba..b9e2bf3b 100644 --- a/tests/ruby/Gemfile.lock +++ b/tests/ruby/Gemfile.lock @@ -35,8 +35,7 @@ GEM pg (1.3.2) rainbow (3.1.1) regexp_parser (2.3.1) - rexml (3.3.6) - strscan + rexml (3.3.9) rspec (3.11.0) rspec-core (~> 3.11.0) rspec-expectations (~> 3.11.0) @@ -62,7 +61,6 @@ GEM rubocop-ast (1.17.0) parser (>= 3.1.1.0) ruby-progressbar (1.11.0) - strscan (3.1.0) timeout (0.4.1) toml (0.3.0) parslet (>= 1.8.0, < 3.0.0) From d4238ff7637c2f8abaf99d7bc01bfb56255580fc Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 20:34:51 -0300 Subject: [PATCH 17/20] upgrades --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d7186c61..1643a9ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,6 @@ pin-project = "1" webpki-roots = "0.26" rustls = { version = "0.21", features = ["dangerous_configuration"] } trust-dns-resolver = "0.22.0" -tokio-test = "0.4.2" serde_json = "1" itertools = "0.10" clap = { version = "4.3.1", features = ["derive", "env"] } @@ -61,4 +60,5 @@ mini-moka = "0.10.3" jemallocator = "0.5.0" [dev-dependencies] -serial_test = "*" +serial_test = "3" +tokio-test = "0.4" From e41d409d12d5e9483016c21e7daf05e1260c1dd4 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 21:02:56 -0300 Subject: [PATCH 18/20] upgrading and best practices --- src/admin.rs | 5 +-- src/config.rs | 13 ++++--- src/constants.rs | 1 - src/plugins/table_access.rs | 2 +- src/pool.rs | 11 +++--- src/query_router.rs | 67 +++++++++++++------------------------ src/server.rs | 30 ++++++++++------- 7 files changed, 56 insertions(+), 73 deletions(-) diff --git a/src/admin.rs b/src/admin.rs index f08ef2e1..b875cefd 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -529,13 +529,14 @@ where .expect("Time went backwards") .as_secs() as i64; - for (id, pool) in get_all_pools().iter() { + for (id, pool) in get_all_pools().iter() { for (address, (ban_reason, ban_time)) in pool.get_bans().iter() { let ban_duration = match ban_reason { BanReason::AdminBan(duration) => *duration, _ => pool.settings.ban_time, }; - let remaining = ban_duration - (now - ban_time.timestamp()); + let ban_time_secs = ban_time.and_utc().timestamp(); + let remaining = ban_duration - (now - ban_time_secs); if remaining <= 0 { continue; } diff --git a/src/config.rs b/src/config.rs index e56f92b9..99abac32 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1211,7 +1211,7 @@ impl From<&Config> for std::collections::HashMap { ]; r.append(&mut static_settings); - return r.iter().cloned().collect(); + r.iter().cloned().collect() } } @@ -1283,12 +1283,11 @@ impl Config { .values() .map(|user_cfg| user_cfg.pool_size) .sum::() - .to_string() ); info!( "[pool: {}] Default pool mode: {}", pool_name, - pool_config.pool_mode.to_string() + pool_config.pool_mode ); info!( "[pool: {}] Load Balancing mode: {:?}", @@ -1321,7 +1320,7 @@ impl Config { info!( "[pool: {}] Sharding function: {}", pool_name, - pool_config.sharding_function.to_string() + pool_config.sharding_function ); info!( "[pool: {}] Primary reads: {}", @@ -1552,7 +1551,7 @@ pub async fn parse(path: &str) -> Result<(), Error> { let mut file = match File::open(path).await { Ok(file) => file, Err(err) => { - error!("Could not open '{}': {}", path, err.to_string()); + error!("Could not open '{}': {}", path, err); return Err(Error::BadConfig); } }; @@ -1560,7 +1559,7 @@ pub async fn parse(path: &str) -> Result<(), Error> { match file.read_to_string(&mut contents).await { Ok(_) => (), Err(err) => { - error!("Could not read config file: {}", err.to_string()); + error!("Could not read config file: {}", err); return Err(Error::BadConfig); } }; @@ -1568,7 +1567,7 @@ pub async fn parse(path: &str) -> Result<(), Error> { let mut config: Config = match toml::from_str(&contents) { Ok(config) => config, Err(err) => { - error!("Could not parse config file: {}", err.to_string()); + error!("Could not parse config file: {}", err); return Err(Error::BadConfig); } }; diff --git a/src/constants.rs b/src/constants.rs index 0900d7cc..bafadbb5 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,7 +1,6 @@ /// Various protocol constants, as defined in /// /// and elsewhere in the source code. - // Used in the StartupMessage to indicate regular handshake. pub const PROTOCOL_VERSION_NUMBER: i32 = 196608; diff --git a/src/plugins/table_access.rs b/src/plugins/table_access.rs index b8153b5a..bd0ef21d 100644 --- a/src/plugins/table_access.rs +++ b/src/plugins/table_access.rs @@ -32,7 +32,7 @@ impl<'a> Plugin for TableAccess<'a> { let mut found = None; - visit_relations(ast, |relation| { + let _ = visit_relations(ast, |relation| { let relation = relation.to_string(); let parts = relation.split('.').collect::>(); let table_name = parts.last().unwrap(); diff --git a/src/pool.rs b/src/pool.rs index 0cda8a3a..8a440a3a 100644 --- a/src/pool.rs +++ b/src/pool.rs @@ -989,12 +989,11 @@ impl ConnectionPool { let read_guard = self.banlist.read(); let exceeded_ban_time = match read_guard[address.shard].get(address) { Some((ban_reason, timestamp)) => { - let now = chrono::offset::Utc::now().naive_utc(); + let now_secs = chrono::offset::Utc::now().timestamp(); + let ts_secs = timestamp.and_utc().timestamp(); match ban_reason { - BanReason::AdminBan(duration) => { - now.timestamp() - timestamp.timestamp() > *duration - } - _ => now.timestamp() - timestamp.timestamp() > self.settings.ban_time, + BanReason::AdminBan(duration) => now_secs - ts_secs > *duration, + _ => now_secs - ts_secs > self.settings.ban_time, } } None => return true, @@ -1076,7 +1075,7 @@ impl ConnectionPool { /// Get the number of checked out connection for an address /// Get server settings retrieved at connection setup. - + /// /// Calculate how many used connections in the pool /// for the given server. fn busy_connection_count(&self, address: &Address) -> u32 { diff --git a/src/query_router.rs b/src/query_router.rs index a996e661..6443d68e 100644 --- a/src/query_router.rs +++ b/src/query_router.rs @@ -221,15 +221,8 @@ impl QueryRouter { let query = message_cursor.read_string().unwrap(); - let regex_set = match CUSTOM_SQL_REGEX_SET.get() { - Some(regex_set) => regex_set, - None => return None, - }; - - let regex_list = match CUSTOM_SQL_REGEX_LIST.get() { - Some(regex_list) => regex_list, - None => return None, - }; + let regex_set = CUSTOM_SQL_REGEX_SET.get()?; + let regex_list = CUSTOM_SQL_REGEX_LIST.get()?; let matches: Vec<_> = regex_set.matches(&query).into_iter().collect(); @@ -511,19 +504,15 @@ impl QueryRouter { } } - match &self.pool_settings.automatic_sharding_key { - Some(_) => { - // TODO: if we have multiple queries in the same message, - // we can either split them and execute them individually - // or discard shard selection. If they point to the same shard though, - // we can let them through as-is. - // This is basically building a database now :) - let inferred_shard = self.infer_shard(query); - self.handle_inferred_shard(inferred_shard, &mut prev_inferred_shard)?; - } - - None => (), - }; + if self.pool_settings.automatic_sharding_key.is_some() { + // TODO: if we have multiple queries in the same message, + // we can either split them and execute them individually + // or discard shard selection. If they point to the same shard though, + // we can let them through as-is. + // This is basically building a database now :) + let inferred_shard = self.infer_shard(query); + self.handle_inferred_shard(inferred_shard, &mut prev_inferred_shard)?; + } let has_locks = !query.locks.is_empty(); let has_mutation = Self::is_mutation_query(query); @@ -548,18 +537,14 @@ impl QueryRouter { self.update_mutation_cache_on_write(q); } - match &self.pool_settings.automatic_sharding_key { - Some(_) => { - // TODO: similar to the above, if we have multiple queries in the - // same message, we can either split them and execute them individually - // or discard shard selection. If they point to the same shard though, - // we can let them through as-is. - let inferred_shard = self.infer_shard_on_write(q)?; - self.handle_inferred_shard(inferred_shard, &mut prev_inferred_shard)?; - } - - None => (), - }; + if self.pool_settings.automatic_sharding_key.is_some() { + // TODO: similar to the above, if we have multiple queries in the + // same message, we can either split them and execute them individually + // or discard shard selection. If they point to the same shard though, + // we can let them through as-is. + let inferred_shard = self.infer_shard_on_write(q)?; + self.handle_inferred_shard(inferred_shard, &mut prev_inferred_shard)?; + } visited_write_statement = true; self.active_role = Some(Role::Primary); } @@ -757,13 +742,9 @@ impl QueryRouter { } fn process_selection(selection: &Option, exprs: &mut Vec) { - match selection { - Some(selection) => { - exprs.push(selection.clone()); - } - - None => (), - }; + if let Some(selection) = selection { + exprs.push(selection.clone()); + } } fn process_tables_with_join( @@ -967,7 +948,7 @@ impl QueryRouter { == a.target .to_string() .split('.') - .last() + .next_back() .unwrap() .to_lowercase() { @@ -1154,7 +1135,7 @@ impl QueryRouter { None } - 1 => Some(shards.into_iter().last().unwrap()), + 1 => Some(*shards.iter().next_back().unwrap()), // TODO: support querying multiple shards (some day...) _ => { diff --git a/src/server.rs b/src/server.rs index 601ba979..2c037a11 100644 --- a/src/server.rs +++ b/src/server.rs @@ -40,7 +40,7 @@ pub enum StreamInner { }, Tls { #[pin] - stream: TlsStream, + stream: Box>, }, } @@ -401,7 +401,7 @@ impl Server { debug!("Connecting to server using TLS"); let mut root_store = RootCertStore::empty(); - root_store.add_server_trust_anchors( + root_store.add_trust_anchors( webpki_roots::TLS_SERVER_ROOTS.iter().map(|ta| { OwnedTrustAnchor::from_subject_spki_name_constraints( ta.subject.to_vec(), @@ -436,7 +436,7 @@ impl Server { } }; - StreamInner::Tls { stream } + StreamInner::Tls { stream: Box::new(stream) } } // Server does not support TLS @@ -904,11 +904,7 @@ impl Server { /// Switch to async mode, flushing messages as soon /// as we receive them without buffering or waiting for "ReadyForQuery". pub fn switch_async(&mut self, on: bool) { - if on { - self.is_async = true; - } else { - self.is_async = false; - } + self.is_async = on; } /// Receive data from the server in response to a client request. @@ -1506,13 +1502,21 @@ async fn parse_query_message(message: &mut BytesMut) -> Result, Erro match message::backend::Message::parse(message) { Ok(Some(message::backend::Message::RowDescription(_description))) => {} Ok(Some(message::backend::Message::ErrorResponse(err))) => { + let field_values = err + .fields() + .iterator() + .filter_map(|element| match element { + Ok(field) => std::str::from_utf8(field.value_bytes()) + .ok() + .map(|s| s.to_owned()), + Err(_) => None, + }) + .collect::>() + .join(""); return Err(Error::ProtocolSyncError(format!( "Protocol error parsing response. Err: {:?}", - err.fields() - .iterator() - .fold(String::default(), |acc, element| acc - + element.unwrap().value()) - ))) + field_values + ))); } Ok(_) => { return Err(Error::ProtocolSyncError( From f6af97163dbfa0340eaca50bb1dc70d7583e2c5b Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Thu, 27 Nov 2025 21:13:25 -0300 Subject: [PATCH 19/20] fix build --- Dockerfile | 2 +- Makefile | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 536efe69..17e6b39f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.81.0-slim-bookworm AS builder +FROM rust:1.83.0-slim-bookworm AS builder RUN apt-get update && \ apt-get install -y build-essential diff --git a/Makefile b/Makefile index 1ed0d4fb..d63fbcec 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -BASE_IMAGE_NAME:=pgcat +BASE_IMAGE_NAME := pgcat +REPO_URL ?= +IMAGE_TAG := $(if $(REPO_URL),$(REPO_URL)/$(BASE_IMAGE_NAME),$(BASE_IMAGE_NAME)) build: - docker buildx build --progress plain \ - -t $(REPO_URL)/$(BASE_IMAGE_NAME) \ - . + docker buildx build --progress plain -t $(IMAGE_TAG) . release: - docker push $(REPO_URL)/$(BASE_IMAGE_NAME) + docker push $(IMAGE_TAG) From acfb7f9da85ee696f89aee8b6cf4ac83c503cde9 Mon Sep 17 00:00:00 2001 From: Samuel Barbosa Date: Wed, 3 Dec 2025 15:31:22 -0300 Subject: [PATCH 20/20] fixing handling of H --- src/client.rs | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/client.rs b/src/client.rs index 1032983c..74c76fef 100644 --- a/src/client.rs +++ b/src/client.rs @@ -2029,12 +2029,19 @@ where self.send_server_message(server, message, address, pool) .await?; + // For Flush (H), do not wait for any server response here. Flush only + // guarantees that already-pending data will be sent; the server is not + // required to send anything new. Blocking waiting for a response can + // deadlock the client if there is nothing to receive. + if code == 'H' { + return Ok(()); + } + let query_start = Instant::now(); - if code == 'H' { - // Flush (H) should not eagerly drain the entire extended-protocol cycle. - // We read a single server response chunk here; further messages will be - // delivered via the async recv branch in the main loop. + // For Sync (S) and all other commands, drain until the server + // indicates there is no more data available (i.e. until ReadyForQuery). + loop { let response = self .receive_server_message(server, address, pool, client_stats) .await?; @@ -2042,30 +2049,14 @@ where match write_all_flush(&mut self.write, &response).await { Ok(_) => (), Err(err) => { + // We might be in some kind of error/in between protocol state, better to just kill this server server.mark_bad(err.to_string().as_str()); return Err(err); } }; - } else { - // For Sync (S) and all other commands, drain until the server - // indicates there is no more data available (i.e. until ReadyForQuery). - loop { - let response = self - .receive_server_message(server, address, pool, client_stats) - .await?; - match write_all_flush(&mut self.write, &response).await { - Ok(_) => (), - Err(err) => { - // We might be in some kind of error/in between protocol state, better to just kill this server - server.mark_bad(err.to_string().as_str()); - return Err(err); - } - }; - - if !server.is_data_available() { - break; - } + if !server.is_data_available() { + break; } }