Add fs implementation and add to trove
This commit is contained in:
parent
2cfe32b333
commit
f80f4d12a2
5 changed files with 308 additions and 8 deletions
|
|
@ -17,8 +17,9 @@ from .trove import NODE_ROOT_ID, Note, Trove, TreeNote, BlobNote
|
|||
class NoteImpl(Note):
|
||||
"""Concrete not implementation"""
|
||||
|
||||
def __init__(self, db: Sqlite3Trove, object_id: int):
|
||||
self._db = db
|
||||
def __init__(self, parent: 'TroveImpl', object_id: int):
|
||||
self._parent = parent
|
||||
self._db = parent.db
|
||||
self._object_id = object_id
|
||||
|
||||
# Note protocol
|
||||
|
|
@ -73,12 +74,25 @@ class TreeNoteImpl(NoteImpl, TreeNote):
|
|||
|
||||
# Create the new node
|
||||
new_id = self._db.write_tree(TreeData().serialize())
|
||||
tree = TreeNoteImpl(self._db, new_id)
|
||||
tree = TreeNoteImpl(self._parent, new_id)
|
||||
|
||||
# Update our node
|
||||
self.link(name, tree)
|
||||
return tree
|
||||
|
||||
def rmdir(self, name: str) -> None:
|
||||
"""Remove a directory from the tree."""
|
||||
self.unlink(name)
|
||||
|
||||
def child(self, name: str) -> Note:
|
||||
"""Retrieve a child note by name."""
|
||||
tree = self._read_tree()
|
||||
entries = tree.list()
|
||||
if name not in entries:
|
||||
raise KeyError(f"Entry '{name}' not found")
|
||||
child_id = entries[name]
|
||||
return self._parent.get_raw_note(child_id)
|
||||
|
||||
def list(self) -> dict[str, int]:
|
||||
"""Return all entries as {name: object_id}."""
|
||||
return self._read_tree().list()
|
||||
|
|
@ -110,6 +124,10 @@ class TroveImpl:
|
|||
db._con.commit()
|
||||
return trove
|
||||
|
||||
@property
|
||||
def db(self) -> Sqlite3Trove:
|
||||
return self._db
|
||||
|
||||
def close(self) -> None:
|
||||
self._db.close()
|
||||
|
||||
|
|
@ -126,19 +144,19 @@ class TroveImpl:
|
|||
if ot is None:
|
||||
return None
|
||||
if ot == "blob":
|
||||
return BlobNoteImpl(self._db, note_id)
|
||||
return BlobNoteImpl(self, note_id)
|
||||
if ot == "tree":
|
||||
return TreeNoteImpl(self._db, note_id)
|
||||
return TreeNoteImpl(self, note_id)
|
||||
raise ValueError(f"Unknown object type '{ot}' for id {note_id}")
|
||||
|
||||
def create_blob(self, data: bytes | None = None) -> BlobNote:
|
||||
"""Create a new blob object and return a BlobNote for it."""
|
||||
obj_id = self._db.write_blob(data or b"")
|
||||
return BlobNoteImpl(self._db, obj_id)
|
||||
return BlobNoteImpl(self, obj_id)
|
||||
|
||||
def get_root(self) -> TreeNote:
|
||||
"""Return the root TreeNote (always id=NODE_ROOT_ID)."""
|
||||
return TreeNoteImpl(self._db, NODE_ROOT_ID)
|
||||
return TreeNoteImpl(self, NODE_ROOT_ID)
|
||||
|
||||
def open_trove(path: str | Path, create: bool = False) -> Trove:
|
||||
return TroveImpl.open(path, create=create)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue