Move away from inodes as direct db reference

This commit is contained in:
Andrew Mulbrook 2026-03-21 12:08:54 -05:00
parent f80f4d12a2
commit e16d67e2f8
4 changed files with 375 additions and 154 deletions

View file

@ -11,7 +11,7 @@ from pathlib import Path
from .db import Sqlite3Trove
from .tree import Tree as TreeData
from .trove import NODE_ROOT_ID, Note, Trove, TreeNote, BlobNote
from .trove import NODE_ROOT_ID, Note, Trove, TreeNote, BlobNote, TreeEntry, NoteNotFound
class NoteImpl(Note):
@ -65,9 +65,12 @@ class TreeNoteImpl(NoteImpl, TreeNote):
def unlink(self, name: str) -> None:
"""Remove an entry by name. Raises KeyError if not found."""
tree = self._read_tree()
tree.rm_entry(name)
self._flush_tree(tree)
try:
tree = self._read_tree()
tree.rm_entry(name)
self._flush_tree(tree)
except KeyError:
pass
def mkdir(self, name: str) -> 'TreeNoteImpl':
"""Create a new empty tree, link it under name, and return it."""
@ -91,7 +94,16 @@ class TreeNoteImpl(NoteImpl, TreeNote):
if name not in entries:
raise KeyError(f"Entry '{name}' not found")
child_id = entries[name]
return self._parent.get_raw_note(child_id)
value = self._parent.get_raw_note(child_id)
if value is None:
raise KeyError(f"Entry '{name}' has no value")
return value
def entries(self):
"""Return all entries as an iterable of TreeEntry."""
tree = self._read_tree()
for name, object_id in tree.list().items():
yield TreeEntry(name, object_id)
def list(self) -> dict[str, int]:
"""Return all entries as {name: object_id}."""
@ -138,11 +150,11 @@ class TroveImpl:
self.close()
# Trove protocol
def get_raw_note(self, note_id: int) -> Optional[Note]:
def get_raw_note(self, note_id: int) -> Note:
"""Return a BlobNote or TreeNote for the given id, or None if not found."""
ot = self._db.get_object_type(note_id)
if ot is None:
return None
raise NoteNotFound(note_id)
if ot == "blob":
return BlobNoteImpl(self, note_id)
if ot == "tree":