From 4bcae54aa95c913366de085aaa24aca28a2fa5d0 Mon Sep 17 00:00:00 2001 From: Joan Martinez Date: Sun, 21 Jul 2024 19:01:58 +0200 Subject: [PATCH 1/2] fix: use Arc to handle IO --- bindings/wasm/lib.rs | 3 ++- cli/main.rs | 12 +++++++----- core/btree.rs | 2 +- core/lib.rs | 5 +++-- core/pager.rs | 6 +++--- core/vdbe.rs | 4 ++-- core/where_clause.rs | 10 +++++----- perf/latency/limbo/Cargo.toml | 2 +- perf/latency/limbo/src/main.rs | 2 +- simulator/main.rs | 3 ++- sqlite3/src/lib.rs | 5 +++-- 11 files changed, 30 insertions(+), 24 deletions(-) diff --git a/bindings/wasm/lib.rs b/bindings/wasm/lib.rs index 447b869c5..ba56ccdc4 100644 --- a/bindings/wasm/lib.rs +++ b/bindings/wasm/lib.rs @@ -1,5 +1,6 @@ use anyhow::Result; use std::rc::Rc; +use std::sync::Arc; use wasm_bindgen::prelude::*; #[wasm_bindgen] @@ -11,7 +12,7 @@ pub struct Database { impl Database { #[wasm_bindgen(constructor)] pub fn new(_path: &str) -> Database { - let io = Rc::new(IO {}); + let io = Arc::new(IO {}); let page_source = limbo_core::PageSource::from_io(Rc::new(PageIO {})); let inner = limbo_core::Database::open(io, page_source).unwrap(); Database { _inner: inner } diff --git a/cli/main.rs b/cli/main.rs index 9816b43a6..936791b3c 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -5,7 +5,9 @@ use cli_table::{Cell, Table}; use limbo_core::{Database, RowResult, Value}; use opcodes_dictionary::OPCODE_DESCRIPTIONS; use rustyline::{error::ReadlineError, DefaultEditor}; -use std::{path::PathBuf, rc::Rc}; +use std::path::PathBuf; +use std::sync::Arc; + #[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)] enum OutputMode { @@ -35,7 +37,7 @@ fn main() -> anyhow::Result<()> { env_logger::init(); let opts = Opts::parse(); let path = opts.database.to_str().unwrap(); - let io = Rc::new(limbo_core::PlatformIO::new()?); + let io = Arc::new(limbo_core::PlatformIO::new()?); let db = Database::open_file(io.clone(), path)?; let conn = db.connect(); if let Some(sql) = opts.sql { @@ -108,7 +110,7 @@ Note: } fn handle_dot_command( - io: Rc, + io: Arc, conn: &limbo_core::Connection, line: &str, ) -> anyhow::Result<()> { @@ -153,7 +155,7 @@ fn handle_dot_command( } fn display_schema( - io: Rc, + io: Arc, conn: &limbo_core::Connection, table: Option<&str>, ) -> anyhow::Result<()> { @@ -208,7 +210,7 @@ fn display_schema( } fn query( - io: Rc, + io: Arc, conn: &limbo_core::Connection, sql: &str, output_mode: &OutputMode, diff --git a/core/btree.rs b/core/btree.rs index 37e9a8c21..49d313b8f 100644 --- a/core/btree.rs +++ b/core/btree.rs @@ -101,7 +101,7 @@ impl BTreeCursor { BTreeCell::TableLeafCell(TableLeafCell { _rowid, _payload, - first_overflow_page, + first_overflow_page: _, }) => { mem_page.advance(); let record = crate::sqlite3_ondisk::read_record(_payload)?; diff --git a/core/lib.rs b/core/lib.rs index 4049ab8f0..1a40b03c9 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -27,6 +27,7 @@ use schema::Schema; use sqlite3_ondisk::DatabaseHeader; use sqlite3_parser::{ast::Cmd, lexer::sql::Parser}; use std::{cell::RefCell, rc::Rc}; +use std::sync::Arc; #[cfg(feature = "fs")] pub use io::PlatformIO; @@ -42,13 +43,13 @@ pub struct Database { impl Database { #[cfg(feature = "fs")] - pub fn open_file(io: Rc, path: &str) -> Result { + pub fn open_file(io: Arc, path: &str) -> Result { let file = io.open_file(path)?; let storage = storage::PageSource::from_file(file); Self::open(io, storage) } - pub fn open(io: Rc, page_source: PageSource) -> Result { + pub fn open(io: Arc, page_source: PageSource) -> Result { let db_header = Pager::begin_open(&page_source)?; io.run_once()?; let pager = Rc::new(Pager::finish_open( diff --git a/core/pager.rs b/core/pager.rs index c2b29574b..95e2531b0 100644 --- a/core/pager.rs +++ b/core/pager.rs @@ -8,7 +8,7 @@ use std::cell::RefCell; use std::hash::Hash; use std::rc::Rc; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::RwLock; +use std::sync::{Arc, RwLock}; pub struct Page { flags: AtomicUsize, @@ -102,7 +102,7 @@ pub struct Pager { pub page_source: PageSource, page_cache: RefCell>>, buffer_pool: Rc, - pub io: Rc, + pub io: Arc, } impl Pager { @@ -113,7 +113,7 @@ impl Pager { pub fn finish_open( db_header: Rc>, page_source: PageSource, - io: Rc, + io: Arc, ) -> anyhow::Result { let db_header = db_header.borrow(); let page_size = db_header.page_size as usize; diff --git a/core/vdbe.rs b/core/vdbe.rs index 40d56aea5..986220be2 100644 --- a/core/vdbe.rs +++ b/core/vdbe.rs @@ -439,7 +439,7 @@ impl ProgramBuilder { Insn::If { reg: _reg, target_pc, - null_reg, + null_reg: _, } => { assert!(*target_pc < 0); *target_pc = to_offset; @@ -447,7 +447,7 @@ impl ProgramBuilder { Insn::IfNot { reg: _reg, target_pc, - null_reg, + null_reg: _, } => { assert!(*target_pc < 0); *target_pc = to_offset; diff --git a/core/where_clause.rs b/core/where_clause.rs index 225d83246..f6dabcb31 100644 --- a/core/where_clause.rs +++ b/core/where_clause.rs @@ -416,13 +416,13 @@ fn translate_condition_expr( } _ => todo!(), }, - ast::Expr::InList { lhs, not, rhs } => {} + ast::Expr::InList { lhs: _, not: _, rhs: _ } => {} ast::Expr::Like { lhs, not, op, rhs, - escape, + escape: _, } => { let cur_reg = program.alloc_register(); assert!(match rhs.as_ref() { @@ -494,10 +494,10 @@ fn introspect_expression_for_cursors( ast::Expr::Literal(_) => {} ast::Expr::Like { lhs, - not, - op, + not: _, + op: _, rhs, - escape, + escape: _, } => { cursors.extend(introspect_expression_for_cursors(program, select, lhs)?); cursors.extend(introspect_expression_for_cursors(program, select, rhs)?); diff --git a/perf/latency/limbo/Cargo.toml b/perf/latency/limbo/Cargo.toml index b11a40bfc..aab20e518 100644 --- a/perf/latency/limbo/Cargo.toml +++ b/perf/latency/limbo/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" clap = { version = "4.4.2", features = ["derive"] } env_logger = "0.11.0" hdrhistogram = "7.5.2" -limbo_core = { path = "../../../limbo/core" } +limbo_core = { path = "../../../core" } [profile.release] debug = true diff --git a/perf/latency/limbo/src/main.rs b/perf/latency/limbo/src/main.rs index 15c3b3bed..2a10eb1bc 100644 --- a/perf/latency/limbo/src/main.rs +++ b/perf/latency/limbo/src/main.rs @@ -34,7 +34,7 @@ fn main() { let mut rows = stmt.query().unwrap(); let mut count = 0; loop { - let row = rows.next().unwrap(); + let row = rows.next_row().unwrap(); match row { limbo_core::RowResult::Row(_) => { count += 1; diff --git a/simulator/main.rs b/simulator/main.rs index 11fccd67c..f31f4a83d 100644 --- a/simulator/main.rs +++ b/simulator/main.rs @@ -4,6 +4,7 @@ use rand::prelude::*; use rand_chacha::ChaCha8Rng; use std::cell::RefCell; use std::rc::Rc; +use std::sync::Arc; fn main() { let seed = match std::env::var("SEED") { @@ -12,7 +13,7 @@ fn main() { }; println!("Seed: {}", seed); let mut rng = ChaCha8Rng::seed_from_u64(seed); - let io = Rc::new(SimulatorIO::new().unwrap()); + let io = Arc::new(SimulatorIO::new().unwrap()); for _ in 0..100000 { let db = match Database::open_file(io.clone(), "./testing/testing.db") { Ok(db) => db, diff --git a/sqlite3/src/lib.rs b/sqlite3/src/lib.rs index aa0ee6d86..9de12a339 100644 --- a/sqlite3/src/lib.rs +++ b/sqlite3/src/lib.rs @@ -4,7 +4,8 @@ use log::trace; use std::cell::RefCell; use std::ffi; -use std::rc::Rc; + +use std::sync::Arc; macro_rules! stub { () => { @@ -103,7 +104,7 @@ pub unsafe extern "C" fn sqlite3_open( Err(_) => return SQLITE_MISUSE, }; let io = match limbo_core::PlatformIO::new() { - Ok(io) => Rc::new(io), + Ok(io) => Arc::new(io), Err(_) => return SQLITE_MISUSE, }; match limbo_core::Database::open_file(io, filename) { From 642603b6c747586e0eaabeb5f35cc0a077c1854d Mon Sep 17 00:00:00 2001 From: Joan Martinez Date: Sun, 21 Jul 2024 19:13:02 +0200 Subject: [PATCH 2/2] perf-latency: fix enabling to build multitenancy --- Cargo.toml | 1 + cli/main.rs | 1 - core/lib.rs | 2 +- core/where_clause.rs | 6 +- perf/latency/limbo/Cargo.lock | 286 +++++++++++++++++++++++++++++++-- perf/latency/limbo/src/main.rs | 5 +- sqlite3/src/lib.rs | 71 ++++---- sqlite3/src/util.rs | 4 +- 8 files changed, 324 insertions(+), 52 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 23c7fdff2..07a79e778 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ "core", "simulator", ] +exclude = ["perf/latency/limbo"] [workspace.package] version = "0.0.1" diff --git a/cli/main.rs b/cli/main.rs index 936791b3c..48bef70ea 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -8,7 +8,6 @@ use rustyline::{error::ReadlineError, DefaultEditor}; use std::path::PathBuf; use std::sync::Arc; - #[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)] enum OutputMode { Raw, diff --git a/core/lib.rs b/core/lib.rs index 1a40b03c9..17b4f315b 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -26,8 +26,8 @@ use pager::Pager; use schema::Schema; use sqlite3_ondisk::DatabaseHeader; use sqlite3_parser::{ast::Cmd, lexer::sql::Parser}; -use std::{cell::RefCell, rc::Rc}; use std::sync::Arc; +use std::{cell::RefCell, rc::Rc}; #[cfg(feature = "fs")] pub use io::PlatformIO; diff --git a/core/where_clause.rs b/core/where_clause.rs index f6dabcb31..254a9750f 100644 --- a/core/where_clause.rs +++ b/core/where_clause.rs @@ -416,7 +416,11 @@ fn translate_condition_expr( } _ => todo!(), }, - ast::Expr::InList { lhs: _, not: _, rhs: _ } => {} + ast::Expr::InList { + lhs: _, + not: _, + rhs: _, + } => {} ast::Expr::Like { lhs, not, diff --git a/perf/latency/limbo/Cargo.lock b/perf/latency/limbo/Cargo.lock index 25d3b77c5..cace5f7fb 100644 --- a/perf/latency/limbo/Cargo.lock +++ b/perf/latency/limbo/Cargo.lock @@ -119,6 +119,12 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "byteorder" version = "1.4.3" @@ -140,6 +146,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "cfg_block" version = "0.1.1" @@ -193,12 +205,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] -name = "concurrent_lru" -version = "0.2.0" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7feb5cb312f774e8a24540e27206db4e890f7d488563671d24a16389cf4c2e4e" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", "once_cell", + "tiny-keccak", ] [[package]] @@ -226,6 +258,21 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "env_filter" version = "0.1.0" @@ -255,6 +302,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -271,6 +328,19 @@ 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", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -297,6 +367,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "humantime" version = "2.1.0" @@ -324,10 +400,19 @@ dependencies = [ ] [[package]] -name = "libc" -version = "0.2.152" +name = "js-sys" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libmimalloc-sys" @@ -351,18 +436,32 @@ dependencies = [ [[package]] name = "limbo_core" -version = "0.0.0" +version = "0.0.1" dependencies = [ "anyhow", "cfg_block", - "concurrent_lru", "fallible-iterator", + "getrandom", "io-uring", + "libc", "log", "mimalloc", + "nix", + "ordered-multimap", + "polling", + "regex", + "rustix", + "sieve-cache", "sqlite3-parser", + "thiserror", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "log" version = "0.4.20" @@ -399,6 +498,18 @@ dependencies = [ "adler", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -424,6 +535,16 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown", +] + [[package]] name = "phf" version = "0.11.2" @@ -463,6 +584,27 @@ dependencies = [ "uncased", ] +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "proc-macro2" version = "1.0.78" @@ -498,9 +640,9 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "regex" -version = "1.10.3" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -525,6 +667,25 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "sieve-cache" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bf3a9dccf2c079bf1465d449a485c85b36443caf765f2f127bfec28b180f75" + [[package]] name = "siphasher" version = "0.3.11" @@ -573,6 +734,51 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + [[package]] name = "uncased" version = "0.9.10" @@ -600,6 +806,66 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/perf/latency/limbo/src/main.rs b/perf/latency/limbo/src/main.rs index 2a10eb1bc..ef26644f1 100644 --- a/perf/latency/limbo/src/main.rs +++ b/perf/latency/limbo/src/main.rs @@ -1,5 +1,6 @@ #![feature(coroutines)] #![feature(coroutine_trait)] +#![feature(stmt_expr_attributes)] use clap::Parser; use hdrhistogram::Histogram; @@ -15,7 +16,7 @@ struct Opts { } fn main() { - env_logger::init();; + env_logger::init(); let opts = Opts::parse(); let mut hist = Histogram::::new(2).unwrap().into_sync(); let io = Arc::new(PlatformIO::new().unwrap()); @@ -23,7 +24,7 @@ fn main() { for i in 0..opts.count { let mut recorder = hist.recorder(); let io = io.clone(); - let mut tenant = move || { + let tenant = #[coroutine] move || { let database = format!("database{}.db", i); let db = Database::open_file(io.clone(), &database).unwrap(); let conn = db.connect(); diff --git a/sqlite3/src/lib.rs b/sqlite3/src/lib.rs index 9de12a339..b9c01f62c 100644 --- a/sqlite3/src/lib.rs +++ b/sqlite3/src/lib.rs @@ -43,14 +43,14 @@ pub struct sqlite3 { impl sqlite3 { pub fn new(db: limbo_core::Database, conn: limbo_core::Connection) -> Self { - Self { - _db: db, - conn, + Self { + _db: db, + conn, err_code: SQLITE_OK, err_mask: 0xFFFFFFFFu32 as i32, malloc_failed: false, e_open_state: SQLITE_STATE_OPEN, - p_err: std::ptr::null_mut(), + p_err: std::ptr::null_mut(), } } } @@ -373,7 +373,7 @@ pub unsafe extern "C" fn sqlite3_errcode(_db: *mut sqlite3) -> ffi::c_int { if _db.is_null() || (*_db).malloc_failed { return SQLITE_NOMEM; } - + (*_db).err_code & (*_db).err_mask } @@ -833,7 +833,7 @@ pub unsafe extern "C" fn sqlite3_extended_errcode(_db: *mut sqlite3) -> ffi::c_i if _db.is_null() || (*_db).malloc_failed { return SQLITE_NOMEM; } - + (*_db).err_code & (*_db).err_mask } @@ -861,38 +861,38 @@ pub unsafe extern "C" fn sqlite3_libversion_number() -> ffi::c_int { fn sqlite3_errstr_impl(rc: i32) -> *const std::ffi::c_char { const ERROR_MESSAGES: [&str; 29] = [ - "not an error", // SQLITE_OK - "SQL logic error", // SQLITE_ERROR - "", // SQLITE_INTERNAL - "access permission denied", // SQLITE_PERM - "query aborted", // SQLITE_ABORT - "database is locked", // SQLITE_BUSY - "database table is locked", // SQLITE_LOCKED - "out of memory", // SQLITE_NOMEM + "not an error", // SQLITE_OK + "SQL logic error", // SQLITE_ERROR + "", // SQLITE_INTERNAL + "access permission denied", // SQLITE_PERM + "query aborted", // SQLITE_ABORT + "database is locked", // SQLITE_BUSY + "database table is locked", // SQLITE_LOCKED + "out of memory", // SQLITE_NOMEM "attempt to write a readonly database", // SQLITE_READONLY - "interrupted", // SQLITE_INTERRUPT - "disk I/O error", // SQLITE_IOERR - "database disk image is malformed", // SQLITE_CORRUPT - "unknown operation", // SQLITE_NOTFOUND - "database or disk is full", // SQLITE_FULL - "unable to open database file", // SQLITE_CANTOPEN - "locking protocol", // SQLITE_PROTOCOL - "", // SQLITE_EMPTY - "database schema has changed", // SQLITE_SCHEMA - "string or blob too big", // SQLITE_TOOBIG - "constraint failed", // SQLITE_CONSTRAINT - "datatype mismatch", // SQLITE_MISMATCH - "bad parameter or other API misuse", // SQLITE_MISUSE + "interrupted", // SQLITE_INTERRUPT + "disk I/O error", // SQLITE_IOERR + "database disk image is malformed", // SQLITE_CORRUPT + "unknown operation", // SQLITE_NOTFOUND + "database or disk is full", // SQLITE_FULL + "unable to open database file", // SQLITE_CANTOPEN + "locking protocol", // SQLITE_PROTOCOL + "", // SQLITE_EMPTY + "database schema has changed", // SQLITE_SCHEMA + "string or blob too big", // SQLITE_TOOBIG + "constraint failed", // SQLITE_CONSTRAINT + "datatype mismatch", // SQLITE_MISMATCH + "bad parameter or other API misuse", // SQLITE_MISUSE #[cfg(not(feature = "SQLITE_DISABLE_LFS"))] "", // SQLITE_NOLFS #[cfg(feature = "SQLITE_DISABLE_LFS")] "large file support is disabled", // SQLITE_NOLFS - "authorization denied", // SQLITE_AUTH - "", // SQLITE_FORMAT - "column index out of range", // SQLITE_RANGE - "file is not a database", // SQLITE_NOTADB - "notification message", // SQLITE_NOTICE - "warning message", // SQLITE_WARNING + "authorization denied", // SQLITE_AUTH + "", // SQLITE_FORMAT + "column index out of range", // SQLITE_RANGE + "file is not a database", // SQLITE_NOTADB + "notification message", // SQLITE_NOTICE + "warning message", // SQLITE_WARNING ]; const UNKNOWN_ERROR: &str = "unknown error"; @@ -906,7 +906,10 @@ fn sqlite3_errstr_impl(rc: i32) -> *const std::ffi::c_char { SQLITE_DONE => NO_MORE_ROWS_AVAILABLE.as_ptr() as *const std::ffi::c_char, _ => { let rc = rc & 0xff; - if rc >= 0 && rc < ERROR_MESSAGES.len() as i32 && !ERROR_MESSAGES[rc as usize].is_empty() { + if rc >= 0 + && rc < ERROR_MESSAGES.len() as i32 + && !ERROR_MESSAGES[rc as usize].is_empty() + { ERROR_MESSAGES[rc as usize].as_ptr() as *const std::ffi::c_char } else { UNKNOWN_ERROR.as_ptr() as *const std::ffi::c_char diff --git a/sqlite3/src/util.rs b/sqlite3/src/util.rs index c56d2fd20..810cee78a 100644 --- a/sqlite3/src/util.rs +++ b/sqlite3/src/util.rs @@ -2,9 +2,7 @@ use crate::sqlite3; pub fn sqlite3_safety_check_sick_or_ok(_db: &sqlite3) -> bool { match _db.e_open_state { - crate::SQLITE_STATE_SICK | crate::SQLITE_STATE_OPEN | crate::SQLITE_STATE_BUSY => { - true - } + crate::SQLITE_STATE_SICK | crate::SQLITE_STATE_OPEN | crate::SQLITE_STATE_BUSY => true, _ => { eprintln!("Invalid database state: {}", _db.e_open_state); false