parent
3aaaf39913
commit
4c1d1cd6d0
|
@ -2,12 +2,22 @@ use crate::error::{GeoffreyDBError, Result};
|
||||||
use crate::migration::do_migration;
|
use crate::migration::do_migration;
|
||||||
use geoffrey_models::models::db_metadata::DBMetadata;
|
use geoffrey_models::models::db_metadata::DBMetadata;
|
||||||
use geoffrey_models::GeoffreyDatabaseModel;
|
use geoffrey_models::GeoffreyDatabaseModel;
|
||||||
|
use sled::IVec;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
const DB_VERSION: u64 = 3;
|
const DB_VERSION: u64 = 3;
|
||||||
const DB_METADATA_ID: u64 = 1;
|
const DB_METADATA_ID: u64 = 1;
|
||||||
|
|
||||||
|
fn option_bytes_to_model<T: GeoffreyDatabaseModel>(bytes: Option<IVec>, id: u64) -> Result<T> {
|
||||||
|
if let Some(bytes) = bytes {
|
||||||
|
Ok(T::try_from_bytes(&bytes)?)
|
||||||
|
} else {
|
||||||
|
log::debug!("{} of id {} was not found in the database", T::tree(), id);
|
||||||
|
Err(GeoffreyDBError::NotFound)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Database {
|
pub struct Database {
|
||||||
pub(crate) db: sled::Db,
|
pub(crate) db: sled::Db,
|
||||||
}
|
}
|
||||||
|
@ -66,14 +76,7 @@ impl Database {
|
||||||
T: GeoffreyDatabaseModel,
|
T: GeoffreyDatabaseModel,
|
||||||
{
|
{
|
||||||
let tree = self.get_tree::<T>()?;
|
let tree = self.get_tree::<T>()?;
|
||||||
let id_bytes = id.to_be_bytes();
|
option_bytes_to_model(tree.get(id.to_be_bytes())?, id)
|
||||||
|
|
||||||
if let Some(bytes) = tree.get(id_bytes)? {
|
|
||||||
Ok(T::try_from_bytes(&bytes)?)
|
|
||||||
} else {
|
|
||||||
log::debug!("{} of id {} was not found in the database", T::tree(), id);
|
|
||||||
Err(GeoffreyDBError::NotFound)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear_tree<T>(&self) -> Result<()>
|
pub fn clear_tree<T>(&self) -> Result<()>
|
||||||
|
@ -110,6 +113,14 @@ impl Database {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn remove<T>(&self, id: u64) -> Result<T>
|
||||||
|
where
|
||||||
|
T: GeoffreyDatabaseModel,
|
||||||
|
{
|
||||||
|
let tree = self.db.open_tree(T::tree())?;
|
||||||
|
option_bytes_to_model(tree.remove(id.to_be_bytes())?, id)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn tree_iter<T>(&self) -> Result<sled::Iter>
|
pub fn tree_iter<T>(&self) -> Result<sled::Iter>
|
||||||
where
|
where
|
||||||
T: GeoffreyDatabaseModel,
|
T: GeoffreyDatabaseModel,
|
||||||
|
@ -228,6 +239,21 @@ mod tests {
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_remove() {
|
||||||
|
let _lock = LOCK.lock().unwrap();
|
||||||
|
cleanup();
|
||||||
|
let player = Player::new("CoolZero123", UserID::DiscordUUID { discord_uuid: 0u64 });
|
||||||
|
|
||||||
|
let p2 = DB.insert::<Player>(player.clone()).unwrap();
|
||||||
|
|
||||||
|
let p3 = DB.remove::<Player>(p2.id.unwrap()).unwrap();
|
||||||
|
|
||||||
|
assert!(DB.get::<Player>(p3.id.unwrap()).is_err());
|
||||||
|
assert_eq!(p3.id.unwrap(), p2.id.unwrap());
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_insert_speed() {
|
fn test_insert_speed() {
|
||||||
let _lock = LOCK.lock().unwrap();
|
let _lock = LOCK.lock().unwrap();
|
||||||
|
|
Loading…
Reference in New Issue