nostrdb-rs

nostrdb in rust!
git clone git://jb55.com/nostrdb-rs
Log | Files | Refs | Submodules | README | LICENSE

commit b107250c6e8a2e5eef501b48680d0035b2ff0c81
parent 608a7ad871f05fa5bb009c164c11ff33223debe5
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 19 Apr 2024 21:21:05 -0700

profile: support owned profiles

this is kind of weird but makes sense if you want to use test data
from raw bytes

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Msrc/ndb.rs | 2+-
Msrc/profile.rs | 38+++++++++++++++++++++++++++++---------
2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/src/ndb.rs b/src/ndb.rs @@ -201,7 +201,7 @@ impl Ndb { } // Convert the raw pointer to a Note instance - Ok(ProfileRecord::new( + Ok(ProfileRecord::new_transactional( profile_record_ptr, len, primkey, diff --git a/src/profile.rs b/src/profile.rs @@ -1,14 +1,34 @@ -use crate::ndb_profile::{root_as_ndb_profile_record_unchecked, NdbProfileRecord}; -use crate::Transaction; +use crate::ndb_profile::{ + root_as_ndb_profile_record, root_as_ndb_profile_record_unchecked, NdbProfileRecord, +}; +use crate::{Error, Result, Transaction}; -pub struct ProfileRecord<'a> { - pub record: NdbProfileRecord<'a>, - pub primary_key: u64, - pub transaction: &'a Transaction, +pub enum ProfileRecord<'a> { + Transactional { + record: NdbProfileRecord<'a>, + primary_key: u64, + transaction: &'a Transaction, + }, + + Owned { + record: NdbProfileRecord<'a>, + }, } impl<'a> ProfileRecord<'a> { - pub(crate) fn new( + pub fn record(&self) -> NdbProfileRecord<'a> { + match self { + ProfileRecord::Transactional { record, .. } => *record, + ProfileRecord::Owned { record } => *record, + } + } + + pub fn new_owned(root: &'a [u8]) -> Result<ProfileRecord<'a>> { + let record = root_as_ndb_profile_record(root).map_err(|_| Error::DecodeError)?; + Ok(ProfileRecord::Owned { record }) + } + + pub(crate) fn new_transactional( ptr: *mut ::std::os::raw::c_void, len: usize, primary_key: u64, @@ -18,7 +38,7 @@ impl<'a> ProfileRecord<'a> { let bytes = std::slice::from_raw_parts(ptr as *const u8, len); root_as_ndb_profile_record_unchecked(bytes) }; - ProfileRecord { + ProfileRecord::Transactional { record, transaction, primary_key, @@ -57,7 +77,7 @@ mod tests { .get_profile_by_pubkey(&mut txn, &pk.try_into().expect("bytes")) .expect("profile record"); - let profile = pr.record.profile().unwrap(); + let profile = pr.record().profile().unwrap(); assert_eq!(Some("jb55"), profile.name()); }