| 185 | } |
| 186 | |
| 187 | fn del_embeddings(&mut self, path: &str) -> PristineResult<usize> { |
| 188 | // First collect all keys for this path |
| 189 | let keys_to_delete: Vec<String> = { |
| 190 | let table = match self.txn.open_table(EMBEDDINGS) { |
| 191 | Ok(table) => table, |
| 192 | Err(redb::TableError::TableDoesNotExist(_)) => return Ok(0), |
| 193 | Err(e) => return Err(PristineError::from(e)), |
| 194 | }; |
| 195 | |
| 196 | let prefix = format!("{}\0", path); |
| 197 | let mut keys = Vec::new(); |
| 198 | |
| 199 | let iter = table.range::<&str>(prefix.as_str()..)?; |
| 200 | for item in iter { |
| 201 | let (key_guard, _value_guard) = item?; |
| 202 | let key_str = key_guard.value(); |
| 203 | |
| 204 | if !key_str.starts_with(&prefix) { |
| 205 | break; |
| 206 | } |
| 207 | |
| 208 | keys.push(key_str.to_string()); |
| 209 | } |
| 210 | |
| 211 | keys |
| 212 | }; |
| 213 | |
| 214 | let count = keys_to_delete.len(); |
| 215 | |
| 216 | // Now delete each key |
| 217 | if count > 0 { |
| 218 | let mut table = self.txn.open_table(EMBEDDINGS)?; |
| 219 | for key in &keys_to_delete { |
| 220 | table.remove(key.as_str())?; |
| 221 | } |
| 222 | } |
| 223 | |
| 224 | Ok(count) |
| 225 | } |
| 226 | |
| 227 | fn init_embeddings(&mut self) -> PristineResult<()> { |
| 228 | // Opening the table with a WriteTransaction creates it if it doesn't exist |