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