feat: set up basic database migration
						commit
						a410e4f9ec
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
/target
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
[package]
 | 
			
		||||
name = "calathea"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
axum = "0.7.9"
 | 
			
		||||
chrono = "0.4.39"
 | 
			
		||||
r2d2 = "0.8.10"
 | 
			
		||||
r2d2_sqlite = "0.25.0"
 | 
			
		||||
tokio = { version = "1.42.0", features = ["full"] }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
use r2d2_sqlite::{rusqlite, SqliteConnectionManager};
 | 
			
		||||
 | 
			
		||||
pub type DbPool = r2d2::Pool<SqliteConnectionManager>;
 | 
			
		||||
 | 
			
		||||
const MIGRATIONS: [&str; 1] = [include_str!("migrations/000_initial.sql")];
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn main() {
 | 
			
		||||
    let manager = SqliteConnectionManager::file("db.sqlite");
 | 
			
		||||
    let pool = r2d2::Pool::new(manager).unwrap();
 | 
			
		||||
    run_migrations(&pool, true).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn run_migrations(pool: &DbPool, new: bool) -> rusqlite::Result<()> {
 | 
			
		||||
    let mut conn = pool.get().unwrap();
 | 
			
		||||
 | 
			
		||||
    // Run very first migration
 | 
			
		||||
    if new {
 | 
			
		||||
        let tx = conn.transaction()?;
 | 
			
		||||
 | 
			
		||||
        tx.execute(MIGRATIONS[0], ())?;
 | 
			
		||||
 | 
			
		||||
        let cur_time = chrono::Local::now().timestamp();
 | 
			
		||||
        tx.execute(
 | 
			
		||||
            "insert into migration_version values ($1, $2)",
 | 
			
		||||
            [0, cur_time],
 | 
			
		||||
        )?;
 | 
			
		||||
 | 
			
		||||
        tx.commit()?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut next_version = conn.query_row(
 | 
			
		||||
        "select version from migration_version order by updated_at desc limit 1",
 | 
			
		||||
        (),
 | 
			
		||||
        |row| row.get::<_, usize>(0),
 | 
			
		||||
    )? + 1;
 | 
			
		||||
 | 
			
		||||
    while next_version < MIGRATIONS.len() {
 | 
			
		||||
        let tx = conn.transaction()?;
 | 
			
		||||
 | 
			
		||||
        tx.execute(MIGRATIONS[next_version], ())?;
 | 
			
		||||
 | 
			
		||||
        let cur_time = chrono::Local::now().timestamp();
 | 
			
		||||
        tx.execute(
 | 
			
		||||
            "insert into migration_version values ($1, $2)",
 | 
			
		||||
            (next_version, cur_time),
 | 
			
		||||
        )?;
 | 
			
		||||
 | 
			
		||||
        tx.commit()?;
 | 
			
		||||
 | 
			
		||||
        next_version += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
create table migration_version (
 | 
			
		||||
    version integer,
 | 
			
		||||
    updated_at integer
 | 
			
		||||
);
 | 
			
		||||
		Loading…
	
		Reference in New Issue