tokio_postgres/
bind.rs
1use crate::client::InnerClient;
2use crate::codec::FrontendMessage;
3use crate::connection::RequestMessages;
4use crate::types::BorrowToSql;
5use crate::{query, Error, Portal, Statement};
6use postgres_protocol::message::backend::Message;
7use postgres_protocol::message::frontend;
8use std::sync::atomic::{AtomicUsize, Ordering};
9use std::sync::Arc;
10
11static NEXT_ID: AtomicUsize = AtomicUsize::new(0);
12
13pub async fn bind<P, I>(
14 client: &Arc<InnerClient>,
15 statement: Statement,
16 params: I,
17) -> Result<Portal, Error>
18where
19 P: BorrowToSql,
20 I: IntoIterator<Item = P>,
21 I::IntoIter: ExactSizeIterator,
22{
23 let name = format!("p{}", NEXT_ID.fetch_add(1, Ordering::SeqCst));
24 let buf = client.with_buf(|buf| {
25 query::encode_bind(&statement, params, &name, buf)?;
26 frontend::sync(buf);
27 Ok(buf.split().freeze())
28 })?;
29
30 let mut responses = client.send(RequestMessages::Single(FrontendMessage::Raw(buf)))?;
31
32 match responses.next().await? {
33 Message::BindComplete => {}
34 _ => return Err(Error::unexpected_message()),
35 }
36
37 Ok(Portal::new(client, name, statement))
38}