Improve Table related code

This commit is contained in:
Mike Dilger 2024-08-22 08:18:30 +12:00
parent a441c8182d
commit 3a1666bf36
4 changed files with 29 additions and 31 deletions

View File

@ -47,8 +47,4 @@ impl Table for Person3Table {
}
}
}
fn newable() -> bool {
true
}
}

View File

@ -12,11 +12,6 @@ pub trait Table {
/// Get the heed database
fn db() -> Result<Database<Bytes, Bytes>, Error>;
/// Whether or not 'new' is implemented
/// (some tables can't do 'new', such as Event, and any calls that need it
/// will return an error)
fn newable() -> bool;
/// Number of records
#[allow(dead_code)]
fn num_records() -> Result<u64, Error> {
@ -53,14 +48,13 @@ pub trait Table {
key: <Self::Item as Record>::Key,
wtxn: Option<&mut RwTxn<'_>>,
) -> Result<(), Error> {
if !Self::newable() {
return Err(ErrorKind::RecordIsNotNewable.into());
}
let keybytes = key.to_bytes()?;
let f = |txn: &mut RwTxn<'_>| -> Result<(), Error> {
if Self::db()?.get(txn, &keybytes)?.is_none() {
let mut record = <Self::Item as Record>::new(key);
let mut record = match <Self::Item as Record>::new(key) {
Some(r) => r,
None => return Err(ErrorKind::RecordIsNotNewable.into()),
};
record.stabilize();
let valbytes = record.to_bytes()?;
Self::db()?.put(txn, &keybytes, &valbytes)?;
@ -131,16 +125,15 @@ pub trait Table {
key: <Self::Item as Record>::Key,
wtxn: Option<&mut RwTxn<'_>>,
) -> Result<Self::Item, Error> {
if !Self::newable() {
return Err(ErrorKind::RecordIsNotNewable.into());
}
let keybytes = key.to_bytes()?;
let f = |txn: &mut RwTxn<'_>| -> Result<Self::Item, Error> {
let valbytes = Self::db()?.get(txn, &keybytes)?;
Ok(match valbytes {
None => {
let mut record = <Self::Item as Record>::new(key);
let mut record = match <Self::Item as Record>::new(key) {
Some(r) => r,
None => return Err(ErrorKind::RecordIsNotNewable.into()),
};
record.stabilize();
let valbytes = record.to_bytes()?;
Self::db()?.put(txn, &keybytes, &valbytes)?;
@ -235,16 +228,15 @@ pub trait Table {
where
M: FnMut(&mut Self::Item),
{
if !Self::newable() {
return Err(ErrorKind::RecordIsNotNewable.into());
}
let mut f = |txn: &mut RwTxn<'_>| -> Result<(), Error> {
let f = |txn: &mut RwTxn<'_>| -> Result<(), Error> {
let keybytes = key.to_bytes()?;
let valbytes = Self::db()?.get(txn, &keybytes)?;
let mut record = match valbytes {
Some(valbytes) => Self::Item::from_bytes(valbytes)?,
None => Self::Item::new(key),
None => match Self::Item::new(key) {
Some(r) => r,
None => return Err(ErrorKind::RecordIsNotNewable.into()),
},
};
modify(&mut record);
record.stabilize();

View File

@ -74,11 +74,21 @@ impl ByteRep for PublicKey {
}
}
pub trait Record: ByteRep {
type Key: Copy + ByteRep;
impl ByteRep for String {
fn to_bytes(&self) -> Result<Vec<u8>, Error> {
Ok(self.as_bytes().to_vec())
}
/// Create a new record
fn new(k: Self::Key) -> Self;
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
Ok(String::from_utf8(bytes.to_owned())?)
}
}
pub trait Record: ByteRep {
type Key: ByteRep;
/// Create a new default record, if possible
fn new(k: Self::Key) -> Option<Self>;
/// Get the key of a record
fn key(&self) -> Self::Key;

View File

@ -210,8 +210,8 @@ impl Record for Person3 {
type Key = PublicKey;
/// Create a new record
fn new(k: Self::Key) -> Self {
Person3::new(k)
fn new(k: Self::Key) -> Option<Self> {
Some(Person3::new(k))
}
/// Get the key of a record