cquill/queries/migrated/
files.rs1use 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}