39 lines
1.1 KiB
Rust
39 lines
1.1 KiB
Rust
use crate::client::InnerClient;
|
|
use crate::codec::FrontendMessage;
|
|
use crate::connection::RequestMessages;
|
|
use crate::types::BorrowToSql;
|
|
use crate::{query, Error, Portal, Statement};
|
|
use postgres_protocol::message::backend::Message;
|
|
use postgres_protocol::message::frontend;
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
use std::sync::Arc;
|
|
|
|
static NEXT_ID: AtomicUsize = AtomicUsize::new(0);
|
|
|
|
pub async fn bind<P, I>(
|
|
client: &Arc<InnerClient>,
|
|
statement: Statement,
|
|
params: I,
|
|
) -> Result<Portal, Error>
|
|
where
|
|
P: BorrowToSql,
|
|
I: IntoIterator<Item = P>,
|
|
I::IntoIter: ExactSizeIterator,
|
|
{
|
|
let name = format!("p{}", NEXT_ID.fetch_add(1, Ordering::SeqCst));
|
|
let buf = client.with_buf(|buf| {
|
|
query::encode_bind(&statement, params, &name, buf)?;
|
|
frontend::sync(buf);
|
|
Ok(buf.split().freeze())
|
|
})?;
|
|
|
|
let mut responses = client.send(RequestMessages::Single(FrontendMessage::Raw(buf)))?;
|
|
|
|
match responses.next().await? {
|
|
Message::BindComplete => {}
|
|
_ => return Err(Error::unexpected_message()),
|
|
}
|
|
|
|
Ok(Portal::new(client, name, statement))
|
|
}
|