cquill/queries/migrated/
files.rs

1use std::path::Path;
2
3use scylla::frame::value::CqlTimeuuid;
4use scylla::{IntoTypedRows, Session};
5
6use crate::cql_file::CqlFile;
7use crate::queries::QueryError;
8
9pub(crate) async fn insert(
10    session: &Session,
11    keyspace: &String,
12    table: &String,
13    cql_file: &CqlFile,
14) -> Result<(), QueryError> {
15    let cql =
16        format!("insert into {keyspace}.{table} (id, ver, name, hash) values (now(), ?, ?, ?)");
17    let values = (&cql_file.version, &cql_file.filename, &cql_file.hash);
18    session.query(cql, values).await?;
19    Ok(())
20}
21
22pub(crate) async fn select_all(
23    session: &Session,
24    keyspace: &String,
25    table: &String,
26    cql_dir: &Path,
27) -> Result<Vec<CqlFile>, QueryError> {
28    let cql = format!("select id, name, hash, ver from {keyspace}.{table}");
29    let query_result = session.query(cql, ()).await?;
30    let mut result = Vec::new();
31    if let Some(rows) = query_result.rows {
32        for row_result in rows.into_typed::<(CqlTimeuuid, String, String, i16)>() {
33            let row_values = row_result.unwrap();
34            let filename = row_values.1;
35            let hash = row_values.2;
36            let path = cql_dir.join(&filename);
37            let version = row_values.3;
38            result.push(CqlFile {
39                filename,
40                hash,
41                path,
42                version,
43            })
44        }
45    }
46    result.sort_by(|a, b| a.version.cmp(&b.version));
47    Ok(result)
48}
49
50#[cfg(test)]
51mod tests {
52    use std::path::PathBuf;
53
54    use crate::test_utils;
55
56    use super::*;
57
58    #[tokio::test]
59    async fn test_insert() {
60        let harness = test_utils::TestHarness::builder().initialize().await;
61        let cql_file = CqlFile {
62            filename: "v073-more_tables.cql".to_string(),
63            hash: "7f5b4bdccd3863f31be5c257ff497704".to_string(),
64            path: PathBuf::from("v073-more_tables.cql"),
65            version: 73,
66        };
67
68        insert(
69            &harness.session,
70            &harness.cquill_keyspace,
71            &harness.cquill_table,
72            &cql_file,
73        )
74        .await
75        .unwrap();
76        let select_cql = format!(
77            "select id, ver, name, hash from {}.{}",
78            harness.cquill_keyspace, harness.cquill_table
79        );
80        match harness.session.query(select_cql, ()).await {
81            Err(err) => {
82                println!("{err}");
83                panic!();
84            }
85            Ok(query_result) => {
86                let rows = query_result.rows.unwrap();
87                assert_eq!(rows.len(), 1);
88                for row_result in rows.into_typed::<(CqlTimeuuid, i16, String, String)>() {
89                    match row_result {
90                        Err(err) => {
91                            println!("{err}");
92                            panic!();
93                        }
94                        Ok(row) => {
95                            assert_eq!(row.0.to_string().len(), 36);
96                            assert_eq!(row.1, 73);
97                            assert_eq!(row.2, "v073-more_tables.cql");
98                            assert_eq!(row.3, "7f5b4bdccd3863f31be5c257ff497704");
99                        }
100                    }
101                }
102            }
103        }
104
105        harness.drop_keyspace().await;
106    }
107
108    #[tokio::test]
109    async fn test_select_all_when_empty() {
110        let harness = test_utils::TestHarness::builder().initialize().await;
111
112        let migrated_cql_files = select_all(
113            &harness.session,
114            &harness.cquill_keyspace,
115            &harness.cquill_table,
116            harness.cql_dir.as_path(),
117        )
118        .await
119        .expect("select all migrated cql files");
120        assert!(migrated_cql_files.is_empty());
121
122        harness.drop_keyspace().await;
123    }
124
125    #[tokio::test]
126    async fn test_select_all_returns_ordered() {
127        let harness = test_utils::TestHarness::builder()
128            .cql_file("v001-more_cql.cql", "abc")
129            .cql_file("v002-more_cql.cql", "def")
130            .cql_file("v003-more_cql.cql", "ghi")
131            .initialize()
132            .await;
133        for i in [0, 2, 1] {
134            let cql_file = harness.cql_files.get(i).unwrap();
135            insert(
136                &harness.session,
137                &harness.cquill_keyspace,
138                &harness.cquill_table,
139                cql_file,
140            )
141            .await
142            .expect("save migrated cql file history");
143        }
144
145        let migrated_cql_files = select_all(
146            &harness.session,
147            &harness.cquill_keyspace,
148            &harness.cquill_table,
149            harness.cql_dir.as_path(),
150        )
151        .await
152        .expect("select all migrated cql files");
153        assert_eq!(migrated_cql_files.len(), 3);
154        let first = migrated_cql_files.get(0).unwrap();
155        assert_eq!(first.filename, "v001-more_cql.cql");
156        assert_eq!(first.version, 1);
157        assert_eq!(first.hash, "900150983cd24fb0d6963f7d28e17f72");
158        assert_eq!(first.path, harness.cql_file_path("v001-more_cql.cql"));
159        let second = migrated_cql_files.get(1).unwrap();
160        assert_eq!(second.filename, "v002-more_cql.cql");
161        assert_eq!(second.version, 2);
162        assert_eq!(second.hash, "4ed9407630eb1000c0f6b63842defa7d");
163        assert_eq!(second.path, harness.cql_file_path("v002-more_cql.cql"));
164        let third = migrated_cql_files.get(2).unwrap();
165        assert_eq!(third.filename, "v003-more_cql.cql");
166        assert_eq!(third.version, 3);
167        assert_eq!(third.hash, "826bbc5d0522f5f20a1da4b60fa8c871");
168        assert_eq!(third.path, harness.cql_file_path("v003-more_cql.cql"));
169
170        harness.drop_keyspace().await;
171    }
172}