pgdog.git / summary / log / commit / refs
commit b17e0394c62425ebdcd3371d1e2bb9d28cdfabaa
Author: Lev Kokotov <lev.kokotov@gmail.com>
Date: Thu Jan 02 18:52:22 2025 +0000
save
src/backend/pool/connection.rs | 2 +-
src/backend/server.rs | 22 ++++++++++++----------
src/frontend/client.rs | 5 ++---
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/src/backend/pool/connection.rs b/src/backend/pool/connection.rs
index f90fd282..d60cd179 100644
--- a/src/backend/pool/connection.rs
+++ b/src/backend/pool/connection.rs
@@ -18,7 +18,7 @@ impl Connection {
}
/// Create a server connection if one doesn't exist already.
- pub async fn connect(&mut self) -> Result<(), Error> {
+ pub async fn get(&mut self) -> Result<(), Error> {
if self.server.is_none() {
self.server = Some(Server::connect("127.0.0.1:5432").await?);
}
diff --git a/src/backend/server.rs b/src/backend/server.rs
index 2995e699..db6c6ff9 100644
--- a/src/backend/server.rs
+++ b/src/backend/server.rs
@@ -146,6 +146,14 @@ impl Server {
self.state == State::Idle
}
+ /// Server connection is synchronized and can receive more messages.
+ pub fn in_sync(&self) -> bool {
+ matches!(
+ self.state,
+ State::IdleInTransaction | State::TransactionError | State::Idle
+ )
+ }
+
/// Server parameters.
pub fn params(&self) -> &Vec<(String, String)> {
&self.params
@@ -171,18 +179,12 @@ impl Server {
/// Attempt to rollback the transaction on this server, if any has been started.
pub fn rollback(mut self) {
spawn(async move {
- match self.state {
- State::IdleInTransaction => {
- if let Err(_err) = self.execute("ROLLBACK").await {
- self.state = State::Error;
- }
- }
-
- State::Active => {
+ if self.in_sync() {
+ if let Err(_err) = self.execute("ROLLBACK").await {
self.state = State::Error;
}
-
- _ => (),
+ } else {
+ self.state = State::Error;
}
});
}
diff --git a/src/frontend/client.rs b/src/frontend/client.rs
index 50e009af..8ed4eba0 100644
--- a/src/frontend/client.rs
+++ b/src/frontend/client.rs
@@ -4,9 +4,8 @@ use tokio::select;
use super::{Buffer, Error};
use crate::backend::pool::Connection;
-use crate::backend::Server;
use crate::net::messages::{
- Authentication, BackendKeyData, Message, ParameterStatus, Protocol, ReadyForQuery,
+ Authentication, BackendKeyData, ParameterStatus, Protocol, ReadyForQuery,
};
use crate::net::Stream;
use crate::state::State;
@@ -69,7 +68,7 @@ impl Client {
flush = buffer.flush();
self.state = State::Waiting;
- server.connect().await?;
+ server.get().await?;
self.state = State::Active;
server.send(buffer.into()).await?;
[parent: 726ecba1e393]