common.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use crate::database::DatabaseExecutor;
  2. use crate::stmt::query;
  3. /// Migrates the migration generated by `build.rs`
  4. #[inline(always)]
  5. pub async fn migrate<C: DatabaseExecutor>(
  6. conn: &C,
  7. db_prefix: &str,
  8. migrations: &[(&str, &str, &str)],
  9. ) -> Result<(), cdk_common::database::Error> {
  10. query(
  11. r#"
  12. CREATE TABLE IF NOT EXISTS migrations (
  13. name TEXT PRIMARY KEY,
  14. applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  15. )
  16. "#,
  17. )?
  18. .execute(conn)
  19. .await?;
  20. // Apply each migration if it hasn’t been applied yet
  21. for (prefix, name, sql) in migrations {
  22. if !prefix.is_empty() && *prefix != db_prefix {
  23. continue;
  24. }
  25. let is_missing = query("SELECT name FROM migrations WHERE name = :name")?
  26. .bind("name", name)
  27. .pluck(conn)
  28. .await?
  29. .is_none();
  30. if is_missing {
  31. query(sql)?.batch(conn).await?;
  32. query(r#"INSERT INTO migrations (name) VALUES (:name)"#)?
  33. .bind("name", name)
  34. .execute(conn)
  35. .await?;
  36. }
  37. }
  38. Ok(())
  39. }