Skip to content

Commit 07e5930

Browse files
committed
Handle target_session_attrs
1 parent e77b0fd commit 07e5930

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

tokio-postgres/src/connect.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use crate::config::{Host, TargetSessionAttrs};
22
use crate::connect_raw::connect_raw;
33
use crate::connect_socket::connect_socket;
44
use crate::tls::{MakeTlsConnect, TlsConnect};
5-
use crate::{Client, Config, Connection, Error, Socket};
5+
use crate::{Client, Config, Connection, Error, SimpleQueryMessage, Socket};
6+
use futures::TryStreamExt;
7+
use std::io;
68

79
pub async fn connect<T>(
810
mut tls: T,
@@ -50,10 +52,27 @@ where
5052
T: TlsConnect<Socket>,
5153
{
5254
let socket = connect_socket(idx, config).await?;
53-
let (client, connection) = connect_raw(socket, tls, config, Some(idx)).await?;
55+
let (mut client, connection) = connect_raw(socket, tls, config, Some(idx)).await?;
5456

5557
if let TargetSessionAttrs::ReadWrite = config.target_session_attrs {
56-
unimplemented!()
58+
let mut rows = client.simple_query("SHOW transaction_read_only");
59+
60+
loop {
61+
match rows.try_next().await? {
62+
Some(SimpleQueryMessage::Row(row)) => {
63+
if row.try_get(0)? == Some("on") {
64+
return Err(Error::connect(io::Error::new(
65+
io::ErrorKind::PermissionDenied,
66+
"database does not allow writes",
67+
)));
68+
} else {
69+
break;
70+
}
71+
}
72+
Some(_) => {}
73+
None => return Err(Error::unexpected_message()),
74+
}
75+
}
5776
}
5877

5978
Ok((client, connection))

tokio-postgres/tests/test/runtime.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ async fn wrong_port_count() {
4949
.unwrap();
5050
}
5151

52-
/*
5352
#[tokio::test]
5453
async fn target_session_attrs_ok() {
5554
tokio_postgres::connect(
@@ -67,9 +66,13 @@ async fn target_session_attrs_err() {
6766
"host=localhost port=5433 user=postgres target_session_attrs=read-write
6867
options='-c default_transaction_read_only=on'",
6968
NoTls,
70-
).await.err().unwrap();
69+
)
70+
.await
71+
.err()
72+
.unwrap();
7173
}
7274

75+
/*
7376
#[test]
7477
fn cancel_query() {
7578
let mut runtime = Runtime::new().unwrap();

0 commit comments

Comments
 (0)