#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Status {
Off,
On,
Aborted,
}
#[doc(hidden)]
impl From<pq_sys::PGpipelineStatus> for Status {
fn from(status: pq_sys::PGpipelineStatus) -> Self {
match status {
pq_sys::PGpipelineStatus::PQ_PIPELINE_OFF => Self::Off,
pq_sys::PGpipelineStatus::PQ_PIPELINE_ON => Self::On,
pq_sys::PGpipelineStatus::PQ_PIPELINE_ABORTED => Self::Aborted,
}
}
}
pub fn enter(conn: &crate::Connection) -> crate::errors::Result {
log::debug!("Enter pipeline mode");
let success = unsafe { pq_sys::PQenterPipelineMode(conn.into()) };
if success == 1 { Ok(()) } else { conn.error() }
}
pub fn exit(conn: &crate::Connection) -> crate::errors::Result {
log::debug!("Exit pipeline mode");
let success = unsafe { pq_sys::PQexitPipelineMode(conn.into()) };
if success == 1 { Ok(()) } else { conn.error() }
}
pub fn status(conn: &crate::Connection) -> Status {
let status = unsafe { pq_sys::PQpipelineStatus(conn.into()) };
status.into()
}
pub fn sync(conn: &crate::Connection) -> crate::errors::Result {
let success = unsafe { pq_sys::PQpipelineSync(conn.into()) };
if success == 1 { Ok(()) } else { conn.error() }
}
pub fn flush_request(conn: &crate::Connection) -> crate::errors::Result {
let success = unsafe { pq_sys::PQsendFlushRequest(conn.into()) };
if success == 1 { Ok(()) } else { conn.error() }
}
#[cfg(feature = "v17")]
pub fn send_sync(conn: &crate::Connection) -> crate::errors::Result {
let success = unsafe { pq_sys::PQsendPipelineSync(conn.into()) };
if success == 1 { Ok(()) } else { conn.error() }
}
#[cfg(test)]
mod test {
#[test]
fn enter() {
let conn = crate::test::new_conn();
assert!(crate::pipeline::enter(&conn).is_ok());
}
#[test]
fn exit() {
let conn = crate::test::new_conn();
assert!(crate::pipeline::exit(&conn).is_ok());
}
#[test]
fn status() {
let conn = crate::test::new_conn();
assert_eq!(crate::pipeline::status(&conn), crate::pipeline::Status::Off);
crate::pipeline::enter(&conn).unwrap();
assert_eq!(crate::pipeline::status(&conn), crate::pipeline::Status::On);
crate::pipeline::exit(&conn).unwrap();
assert_eq!(crate::pipeline::status(&conn), crate::pipeline::Status::Off);
}
#[test]
fn sync() {
let conn = crate::test::new_conn();
assert!(crate::pipeline::sync(&conn).is_err());
crate::pipeline::enter(&conn).unwrap();
assert!(crate::pipeline::sync(&conn).is_ok());
}
#[test]
fn flush_request() {
let conn = crate::test::new_conn();
assert!(crate::pipeline::flush_request(&conn).is_ok());
}
#[test]
#[cfg(feature = "v17")]
fn send_sync() {
let conn = crate::test::new_conn();
crate::pipeline::enter(&conn).unwrap();
assert_eq!(crate::pipeline::send_sync(&conn), Ok(()));
}
}