summaryrefslogtreecommitdiff
path: root/ext/kv
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-05-23 15:35:16 +0100
committerGitHub <noreply@github.com>2024-05-23 16:35:16 +0200
commit0b8deca08b9257c41055b4f34ebdaf1459b2de89 (patch)
treea26602ffb9ee4ea88271722829252ba3b4b5c1eb /ext/kv
parentaeafb7b39ed6e0cb7601be53f63a5c6e0f2aa1a8 (diff)
chore: update denokv_* crates (#23949)
Co-authored-by: losfair <zhy20000919@hotmail.com>
Diffstat (limited to 'ext/kv')
-rw-r--r--ext/kv/lib.rs7
-rw-r--r--ext/kv/sqlite.rs54
2 files changed, 45 insertions, 16 deletions
diff --git a/ext/kv/lib.rs b/ext/kv/lib.rs
index 285614389..8a57d610d 100644
--- a/ext/kv/lib.rs
+++ b/ext/kv/lib.rs
@@ -534,7 +534,12 @@ fn mutation_from_v8(
let kind = match (value.1.as_str(), value.2) {
("set", Some(value)) => MutationKind::Set(value.try_into()?),
("delete", None) => MutationKind::Delete,
- ("sum", Some(value)) => MutationKind::Sum(value.try_into()?),
+ ("sum", Some(value)) => MutationKind::Sum {
+ value: value.try_into()?,
+ min_v8: vec![],
+ max_v8: vec![],
+ clamp: false,
+ },
("min", Some(value)) => MutationKind::Min(value.try_into()?),
("max", Some(value)) => MutationKind::Max(value.try_into()?),
("setSuffixVersionstampedKey", Some(value)) => {
diff --git a/ext/kv/sqlite.rs b/ext/kv/sqlite.rs
index d42f8988e..a8a7fbace 100644
--- a/ext/kv/sqlite.rs
+++ b/ext/kv/sqlite.rs
@@ -8,6 +8,7 @@ use std::marker::PhantomData;
use std::path::Path;
use std::path::PathBuf;
use std::rc::Rc;
+use std::sync::Arc;
use std::sync::Mutex;
use std::sync::OnceLock;
@@ -18,8 +19,8 @@ use deno_core::unsync::spawn_blocking;
use deno_core::OpState;
use deno_node::PathClean;
pub use denokv_sqlite::SqliteBackendError;
+use denokv_sqlite::SqliteConfig;
use denokv_sqlite::SqliteNotifier;
-use rand::RngCore;
use rand::SeedableRng;
use rusqlite::OpenFlags;
@@ -84,32 +85,40 @@ impl<P: SqliteDbHandlerPermissions> DatabaseHandler for SqliteDbHandler<P> {
let path = path.clone();
let default_storage_dir = self.default_storage_dir.clone();
- let (conn, notifier_key) = spawn_blocking(move || {
+ type ConnGen =
+ Arc<dyn Fn() -> rusqlite::Result<rusqlite::Connection> + Send + Sync>;
+ let (conn_gen, notifier_key): (ConnGen, _) = spawn_blocking(move || {
denokv_sqlite::sqlite_retry_loop(|| {
let (conn, notifier_key) = match (path.as_deref(), &default_storage_dir)
{
- (Some(":memory:"), _) | (None, None) => {
- (rusqlite::Connection::open_in_memory()?, None)
- }
+ (Some(":memory:"), _) | (None, None) => (
+ Arc::new(rusqlite::Connection::open_in_memory) as ConnGen,
+ None,
+ ),
(Some(path), _) => {
let flags =
OpenFlags::default().difference(OpenFlags::SQLITE_OPEN_URI);
let resolved_path = canonicalize_path(&PathBuf::from(path))
.map_err(anyhow::Error::from)?;
+ let path = path.to_string();
(
- rusqlite::Connection::open_with_flags(path, flags)?,
+ Arc::new(move || {
+ rusqlite::Connection::open_with_flags(&path, flags)
+ }) as ConnGen,
Some(resolved_path),
)
}
(None, Some(path)) => {
std::fs::create_dir_all(path).map_err(anyhow::Error::from)?;
let path = path.join("kv.sqlite3");
- (rusqlite::Connection::open(path.clone())?, Some(path))
+ let path2 = path.clone();
+ (
+ Arc::new(move || rusqlite::Connection::open(&path2)) as ConnGen,
+ Some(path),
+ )
}
};
- conn.pragma_update(None, "journal_mode", "wal")?;
-
Ok::<_, SqliteBackendError>((conn, notifier_key))
})
})
@@ -128,13 +137,28 @@ impl<P: SqliteDbHandlerPermissions> DatabaseHandler for SqliteDbHandler<P> {
SqliteNotifier::default()
};
- let versionstamp_rng: Box<dyn RngCore + Send> =
- match &self.versionstamp_rng_seed {
- Some(seed) => Box::new(rand::rngs::StdRng::seed_from_u64(*seed)),
- None => Box::new(rand::rngs::StdRng::from_entropy()),
- };
+ let versionstamp_rng_seed = self.versionstamp_rng_seed;
+
+ let config = SqliteConfig {
+ batch_timeout: None,
+ num_workers: 1,
+ };
- denokv_sqlite::Sqlite::new(conn, notifier, versionstamp_rng)
+ denokv_sqlite::Sqlite::new(
+ move || {
+ let conn = conn_gen()?;
+ conn.pragma_update(None, "journal_mode", "wal")?;
+ Ok((
+ conn,
+ match versionstamp_rng_seed {
+ Some(seed) => Box::new(rand::rngs::StdRng::seed_from_u64(seed)),
+ None => Box::new(rand::rngs::StdRng::from_entropy()),
+ },
+ ))
+ },
+ notifier,
+ config,
+ )
}
}