diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81a8b9e..7f3aacb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,6 +93,8 @@ jobs: vsce_target: linux-arm64-musl - target: armv7-unknown-linux-gnueabihf vsce_target: linux-arm-gnu + - target: arm-unknown-linux-musleabi + vsce_target: linux-arm-musl steps: - uses: actions/checkout@v1 - uses: dtolnay/rust-toolchain@stable diff --git a/Cargo.lock b/Cargo.lock index 8415016..86dc2f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,11 +82,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys", ] @@ -104,9 +105,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "byteorder" @@ -116,9 +117,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.2.3" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "shlex", ] @@ -131,9 +132,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.23" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -141,9 +142,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -153,9 +154,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck", "proc-macro2", @@ -186,9 +187,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "csv" @@ -249,6 +250,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -300,14 +312,14 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libsqlite3-sys" version = "0.26.0" -source = "git+https://github.com/yy0931/rusqlite.git?branch=master#1bf135f8bba90d580e664f825cbe117ebea977e8" +source = "git+https://github.com/yy0931/rusqlite.git?branch=master#c43c713df81f19578258f9a7a7889474b903712a" dependencies = [ "cc", "openssl-sys", @@ -317,15 +329,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" @@ -335,9 +347,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -399,18 +411,18 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -469,7 +481,7 @@ dependencies = [ [[package]] name = "rusqlite" version = "0.29.0" -source = "git+https://github.com/yy0931/rusqlite.git?branch=master#1bf135f8bba90d580e664f825cbe117ebea977e8" +source = "git+https://github.com/yy0931/rusqlite.git?branch=master#c43c713df81f19578258f9a7a7889474b903712a" dependencies = [ "bitflags", "fallible-iterator", @@ -481,9 +493,9 @@ dependencies = [ [[package]] name = "rust_xlsxwriter" -version = "0.52.0" +version = "0.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727aa1579b27b8e520961d559e6748163522dcb009ae9adfea60ce165125f5d9" +checksum = "eea20da37f12cb312effc50d90a8dab9540648972ec6fbd1e3acb9618eb9fb23" dependencies = [ "lazy_static", "regex", @@ -492,9 +504,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags", "errno", @@ -511,9 +523,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -529,9 +541,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -540,9 +552,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" dependencies = [ "itoa", "memchr", @@ -564,13 +576,13 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "sqlite3-editor" -version = "1.0.199" +version = "1.0.201" dependencies = [ "base64", "clap", "csv", "hex", - "lazy_static", + "once_cell", "percent-encoding", "regex", "rmp", @@ -602,9 +614,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -613,12 +625,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys", @@ -700,6 +713,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "winapi-util" version = "0.1.9" diff --git a/Cargo.toml b/Cargo.toml index 2c22511..9bbe27b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sqlite3-editor" -version = "1.0.199" +version = "1.0.201" edition = "2021" [features] @@ -9,7 +9,6 @@ sqlcipher = ["rusqlite/bundled-sqlcipher-vendored-openssl"] [dependencies] clap = { version = "4.4.3", features = ["derive"] } -lazy_static = "1.4.0" percent-encoding = "2.3.0" regex = "1.9.5" rmp = "0.8.12" @@ -22,7 +21,11 @@ csv = "1.2.2" base64 = "0.21.4" hex = "0.4.3" ts-rs = "7.0.0" -rust_xlsxwriter = "0.52.0" +once_cell = "1.20.2" + +# We can't use rust_xlsxwriter>=0.67.0 because it doesn't compile on aarch64. +# rust_xlsxwriter>=0.67.0 uses thiserror-impl 2.0.11 via zip 2.2.2, and it throws the error: "linking with `cc` failed: ..." on aarch64 builds. +rust_xlsxwriter = "0.66.0" [dependencies.rusqlite] git = "https://github.com/yy0931/rusqlite.git" diff --git a/src/check_syntax.rs b/src/check_syntax.rs index c012f80..67c854d 100644 --- a/src/check_syntax.rs +++ b/src/check_syntax.rs @@ -1,4 +1,5 @@ -use lazy_static::lazy_static; +use once_cell::sync::Lazy; +use regex::Regex; use serde::{Deserialize, Serialize}; use sqlparser::tokenizer::{Location, TokenizerError}; @@ -8,18 +9,14 @@ use crate::{ tokenize::ZeroIndexedLocation, }; -lazy_static! { - static ref PRAGMA: regex::Regex = regex::Regex::new(r"(?i)(?s).*\bPRAGMA[^_a-zA-Z0-9]").unwrap(); - static ref QUERY: regex::Regex = regex::Regex::new(r"(?i)(?s).*\bQUERY[^_a-zA-Z0-9]").unwrap(); - static ref EXPLAIN: regex::Regex = regex::Regex::new(r"(?i)(?s).*\bEXPLAIN[^_a-zA-Z0-9]").unwrap(); -} +static PRAGMA: Lazy = Lazy::new(|| Regex::new(r"(?i)(?s).*\bPRAGMA[^_a-zA-Z0-9]").unwrap()); +static QUERY: Lazy = Lazy::new(|| Regex::new(r"(?i)(?s).*\bQUERY[^_a-zA-Z0-9]").unwrap()); +static EXPLAIN: Lazy = Lazy::new(|| Regex::new(r"(?i)(?s).*\bEXPLAIN[^_a-zA-Z0-9]").unwrap()); -lazy_static! { - static ref SQL_INPUT_ERROR_SYNTAX_ERROR: regex::Regex = - regex::Regex::new(r#"(?i)(?s)^(?:near .*: syntax error|unrecognized token:|incomplete input)"#).unwrap(); - static ref SQLITE_FAILURE_SYNTAX_ERROR: regex::Regex = - regex::Regex::new(r#"(?i)(?s)^(?:unknown table option)"#).unwrap(); -} +static SQL_INPUT_ERROR_SYNTAX_ERROR: Lazy = + Lazy::new(|| Regex::new(r#"(?i)(?s)^(?:near .*: syntax error|unrecognized token:|incomplete input)"#).unwrap()); +static SQLITE_FAILURE_SYNTAX_ERROR: Lazy = + Lazy::new(|| Regex::new(r#"(?i)(?s)^(?:unknown table option)"#).unwrap()); #[derive(ts_rs::TS, Debug, Eq, PartialEq, Clone, Serialize, Deserialize)] #[ts(export)] diff --git a/src/export.rs b/src/export.rs index 616441f..b172a71 100644 --- a/src/export.rs +++ b/src/export.rs @@ -4,7 +4,7 @@ use crate::{ util::into, }; use base64::{engine::general_purpose, Engine as _}; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use rusqlite::{types::ValueRef, Connection}; use serde::{Deserialize, Serialize}; use std::{collections::HashSet, io::Write}; @@ -171,9 +171,7 @@ pub struct XLSXExportOptions { pub active_sheet: Option, } -lazy_static! { - static ref INVALID_SHEET_NAME_PATTERN: regex::Regex = regex::Regex::new(r"[*?:\[\]\\/]|^'|'$").unwrap(); -} +static INVALID_SHEET_NAME_PATTERN: Lazy = Lazy::new(|| regex::Regex::new(r"[*?:\[\]\\/]|^'|'$").unwrap()); /// - Integer values between i32::MIN and i32::MAX are encoded as i32. Values outside this range are rounded to the nearest f64 values because Excel does not support 64-bit integers. /// - NULL is encoded as an empty string. diff --git a/src/find.rs b/src/find.rs index 0fd674a..18605a3 100644 --- a/src/find.rs +++ b/src/find.rs @@ -1,14 +1,14 @@ use std::sync::{Arc, Mutex}; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use rusqlite::types::ValueRef; -lazy_static! { - static ref REGEX_CACHE: Arc> = Arc::new(Mutex::<(String, regex::Regex)>::new(( +static REGEX_CACHE: Lazy>> = Lazy::new(|| { + Arc::new(Mutex::<(String, regex::Regex)>::new(( "".to_owned(), regex::Regex::new("").unwrap(), - ))); -} + ))) +}); #[inline] fn get_find_widget_input(ctx: &rusqlite::functions::Context) -> String { diff --git a/src/keywords.rs b/src/keywords.rs index d88e93d..de339d0 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -1,11 +1,11 @@ use std::collections::HashSet; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; -lazy_static! { - pub static ref START_OF_STATEMENT_KEYWORDS_UNSUPPORTED_BY_SQLPARSER: HashSet<&'static str> = - HashSet::from(["VACUUM", "ATTACH", "DETACH", "PRAGMA", "REINDEX"]); - pub static ref KEYWORDS_UNSUPPORTED_BY_SQLPARSER: HashSet<&'static str> = HashSet::from([ +pub static START_OF_STATEMENT_KEYWORDS_UNSUPPORTED_BY_SQLPARSER: Lazy> = + Lazy::new(|| HashSet::from(["VACUUM", "ATTACH", "DETACH", "PRAGMA", "REINDEX"])); +pub static KEYWORDS_UNSUPPORTED_BY_SQLPARSER: Lazy> = Lazy::new(|| { + HashSet::from([ "AFTER", "ATTACH", "BEFORE", @@ -26,5 +26,5 @@ lazy_static! { "RAISE", "REGEXP", "REINDEX", - ]); -} + ]) +}); diff --git a/src/list_placeholders.rs b/src/list_placeholders.rs index 4c87600..ddb35ea 100644 --- a/src/list_placeholders.rs +++ b/src/list_placeholders.rs @@ -1,4 +1,4 @@ -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; use sqlparser::{ keywords::Keyword, @@ -10,10 +10,7 @@ use crate::{ tokenize::{TokenWithRangeLocation, ZeroIndexedLocation}, }; -lazy_static! { - static ref QUESTION_NUMBER: regex::Regex = regex::Regex::new(r"^\?\d+$").unwrap(); - static ref NUMBER: regex::Regex = regex::Regex::new(r"^.+$").unwrap(); -} +static QUESTION_NUMBER: Lazy = Lazy::new(|| regex::Regex::new(r"^\?\d+$").unwrap()); #[derive(ts_rs::TS, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] #[ts(export)] diff --git a/src/semantic_highlight.rs b/src/semantic_highlight.rs index f70957e..e710d9e 100644 --- a/src/semantic_highlight.rs +++ b/src/semantic_highlight.rs @@ -1,4 +1,4 @@ -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; use sqlparser::{ dialect::SQLiteDialect, @@ -33,12 +33,11 @@ pub struct SemanticHighlight { pub end: ZeroIndexedLocation, } -lazy_static! { - static ref HEXADECIMAL_NUMERIC_LITERAL: regex::Regex = regex::Regex::new(r#"^\d+(_\d+)*$"#).unwrap(); - static ref NUMERIC_LITERAL_CONTINUATION: regex::Regex = - regex::Regex::new(r#"^(_\d+)+([eE](\d+(_\d+)*)?)?$"#).unwrap(); - static ref HEXADECIMAL_LITERAL_CONTINUATION: regex::Regex = regex::Regex::new(r#"^X\d+(_\d+)*$"#).unwrap(); -} +static HEXADECIMAL_NUMERIC_LITERAL: Lazy = Lazy::new(|| regex::Regex::new(r#"^\d+(_\d+)*$"#).unwrap()); +static NUMERIC_LITERAL_CONTINUATION: Lazy = + Lazy::new(|| regex::Regex::new(r#"^(_\d+)+([eE](\d+(_\d+)*)?)?$"#).unwrap()); +static HEXADECIMAL_LITERAL_CONTINUATION: Lazy = + Lazy::new(|| regex::Regex::new(r#"^X\d+(_\d+)*$"#).unwrap()); /// Tokenizes the given SQL input string and returns the tokens with highlighting information. pub fn semantic_highlight(sql: &str) -> Vec { diff --git a/src/sqlite3.rs b/src/sqlite3.rs index 400679c..8f5bacd 100644 --- a/src/sqlite3.rs +++ b/src/sqlite3.rs @@ -9,7 +9,7 @@ use crate::{ literal::Literal, request_type::QueryMode, }; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use rusqlite::{functions::FunctionFlags, types::ValueRef, InterruptHandle, Row}; use serde::{Deserialize, Serialize}; @@ -100,10 +100,8 @@ pub struct SQLite3 { pub database_label: String, } -lazy_static! { - static ref NON_READONLY_SQL_PATTERN: regex::Regex = - regex::Regex::new(r"(?i)^\s*(INSERT|DELETE|UPDATE|CREATE|DROP|ALTER\s+TABLE)\b").unwrap(); -} +static NON_READONLY_SQL_PATTERN: Lazy = + Lazy::new(|| regex::Regex::new(r"(?i)^\s*(INSERT|DELETE|UPDATE|CREATE|DROP|ALTER\s+TABLE)\b").unwrap()); #[derive(ts_rs::TS, Debug, Clone, PartialEq, Serialize, Deserialize)] #[ts(export)]