dbmigrate_lib/drivers/
sqlite.rs

1use sqlite_client::Connection;
2
3use super::Driver;
4use errors::{Result, ResultExt};
5
6
7/// The SQLite driver
8#[derive(Debug)]
9pub struct Sqlite {
10    conn: Connection
11}
12
13impl Sqlite {
14    /// Create SQLite driver
15    pub fn new(url: &str) -> Result<Sqlite> {
16        // the replace is probably wrong
17        let conn = Connection::open(url.replace("sqlite:/", ""))?;
18        let mut sqlite = Sqlite { conn: conn };
19        sqlite.ensure_migration_table_exists();
20        Ok(sqlite)
21    }
22}
23
24impl Driver for Sqlite {
25    fn ensure_migration_table_exists(&mut self) {
26        self.conn.execute_batch("
27            CREATE TABLE IF NOT EXISTS __dbmigrate_table(id INTEGER, current INTEGER);
28            INSERT INTO __dbmigrate_table (id, current)
29            SELECT 1, 0
30            WHERE NOT EXISTS(SELECT * FROM __dbmigrate_table WHERE id = 1);
31        ").unwrap();
32    }
33
34    fn remove_migration_table(&mut self) {
35        self.conn.execute("DROP TABLE __dbmigrate_table;", &[]).unwrap();
36    }
37
38    fn get_current_number(&mut self) -> i32 {
39        self.conn.query_row("
40            SELECT current FROM __dbmigrate_table WHERE id = 1;
41        ", &[], |row| { row.get(0)}).unwrap()
42    }
43
44    fn set_current_number(&mut self, number: i32) {
45        let mut stmt = self.conn.prepare(
46            "UPDATE __dbmigrate_table SET current = ? WHERE id = 1;"
47        ).unwrap();
48        stmt.execute(&[&number]).unwrap();
49    }
50
51    fn migrate(&mut self, migration: String, number: i32) -> Result<()> {
52        self.conn.execute_batch(&migration).chain_err(|| "Migration failed")?;
53        self.set_current_number(number);
54
55        Ok(())
56    }
57}