yb_postgres/
generic_client.rs

1use crate::types::{BorrowToSql, ToSql, Type};
2use crate::{
3    Client, CopyInWriter, CopyOutReader, Error, Row, RowIter, SimpleQueryMessage, Statement,
4    ToStatement, Transaction,
5};
6
7mod private {
8    pub trait Sealed {}
9}
10
11/// A trait allowing abstraction over connections and transactions.
12///
13/// This trait is "sealed", and cannot be implemented outside of this crate.
14pub trait GenericClient: private::Sealed {
15    /// Like `Client::execute`.
16    fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
17    where
18        T: ?Sized + ToStatement;
19
20    /// Like `Client::query`.
21    fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
22    where
23        T: ?Sized + ToStatement;
24
25    /// Like `Client::query_one`.
26    fn query_one<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Row, Error>
27    where
28        T: ?Sized + ToStatement;
29
30    /// Like `Client::query_opt`.
31    fn query_opt<T>(
32        &mut self,
33        query: &T,
34        params: &[&(dyn ToSql + Sync)],
35    ) -> Result<Option<Row>, Error>
36    where
37        T: ?Sized + ToStatement;
38
39    /// Like `Client::query_raw`.
40    fn query_raw<T, P, I>(&mut self, query: &T, params: I) -> Result<RowIter<'_>, Error>
41    where
42        T: ?Sized + ToStatement,
43        P: BorrowToSql,
44        I: IntoIterator<Item = P>,
45        I::IntoIter: ExactSizeIterator;
46
47    /// Like `Client::prepare`.
48    fn prepare(&mut self, query: &str) -> Result<Statement, Error>;
49
50    /// Like `Client::prepare_typed`.
51    fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result<Statement, Error>;
52
53    /// Like `Client::copy_in`.
54    fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>
55    where
56        T: ?Sized + ToStatement;
57
58    /// Like `Client::copy_out`.
59    fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>
60    where
61        T: ?Sized + ToStatement;
62
63    /// Like `Client::simple_query`.
64    fn simple_query(&mut self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error>;
65
66    /// Like `Client::batch_execute`.
67    fn batch_execute(&mut self, query: &str) -> Result<(), Error>;
68
69    /// Like `Client::transaction`.
70    fn transaction(&mut self) -> Result<Transaction<'_>, Error>;
71}
72
73impl private::Sealed for Client {}
74
75impl GenericClient for Client {
76    fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
77    where
78        T: ?Sized + ToStatement,
79    {
80        self.execute(query, params)
81    }
82
83    fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
84    where
85        T: ?Sized + ToStatement,
86    {
87        self.query(query, params)
88    }
89
90    fn query_one<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Row, Error>
91    where
92        T: ?Sized + ToStatement,
93    {
94        self.query_one(query, params)
95    }
96
97    fn query_opt<T>(
98        &mut self,
99        query: &T,
100        params: &[&(dyn ToSql + Sync)],
101    ) -> Result<Option<Row>, Error>
102    where
103        T: ?Sized + ToStatement,
104    {
105        self.query_opt(query, params)
106    }
107
108    fn query_raw<T, P, I>(&mut self, query: &T, params: I) -> Result<RowIter<'_>, Error>
109    where
110        T: ?Sized + ToStatement,
111        P: BorrowToSql,
112        I: IntoIterator<Item = P>,
113        I::IntoIter: ExactSizeIterator,
114    {
115        self.query_raw(query, params)
116    }
117
118    fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
119        self.prepare(query)
120    }
121
122    fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result<Statement, Error> {
123        self.prepare_typed(query, types)
124    }
125
126    fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>
127    where
128        T: ?Sized + ToStatement,
129    {
130        self.copy_in(query)
131    }
132
133    fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>
134    where
135        T: ?Sized + ToStatement,
136    {
137        self.copy_out(query)
138    }
139
140    fn simple_query(&mut self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
141        self.simple_query(query)
142    }
143
144    fn batch_execute(&mut self, query: &str) -> Result<(), Error> {
145        self.batch_execute(query)
146    }
147
148    fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
149        self.transaction()
150    }
151}
152
153impl private::Sealed for Transaction<'_> {}
154
155impl GenericClient for Transaction<'_> {
156    fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
157    where
158        T: ?Sized + ToStatement,
159    {
160        self.execute(query, params)
161    }
162
163    fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
164    where
165        T: ?Sized + ToStatement,
166    {
167        self.query(query, params)
168    }
169
170    fn query_one<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Row, Error>
171    where
172        T: ?Sized + ToStatement,
173    {
174        self.query_one(query, params)
175    }
176
177    fn query_opt<T>(
178        &mut self,
179        query: &T,
180        params: &[&(dyn ToSql + Sync)],
181    ) -> Result<Option<Row>, Error>
182    where
183        T: ?Sized + ToStatement,
184    {
185        self.query_opt(query, params)
186    }
187
188    fn query_raw<T, P, I>(&mut self, query: &T, params: I) -> Result<RowIter<'_>, Error>
189    where
190        T: ?Sized + ToStatement,
191        P: BorrowToSql,
192        I: IntoIterator<Item = P>,
193        I::IntoIter: ExactSizeIterator,
194    {
195        self.query_raw(query, params)
196    }
197
198    fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
199        self.prepare(query)
200    }
201
202    fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result<Statement, Error> {
203        self.prepare_typed(query, types)
204    }
205
206    fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>
207    where
208        T: ?Sized + ToStatement,
209    {
210        self.copy_in(query)
211    }
212
213    fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>
214    where
215        T: ?Sized + ToStatement,
216    {
217        self.copy_out(query)
218    }
219
220    fn simple_query(&mut self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
221        self.simple_query(query)
222    }
223
224    fn batch_execute(&mut self, query: &str) -> Result<(), Error> {
225        self.batch_execute(query)
226    }
227
228    fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
229        self.transaction()
230    }
231}