diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 861014c..d3d4fe1 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -38,3 +38,16 @@ jobs: run: cargo build --verbose - name: Run tests run: cargo test --verbose + + sqlx-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install sqlx-cli + run: cargo install sqlx-cli + - name: Initialize database + run: mkdir -p cache && sqlite3 cache/metadata.sqlite < db_queries/init.sql + - name: Check sqlx statements + run: cargo sqlx prepare --check + with: + fail_ci_if_error: true \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 470f931..b78c983 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -623,6 +623,9 @@ name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +dependencies = [ + "serde", +] [[package]] name = "encoding_rs" @@ -1809,6 +1812,7 @@ version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ + "indexmap", "itoa", "ryu", "serde", @@ -2003,6 +2007,7 @@ dependencies = [ "parking_lot", "percent-encoding", "rustls", + "serde", "sha2", "smallvec", "sqlformat", @@ -2027,9 +2032,12 @@ dependencies = [ "either", "futures", "heck", + "hex", "once_cell", "proc-macro2", "quote", + "serde", + "serde_json", "sha2", "sqlx-core", "sqlx-rt", diff --git a/Cargo.toml b/Cargo.toml index 0537695..1e614f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ serde_repr = "0.1" serde_yaml = "0.8" simple_logger = "1" sodiumoxide = "0.2" -sqlx = { version = "0.5", features = [ "runtime-actix-rustls", "sqlite", "time", "chrono", "macros" ] } +sqlx = { version = "0.5", features = [ "runtime-actix-rustls", "sqlite", "time", "chrono", "macros", "offline" ] } thiserror = "1" tokio = { version = "1", features = [ "full", "parking_lot" ] } tokio-stream = { version = "0.1", features = [ "sync" ] } diff --git a/build.rs b/build.rs index dd98c99..0efd4c1 100644 --- a/build.rs +++ b/build.rs @@ -1,7 +1,4 @@ -use std::path::PathBuf; -use std::process::Command; -use std::str::FromStr; -use std::{error::Error, io::Write}; +use std::error::Error; use vergen::{vergen, Config, ShaKind}; @@ -11,36 +8,5 @@ fn main() -> Result<(), Box> { *config.git_mut().sha_kind_mut() = ShaKind::Short; vergen(config)?; - // Initialize SQL stuff - let project_root = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - Command::new("mkdir") - .args(["cache", "--parents"]) - .current_dir(&project_root) - .output()?; - - Command::new("sqlite3") - .args(["cache/metadata.sqlite", include_str!("db_queries/init.sql")]) - .current_dir(&project_root) - .output()?; - - let env_var_regex = "^DATABASE_URL=sqlite:./cache/metadata.sqlite$"; - if !Command::new("grep") - .args([env_var_regex, ".env"]) - .current_dir(&project_root) - .output()? - .status - .success() - { - let mut path = PathBuf::from_str(&project_root)?; - path.push(".env"); - - let mut file = std::fs::OpenOptions::new() - .append(true) - .create(true) - .open(path)?; - file.write_all(b"\nDATABASE_URL=sqlite:./cache/metadata.sqlite\n")?; - file.sync_all()?; - } - Ok(()) } diff --git a/sqlx-data.json b/sqlx-data.json new file mode 100644 index 0000000..7ec2755 --- /dev/null +++ b/sqlx-data.json @@ -0,0 +1,75 @@ +{ + "db": "SQLite", + "2a8aa6dd2c59241a451cd73f23547d0e94930e35654692839b5d11bb8b87703e": { + "query": "insert into Images (id, size, accessed) values (?, ?, ?) on conflict do nothing", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + } + }, + "311721fec7824c2fc3ecf53f714949a49245c11a6b622efdb04fdac24be41ba3": { + "query": "SELECT IFNULL(SUM(size), 0) AS size FROM Images", + "describe": { + "columns": [ + { + "name": "size", + "ordinal": 0, + "type_info": "Int" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + true + ] + } + }, + "44234188e873a467ecf2c60dfb4731011e0b7afc4472339ed2ae33aee8b0c9dd": { + "query": "select id, size from Images order by accessed asc limit 1000", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "size", + "ordinal": 1, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false, + false + ] + } + }, + "59e09d6fbcc7cd91807f6c9598e4028352b28e83e85c98d96cafd3e713b4d7b7": { + "query": "update Images set accessed = ? where id = ? or id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + } + }, + "a60501a30fd75b2a2a59f089e850343af075436a5c543a267ecb4fa841593ce9": { + "query": "create table if not exists Images(\n id varchar primary key not null,\n size integer not null,\n accessed timestamp not null default CURRENT_TIMESTAMP\n);\ncreate index if not exists Images_accessed on Images(accessed);", + "describe": { + "columns": [], + "parameters": { + "Right": 0 + }, + "nullable": [] + } + } +} \ No newline at end of file