mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-28 03:06:29 +00:00
COPY OUT support
This commit is contained in:
@@ -118,6 +118,8 @@ impl Client {
|
|||||||
match code {
|
match code {
|
||||||
'Q' => {
|
'Q' => {
|
||||||
server.send(original).await?;
|
server.send(original).await?;
|
||||||
|
|
||||||
|
loop {
|
||||||
let response = server.recv().await?;
|
let response = server.recv().await?;
|
||||||
match write_all_half(&mut self.write, response).await {
|
match write_all_half(&mut self.write, response).await {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
@@ -127,6 +129,11 @@ impl Client {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if !server.is_data_available() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Release server
|
// Release server
|
||||||
if !server.in_transaction() {
|
if !server.in_transaction() {
|
||||||
drop(server);
|
drop(server);
|
||||||
@@ -166,6 +173,7 @@ impl Client {
|
|||||||
server.send(self.buffer.clone()).await?;
|
server.send(self.buffer.clone()).await?;
|
||||||
self.buffer.clear();
|
self.buffer.clear();
|
||||||
|
|
||||||
|
loop {
|
||||||
let response = server.recv().await?;
|
let response = server.recv().await?;
|
||||||
match write_all_half(&mut self.write, response).await {
|
match write_all_half(&mut self.write, response).await {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
@@ -175,6 +183,11 @@ impl Client {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if !server.is_data_available() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Release server
|
// Release server
|
||||||
if !server.in_transaction() {
|
if !server.in_transaction() {
|
||||||
drop(server);
|
drop(server);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ pub struct Server {
|
|||||||
backend_id: i32,
|
backend_id: i32,
|
||||||
secret_key: i32,
|
secret_key: i32,
|
||||||
in_transaction: bool,
|
in_transaction: bool,
|
||||||
|
data_available: bool,
|
||||||
bad: bool,
|
bad: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,6 +137,7 @@ impl Server {
|
|||||||
backend_id: backend_id,
|
backend_id: backend_id,
|
||||||
secret_key: secret_key,
|
secret_key: secret_key,
|
||||||
in_transaction: false,
|
in_transaction: false,
|
||||||
|
data_available: false,
|
||||||
bad: false,
|
bad: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -208,6 +210,21 @@ impl Server {
|
|||||||
// CopyInResponse: copy is starting from client to server
|
// CopyInResponse: copy is starting from client to server
|
||||||
'G' => break,
|
'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,
|
// Keep buffering,
|
||||||
}
|
}
|
||||||
@@ -224,6 +241,10 @@ impl Server {
|
|||||||
self.in_transaction
|
self.in_transaction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_data_available(&self) -> bool {
|
||||||
|
self.data_available
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_bad(&self) -> bool {
|
pub fn is_bad(&self) -> bool {
|
||||||
self.bad
|
self.bad
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user