Skip to content

Commit ef6c72d

Browse files
committed
Add a apply function to execute query which does not return value
1 parent b573a6d commit ef6c72d

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

internal/mithril-persistence/src/sqlite/connection_extensions.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3541
impl ConnectionExtensions for SqliteConnection {
@@ -79,6 +85,8 @@ fn prepare_statement<'conn>(
7985
mod 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

Comments
 (0)