1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- use crate::database::DatabaseExecutor;
- use crate::stmt::query;
- /// Migrates the migration generated by `build.rs`
- #[inline(always)]
- pub async fn migrate<C>(
- 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(())
- }
|