@@ -30,6 +30,12 @@ pub trait ConnectionExtensions {
3030 fn fetch_collect < Q : Query , B : FromIterator < Q :: Entity > > ( & self , query : Q ) -> StdResult < B > {
3131 Ok ( self . fetch ( query) ?. collect :: < B > ( ) )
3232 }
33+
34+ /// Apply a query that do not return data from the database(ie: insert, delete, ...).
35+ fn apply < Q : Query > ( & self , query : Q ) -> StdResult < ( ) > {
36+ self . fetch ( query) ?. count ( ) ;
37+ Ok ( ( ) )
38+ }
3339}
3440
3541impl ConnectionExtensions for SqliteConnection {
@@ -79,6 +85,8 @@ fn prepare_statement<'conn>(
7985mod tests {
8086 use sqlite:: Connection ;
8187
88+ use crate :: sqlite:: { HydrationError , SqLiteEntity , WhereCondition } ;
89+
8290 use super :: * ;
8391
8492 #[ test]
@@ -115,4 +123,56 @@ mod tests {
115123
116124 assert_eq ! ( value, 45 ) ;
117125 }
126+
127+ #[ test]
128+ fn test_apply_execute_the_query ( ) {
129+ struct DummySqLiteEntity { }
130+ impl SqLiteEntity for DummySqLiteEntity {
131+ fn hydrate ( _row : sqlite:: Row ) -> Result < Self , HydrationError >
132+ where
133+ Self : Sized ,
134+ {
135+ unimplemented ! ( )
136+ }
137+
138+ fn get_projection ( ) -> crate :: sqlite:: Projection {
139+ unimplemented ! ( )
140+ }
141+ }
142+
143+ struct FakeQuery {
144+ sql : String ,
145+ }
146+ impl Query for FakeQuery {
147+ type Entity = DummySqLiteEntity ;
148+
149+ fn filters ( & self ) -> WhereCondition {
150+ WhereCondition :: default ( )
151+ }
152+
153+ fn get_definition ( & self , _condition : & str ) -> String {
154+ self . sql . clone ( )
155+ }
156+ }
157+
158+ let connection = Connection :: open_thread_safe ( ":memory:" ) . unwrap ( ) ;
159+ connection
160+ . execute ( "create table query_test(text_data);" )
161+ . unwrap ( ) ;
162+
163+ let value: i64 = connection
164+ . query_single_cell ( "select count(*) from query_test" , & [ ] )
165+ . unwrap ( ) ;
166+ assert_eq ! ( value, 0 ) ;
167+
168+ let query = FakeQuery {
169+ sql : "insert into query_test(text_data) values ('row 1')" . to_string ( ) ,
170+ } ;
171+ connection. apply ( query) . unwrap ( ) ;
172+
173+ let value: i64 = connection
174+ . query_single_cell ( "select count(*) from query_test" , & [ ] )
175+ . unwrap ( ) ;
176+ assert_eq ! ( value, 1 ) ;
177+ }
118178}
0 commit comments