use crate::database::DatabaseExecutor; use crate::stmt::query; /// Migrates the migration generated by `build.rs` #[inline(always)] pub async fn migrate( conn: &C, db_prefix: &str, migrations: &[(&str, &str, &str)], ) -> Result<(), cdk_common::database::Error> where C: DatabaseExecutor, { query( r#" CREATE TABLE IF NOT EXISTS migrations ( name TEXT PRIMARY KEY, applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) "#, )? .execute(conn) .await?; // Apply each migration if it hasn’t been applied yet for (prefix, name, sql) in migrations { if !prefix.is_empty() && *prefix != db_prefix { continue; } let is_missing = query("SELECT name FROM migrations WHERE name = :name")? .bind("name", name) .pluck(conn) .await? .is_none(); if is_missing { query(sql)?.batch(conn).await?; query(r#"INSERT INTO migrations (name) VALUES (:name)"#)? .bind("name", name) .execute(conn) .await?; } } Ok(()) }