sql_support/
maybe_cached.rs
1use rusqlite::{self, CachedStatement, Connection, Statement};
6
7use std::ops::{Deref, DerefMut};
8
9pub enum MaybeCached<'conn> {
12 Uncached(Statement<'conn>),
13 Cached(CachedStatement<'conn>),
14}
15
16impl<'conn> Deref for MaybeCached<'conn> {
17 type Target = Statement<'conn>;
18 #[inline]
19 fn deref(&self) -> &Statement<'conn> {
20 match self {
21 MaybeCached::Cached(cached) => Deref::deref(cached),
22 MaybeCached::Uncached(uncached) => uncached,
23 }
24 }
25}
26
27impl<'conn> DerefMut for MaybeCached<'conn> {
28 #[inline]
29 fn deref_mut(&mut self) -> &mut Statement<'conn> {
30 match self {
31 MaybeCached::Cached(cached) => DerefMut::deref_mut(cached),
32 MaybeCached::Uncached(uncached) => uncached,
33 }
34 }
35}
36
37impl<'conn> From<Statement<'conn>> for MaybeCached<'conn> {
38 #[inline]
39 fn from(stmt: Statement<'conn>) -> Self {
40 MaybeCached::Uncached(stmt)
41 }
42}
43
44impl<'conn> From<CachedStatement<'conn>> for MaybeCached<'conn> {
45 #[inline]
46 fn from(stmt: CachedStatement<'conn>) -> Self {
47 MaybeCached::Cached(stmt)
48 }
49}
50
51impl<'conn> MaybeCached<'conn> {
52 #[inline]
53 pub fn prepare(
54 conn: &'conn Connection,
55 sql: &str,
56 cached: bool,
57 ) -> rusqlite::Result<MaybeCached<'conn>> {
58 if cached {
59 Ok(MaybeCached::Cached(conn.prepare_cached(sql)?))
60 } else {
61 Ok(MaybeCached::Uncached(conn.prepare(sql)?))
62 }
63 }
64}