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
11pub trait GenericClient: private::Sealed {
15 fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
17 where
18 T: ?Sized + ToStatement;
19
20 fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
22 where
23 T: ?Sized + ToStatement;
24
25 fn query_one<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Row, Error>
27 where
28 T: ?Sized + ToStatement;
29
30 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 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 fn prepare(&mut self, query: &str) -> Result<Statement, Error>;
49
50 fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result<Statement, Error>;
52
53 fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>
55 where
56 T: ?Sized + ToStatement;
57
58 fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>
60 where
61 T: ?Sized + ToStatement;
62
63 fn simple_query(&mut self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error>;
65
66 fn batch_execute(&mut self, query: &str) -> Result<(), Error>;
68
69 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}