Skip to main content

xitca_postgres/execute/
sync_impl.rs

1use crate::{
2    client::ClientBorrow,
3    driver::codec::AsParams,
4    error::Error,
5    query::{RowAffected, RowSimpleStream, RowStream, RowStreamGuarded, RowStreamOwned},
6    statement::{
7        Statement, StatementCreateBlocking, StatementGuarded, StatementNamed, StatementPreparedQuery,
8        StatementPreparedQueryOwned, StatementQuery, StatementSingleRTTQuery,
9    },
10};
11
12use super::ExecuteBlocking;
13
14impl<'s, C> ExecuteBlocking<&C> for &'s Statement
15where
16    C: ClientBorrow,
17{
18    type ExecuteOutput = Result<u64, Error>;
19    type QueryOutput = Result<RowStream<'s>, Error>;
20
21    #[inline]
22    fn execute_blocking(self, cli: &C) -> Self::ExecuteOutput {
23        let stream = self.query_blocking(cli)?;
24        RowAffected::from(stream).wait()
25    }
26
27    #[inline]
28    fn query_blocking(self, cli: &C) -> Self::QueryOutput {
29        self.bind_none().query_blocking(cli)
30    }
31}
32
33impl<C> ExecuteBlocking<&C> for &str
34where
35    C: ClientBorrow,
36{
37    type ExecuteOutput = Result<u64, Error>;
38    type QueryOutput = Result<RowSimpleStream, Error>;
39
40    #[inline]
41    fn execute_blocking(self, cli: &C) -> Self::ExecuteOutput {
42        let stream = self.query_blocking(cli)?;
43        RowAffected::from(stream).wait()
44    }
45
46    #[inline]
47    fn query_blocking(self, cli: &C) -> Self::QueryOutput {
48        cli.borrow_cli_ref().query(self)
49    }
50}
51
52impl<'c, C> ExecuteBlocking<&'c C> for StatementNamed<'_>
53where
54    C: ClientBorrow,
55{
56    type ExecuteOutput = Result<StatementGuarded<'c, C>, Error>;
57    type QueryOutput = Self::ExecuteOutput;
58
59    #[inline]
60    fn execute_blocking(self, cli: &'c C) -> Self::ExecuteOutput {
61        let stmt = cli
62            .borrow_cli_ref()
63            .query(StatementCreateBlocking::from((self, cli)))??;
64        Ok(stmt.into_guarded(cli))
65    }
66
67    #[inline]
68    fn query_blocking(self, cli: &'c C) -> Self::QueryOutput {
69        self.execute_blocking(cli)
70    }
71}
72
73impl<'s, C, P> ExecuteBlocking<&C> for StatementPreparedQuery<'s, P>
74where
75    C: ClientBorrow,
76    P: AsParams,
77{
78    type ExecuteOutput = Result<u64, Error>;
79    type QueryOutput = Result<RowStream<'s>, Error>;
80
81    #[inline]
82    fn execute_blocking(self, cli: &C) -> Result<u64, Error> {
83        let stream = self.query_blocking(cli)?;
84        RowAffected::from(stream).wait()
85    }
86
87    #[inline]
88    fn query_blocking(self, cli: &C) -> Self::QueryOutput {
89        cli.borrow_cli_ref().query(self)
90    }
91}
92
93impl<'s, C, P> ExecuteBlocking<&C> for StatementPreparedQueryOwned<'s, P>
94where
95    C: ClientBorrow,
96    P: AsParams,
97{
98    type ExecuteOutput = Result<u64, Error>;
99    type QueryOutput = Result<RowStreamOwned, Error>;
100
101    #[inline]
102    fn execute_blocking(self, cli: &C) -> Result<u64, Error> {
103        let stream = self.query_blocking(cli)?;
104        RowAffected::from(stream).wait()
105    }
106
107    #[inline]
108    fn query_blocking(self, cli: &C) -> Self::QueryOutput {
109        cli.borrow_cli_ref().query(self)
110    }
111}
112
113impl<'c, C, P> ExecuteBlocking<&'c C> for StatementQuery<'_, P>
114where
115    C: ClientBorrow,
116    P: AsParams,
117{
118    type ExecuteOutput = Result<u64, Error>;
119    type QueryOutput = Result<RowStreamGuarded<'c, C>, Error>;
120
121    #[inline]
122    fn execute_blocking(self, cli: &C) -> Result<u64, Error> {
123        self.into_single_rtt().execute_blocking(cli)
124    }
125
126    #[inline]
127    fn query_blocking(self, cli: &'c C) -> Self::QueryOutput {
128        self.into_single_rtt().query_blocking(cli)
129    }
130}
131
132impl<'c, C, P> ExecuteBlocking<&'c C> for StatementSingleRTTQuery<'_, P>
133where
134    C: ClientBorrow,
135    P: AsParams,
136{
137    type ExecuteOutput = Result<u64, Error>;
138    type QueryOutput = Result<RowStreamGuarded<'c, C>, Error>;
139
140    #[inline]
141    fn execute_blocking(self, cli: &C) -> Self::ExecuteOutput {
142        let stream = self.query_blocking(cli)?;
143        RowAffected::from(stream).wait()
144    }
145
146    #[inline]
147    fn query_blocking(self, cli: &'c C) -> Self::QueryOutput {
148        cli.borrow_cli_ref().query(self.into_with_cli(cli))
149    }
150}
151
152impl<C> ExecuteBlocking<&C> for &std::path::Path
153where
154    C: ClientBorrow,
155{
156    type ExecuteOutput = Result<u64, Error>;
157    type QueryOutput = Result<RowSimpleStream, Error>;
158
159    #[inline]
160    fn execute_blocking(self, cli: &C) -> Self::ExecuteOutput {
161        std::fs::read_to_string(self)?.execute_blocking(cli)
162    }
163
164    #[inline]
165    fn query_blocking(self, cli: &C) -> Self::QueryOutput {
166        std::fs::read_to_string(self)?.query_blocking(cli)
167    }
168}