Browse Source

updated to persy 1.0

merge-requests/107/merge^2
Tglman 4 years ago
parent
commit
37471a063f
  1. 29
      Cargo.lock
  2. 2
      Cargo.toml
  3. 36
      src/database/abstraction/persy.rs
  4. 14
      src/error.rs

29
Cargo.lock generated

@ -170,12 +170,6 @@ dependencies = [ @@ -170,12 +170,6 @@ dependencies = [
"generic-array",
]
[[package]]
name = "build_const"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7"
[[package]]
name = "bumpalo"
version = "3.7.0"
@ -342,13 +336,19 @@ dependencies = [ @@ -342,13 +336,19 @@ dependencies = [
[[package]]
name = "crc"
version = "1.8.1"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f"
dependencies = [
"build_const",
"crc-catalog",
]
[[package]]
name = "crc-catalog"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
[[package]]
name = "crc32fast"
version = "1.2.1"
@ -1644,16 +1644,17 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" @@ -1644,16 +1644,17 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]]
name = "persy"
version = "0.11.13"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc96c7b02a7abb1df713f326c4deb493ce2b72155935d3e6ed0ba24bd9e778d"
checksum = "de4cd9bda96e9bab3c961620ca512def7a7a880152780132632506abe4414458"
dependencies = [
"byteorder",
"crc",
"data-encoding",
"fs2",
"linked-hash-map",
"rand 0.7.3",
"rand 0.8.4",
"thiserror",
"unsigned-varint",
"zigzag",
]
@ -3279,9 +3280,9 @@ checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" @@ -3279,9 +3280,9 @@ checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
[[package]]
name = "unsigned-varint"
version = "0.5.1"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35"
checksum = "5f8d425fafb8cd76bc3f22aace4af471d3156301d7508f2107e98fbeae10bc7f"
[[package]]
name = "untrusted"

2
Cargo.toml

@ -28,7 +28,7 @@ tokio = "1.8.2" @@ -28,7 +28,7 @@ tokio = "1.8.2"
# Used for storing data permanently
sled = { version = "0.34.6", features = ["compression", "no_metrics"], optional = true }
#sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] }
persy = { version = "0.11", optional = true }
persy = { version = "1.0", optional = true }
# Used by the persy write cache for background flush
timer = "0.2"
chrono = "0.4"

36
src/database/abstraction/persy.rs

@ -56,7 +56,7 @@ impl DatabaseEngine for PersyEngine { @@ -56,7 +56,7 @@ impl DatabaseEngine for PersyEngine {
// Create if it doesn't exist
if !self.persy.exists_index(name)? {
let mut tx = self.persy.begin()?;
tx.create_index::<ByteVec, ByteVec>(name, ValueMode::REPLACE)?;
tx.create_index::<ByteVec, ByteVec>(name, ValueMode::Replace)?;
tx.prepare()?.commit()?;
}
@ -187,15 +187,15 @@ impl WriteCache { @@ -187,15 +187,15 @@ impl WriteCache {
for (key, value) in changes {
tx.put::<ByteVec, ByteVec>(
&index,
ByteVec(key.to_owned()),
ByteVec(value.to_owned()),
ByteVec::new(key.to_owned()),
ByteVec::new(value.to_owned()),
)?;
}
}
self.add_cache.clear();
for (index, changes) in &self.remove_cache {
for key in changes {
tx.remove::<ByteVec, ByteVec>(&index, ByteVec(key.to_owned()), None)?;
tx.remove::<ByteVec, ByteVec>(&index, ByteVec::new(key.to_owned()), None)?;
}
}
self.remove_cache.clear();
@ -356,9 +356,9 @@ impl Tree for PersyTree { @@ -356,9 +356,9 @@ impl Tree for PersyTree {
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
let result = self
.persy
.get::<ByteVec, ByteVec>(&self.name, &ByteVec(key.to_vec()))?
.map(|v| v.into_iter().map(|bv| bv.0).next())
.flatten();
.get::<ByteVec, ByteVec>(&self.name, &ByteVec::new(key.to_vec()))?
.next()
.map(|v| (*v).to_owned());
let result = self
.write_cache
.read()
@ -396,7 +396,6 @@ impl Tree for PersyTree { @@ -396,7 +396,6 @@ impl Tree for PersyTree {
Ok(())
}
#[tracing::instrument(skip(self, iter))]
fn insert_batch<'a>(&self, iter: &mut dyn Iterator<Item = (Vec<u8>, Vec<u8>)>) -> Result<()> {
//TODO: evaluate if use instead a single big transaction
for (key, value) in iter {
@ -406,6 +405,13 @@ impl Tree for PersyTree { @@ -406,6 +405,13 @@ impl Tree for PersyTree {
Ok(())
}
fn increment_batch<'a>(&self, iter: &mut dyn Iterator<Item = Vec<u8>>) -> Result<()> {
for key in iter {
self.increment(&key)?;
}
Ok(())
}
fn remove(&self, key: &[u8]) -> Result<()> {
self.write_cache
.write()
@ -420,7 +426,7 @@ impl Tree for PersyTree { @@ -420,7 +426,7 @@ impl Tree for PersyTree {
Ok(iter) => {
let result = Box::new(iter.filter_map(|(k, v)| {
v.into_iter()
.map(|val| (k.0.to_owned().into(), val.0.to_owned().into()))
.map(|val| ((*k).to_owned().into(), (*val).to_owned().into()))
.next()
}));
@ -440,16 +446,16 @@ impl Tree for PersyTree { @@ -440,16 +446,16 @@ impl Tree for PersyTree {
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
let range = if backwards {
self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ..ByteVec(from.to_owned()))
.range::<ByteVec, ByteVec, _>(&self.name, ..ByteVec::new(from.to_owned()))
} else {
self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ByteVec(from.to_owned())..)
.range::<ByteVec, ByteVec, _>(&self.name, ByteVec::new(from.to_owned())..)
};
match range {
Ok(iter) => {
let map = iter.filter_map(|(k, v)| {
v.into_iter()
.map(|val| (k.0.to_owned().into(), val.0.to_owned().into()))
.map(|val| ((*k).to_owned().into(), (*val).to_owned().into()))
.next()
});
let result: Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send + 'a> = if backwards
@ -482,7 +488,7 @@ impl Tree for PersyTree { @@ -482,7 +488,7 @@ impl Tree for PersyTree {
&'a self,
prefix: Vec<u8>,
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
let range_prefix = ByteVec(prefix.to_owned());
let range_prefix = ByteVec::new(prefix.to_owned());
let range = self
.persy
.range::<ByteVec, ByteVec, _>(&self.name, range_prefix..);
@ -491,10 +497,10 @@ impl Tree for PersyTree { @@ -491,10 +497,10 @@ impl Tree for PersyTree {
Ok(iter) => {
let owned_prefix = prefix.clone();
let result = Box::new(
iter.take_while(move |(k, _)| k.0.starts_with(&owned_prefix))
iter.take_while(move |(k, _)| (*k).starts_with(&owned_prefix))
.filter_map(|(k, v)| {
v.into_iter()
.map(|val| (k.0.to_owned().into(), val.0.to_owned().into()))
.map(|val| ((*k).to_owned().into(), (*val).to_owned().into()))
.next()
}),
);

14
src/error.rs

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
use persy::PersyError;
use ruma::{
api::client::{
error::{Error as RumaError, ErrorKind},
@ -38,10 +39,7 @@ pub enum Error { @@ -38,10 +39,7 @@ pub enum Error {
},
#[cfg(feature = "persy")]
#[error("There was a problem with the connection to the persy database.")]
PersyError {
#[from]
source: persy::PersyError,
},
PersyError { source: persy::PersyError },
#[cfg(feature = "heed")]
#[error("There was a problem with the connection to the heed database: {error}")]
HeedError { error: String },
@ -142,3 +140,11 @@ where @@ -142,3 +140,11 @@ where
self.to_response().respond_to(r)
}
}
impl<T: Into<PersyError>> From<persy::PE<T>> for Error {
fn from(err: persy::PE<T>) -> Self {
Error::PersyError {
source: err.error().into(),
}
}
}

Loading…
Cancel
Save