dbmigrate_lib/drivers/
sqlite.rs1use sqlite_client::Connection;
2
3use super::Driver;
4use errors::{Result, ResultExt};
5
6
7#[derive(Debug)]
9pub struct Sqlite {
10 conn: Connection
11}
12
13impl Sqlite {
14 pub fn new(url: &str) -> Result<Sqlite> {
16 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}