scylla_migrate/
migration.rs1use anyhow::{Context, Result};
2use scylla::client::session::Session;
3use sha2::{Digest, Sha384};
4use std::borrow::Cow;
5
6#[derive(Debug)]
12pub struct Migration {
13 pub version: i64,
14 pub description: Cow<'static, str>,
15 pub cql: Cow<'static, str>,
16 pub checksum: Cow<'static, [u8]>,
17}
18
19impl Migration {
20 pub fn new(version: i64, description: Cow<'static, str>, cql: Cow<'static, str>) -> Self {
22 let checksum = Cow::Owned(Vec::from(Sha384::digest(cql.as_bytes()).as_slice()));
23
24 Migration {
25 version,
26 description,
27 cql,
28 checksum,
29 }
30 }
31
32 pub async fn up(&self, session: &Session) -> Result<()> {
33 let statements: Vec<_> = self
35 .cql
36 .split(';')
37 .map(|s| s.trim())
38 .filter(|s| !s.is_empty())
39 .collect();
40
41 for stmt in statements {
42 session
43 .query_unpaged(stmt, &[])
44 .await
45 .with_context(|| format!("Failed to execute migration statement: {}", stmt))?;
46 }
47
48 Ok(())
49 }
50}
51
52pub struct AppliedMigration {
53 pub checksum: Cow<'static, [u8]>,
54}