Skip to main content

coven_database/
sql_read.rs

1//! The reads every app SQL context offers.
2
3use crate::{BulkSqlContext, SqlContext, SqlReadContext};
4use rusqlite::{Params, Row};
5
6/// Ordinary SQL reads through a read context or a write's, so code that
7/// reads the same way inside a write and outside one is written once. Inside
8/// a write it sees the write's own changes.
9pub trait SqlRead {
10    /// Map the first result row.
11    fn query_row<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<T>
12    where
13        P: Params,
14        F: FnOnce(&Row<'_>) -> rusqlite::Result<T>;
15
16    /// Map all result rows.
17    fn query<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<Vec<T>>
18    where
19        P: Params,
20        F: FnMut(&Row<'_>) -> rusqlite::Result<T>;
21}
22
23impl SqlRead for SqlReadContext<'_> {
24    fn query_row<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<T>
25    where
26        P: Params,
27        F: FnOnce(&Row<'_>) -> rusqlite::Result<T>,
28    {
29        SqlReadContext::query_row(self, sql, params, map)
30    }
31
32    fn query<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<Vec<T>>
33    where
34        P: Params,
35        F: FnMut(&Row<'_>) -> rusqlite::Result<T>,
36    {
37        SqlReadContext::query(self, sql, params, map)
38    }
39}
40
41impl SqlRead for SqlContext<'_, '_> {
42    fn query_row<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<T>
43    where
44        P: Params,
45        F: FnOnce(&Row<'_>) -> rusqlite::Result<T>,
46    {
47        SqlContext::query_row(self, sql, params, map)
48    }
49
50    fn query<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<Vec<T>>
51    where
52        P: Params,
53        F: FnMut(&Row<'_>) -> rusqlite::Result<T>,
54    {
55        SqlContext::query(self, sql, params, map)
56    }
57}
58
59impl SqlRead for BulkSqlContext<'_> {
60    fn query_row<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<T>
61    where
62        P: Params,
63        F: FnOnce(&Row<'_>) -> rusqlite::Result<T>,
64    {
65        BulkSqlContext::query_row(self, sql, params, map)
66    }
67
68    fn query<T, P, F>(&self, sql: &str, params: P, map: F) -> rusqlite::Result<Vec<T>>
69    where
70        P: Params,
71        F: FnMut(&Row<'_>) -> rusqlite::Result<T>,
72    {
73        BulkSqlContext::query(self, sql, params, map)
74    }
75}
76
77#[cfg(test)]
78#[path = "sql_read_tests.rs"]
79mod tests;