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