diff options
Diffstat (limited to 'database/src/table.rs')
| -rw-r--r-- | database/src/table.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/database/src/table.rs b/database/src/table.rs index 1680016..27db06e 100644 --- a/database/src/table.rs +++ b/database/src/table.rs @@ -6,9 +6,10 @@ use crate::{ backends::{ReadTransaction, WriteTransaction}, + query::Query, sort::Index, }; -use anyhow::Result; +use anyhow::{Result, anyhow}; use jellyobject::ObjectBuffer; pub type TableNum = u64; @@ -68,4 +69,35 @@ impl Table { db.del(&self.key(row))?; Ok(true) } + pub fn update( + &self, + db: &mut dyn WriteTransaction, + row: RowNum, + entry: ObjectBuffer, + ) -> Result<()> { + let before = self.get(db, row)?.ok_or(anyhow!("row to update missing"))?; + let before = before.as_object(); + let after = entry.as_object(); + + db.set(&self.key(row), bytemuck::cast_slice(entry.0.as_slice()))?; + + for idx in &self.indices { + if !idx.compare(before, after) { + idx.remove(db, row, before)?; + idx.add(db, row, after)?; + } + } + + Ok(()) + } + pub fn query( + &self, + db: &dyn ReadTransaction, + query: Query, + ) -> Box<dyn Iterator<Item = RowNum>> { + todo!() + } + pub fn query_single(&self, db: &dyn ReadTransaction, query: Query) -> Option<RowNum> { + self.query(db, query).next() + } } |