COPY OUT support

This commit is contained in:
Lev Kokotov
2022-02-04 08:26:50 -08:00
parent 77507e7343
commit 381f06d46f
2 changed files with 48 additions and 14 deletions

View File

@@ -118,6 +118,8 @@ impl Client {
match code {
'Q' => {
server.send(original).await?;
loop {
let response = server.recv().await?;
match write_all_half(&mut self.write, response).await {
Ok(_) => (),
@@ -127,6 +129,11 @@ impl Client {
}
};
if !server.is_data_available() {
break;
}
}
// Release server
if !server.in_transaction() {
drop(server);
@@ -166,6 +173,7 @@ impl Client {
server.send(self.buffer.clone()).await?;
self.buffer.clear();
loop {
let response = server.recv().await?;
match write_all_half(&mut self.write, response).await {
Ok(_) => (),
@@ -175,6 +183,11 @@ impl Client {
}
};
if !server.is_data_available() {
break;
}
}
// Release server
if !server.in_transaction() {
drop(server);

View File

@@ -17,6 +17,7 @@ pub struct Server {
backend_id: i32,
secret_key: i32,
in_transaction: bool,
data_available: bool,
bad: bool,
}
@@ -136,6 +137,7 @@ impl Server {
backend_id: backend_id,
secret_key: secret_key,
in_transaction: false,
data_available: false,
bad: false,
});
}
@@ -208,6 +210,21 @@ impl Server {
// CopyInResponse: copy is starting from client to server
'G' => break,
// CopyOutResponse: copy is starting from the server to the client
'H' => {
self.data_available = true;
break;
}
// CopyData
'd' => break,
// CopyDone
'c' => {
self.data_available = false;
// Buffer until ReadyForQuery shows up
}
_ => {
// Keep buffering,
}
@@ -224,6 +241,10 @@ impl Server {
self.in_transaction
}
pub fn is_data_available(&self) -> bool {
self.data_available
}
pub fn is_bad(&self) -> bool {
self.bad
}