Move away from inodes as direct db reference
This commit is contained in:
parent
f80f4d12a2
commit
e16d67e2f8
4 changed files with 375 additions and 154 deletions
|
|
@ -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":
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue