| 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)) |
| } |