1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use rusqlite::{Connection, Result, Savepoint, Transaction};

/// Types that can make a savepoint.
/// This is necessary because savepoint methods take a &mut, but none of the
// types impl DerefMut for Connection.
pub trait Savepointable {
    fn savepoint(&mut self) -> Result<Savepoint<'_>>;
}

impl Savepointable for Connection {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Connection::savepoint(self)
    }
}

impl Savepointable for Transaction<'_> {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Transaction::savepoint(self)
    }
}

impl Savepointable for Savepoint<'_> {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Savepoint::savepoint(self)
    }
}

impl Savepointable for &mut Connection {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Connection::savepoint(*self)
    }
}

impl Savepointable for &mut Transaction<'_> {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Transaction::savepoint(*self)
    }
}

impl Savepointable for &mut Savepoint<'_> {
    #[inline]
    fn savepoint(&mut self) -> Result<Savepoint<'_>> {
        Savepoint::savepoint(*self)
    }
}