Remove Tree type and adjust API to continue working
This commit is contained in:
parent
6470aee802
commit
b251614667
4 changed files with 38 additions and 126 deletions
|
|
@ -20,7 +20,7 @@ import pyfuse3
|
|||
import trio
|
||||
from pyfuse3 import InodeT, FileHandleT
|
||||
|
||||
from trovedb.trove import Trove, Note, Tree as TroveTree, TreeNote, ObjectId, TreeExists
|
||||
from trovedb.trove import Trove, Note, ObjectId, TreeExists
|
||||
|
||||
import trovedb.trove as tr
|
||||
|
||||
|
|
@ -50,8 +50,12 @@ class _TroveHandle:
|
|||
|
||||
class _TroveHandleTree(_TroveHandle):
|
||||
@property
|
||||
def tree(self) -> TreeNote:
|
||||
return cast(TreeNote, self.note)
|
||||
def tree(self) -> Note:
|
||||
return self.note
|
||||
|
||||
def _note_has_folder(note: Note) -> bool:
|
||||
"""Return TRUE if a note name should have an associated folder"""
|
||||
return note.has_children() or note.mime == "inode/directory"
|
||||
|
||||
|
||||
class TroveFuseOps(pyfuse3.Operations):
|
||||
|
|
@ -138,13 +142,11 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
|
||||
def _lookup_child(self, parent_inode: InodeT, name: bytes) -> Tuple[_TroveEntry, Note]:
|
||||
parent = self._get_inode_note(parent_inode)
|
||||
if not isinstance(parent, TreeNote):
|
||||
raise pyfuse3.FUSEError(errno.ENOTDIR)
|
||||
try:
|
||||
note = parent.child(name.decode())
|
||||
except (KeyError, tr.ErrorNotFound):
|
||||
except tr.ErrorWithErrno as e:
|
||||
logger.debug("lookup failed: %d -> %s", parent_inode, name.decode())
|
||||
raise pyfuse3.FUSEError(errno.ENOENT) from None
|
||||
raise pyfuse3.FUSEError(e.errno) from None
|
||||
ent = self._create_get_ent_from_note(note)
|
||||
return ent, note
|
||||
|
||||
|
|
@ -160,15 +162,18 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
# ------------------------------------------------------------------
|
||||
|
||||
def _open_handle(self, inode: InodeT) -> _TroveHandle:
|
||||
logger.debug("open_handle inode:%d", inode)
|
||||
note = self._get_inode_note(inode)
|
||||
|
||||
handle_id = FileHandleT(self._next_handle)
|
||||
self._next_handle += 1
|
||||
|
||||
handle: _TroveHandle
|
||||
if isinstance(note, TreeNote):
|
||||
if _note_has_folder(note):
|
||||
logger.debug("open_handle inode:%d is a folder", inode)
|
||||
handle = _TroveHandleTree(inode_id=inode, handle_id=handle_id, note=note)
|
||||
else:
|
||||
logger.debug("open_handle inode:%d is a file", inode)
|
||||
handle = _TroveHandle(inode_id=inode, handle_id=handle_id, note=note)
|
||||
|
||||
self._handles[handle_id] = handle
|
||||
|
|
@ -186,7 +191,9 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
# Determine basic information
|
||||
is_tree = True
|
||||
size = 0
|
||||
if not hasattr(note, 'mkdir'):
|
||||
|
||||
# FIXME: Properly support folder / content, right now it's either or
|
||||
if not _note_has_folder(note):
|
||||
size = len(note.read_content())
|
||||
is_tree = False
|
||||
|
||||
|
|
@ -265,6 +272,7 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
# ------------------------------------------------------------------
|
||||
|
||||
async def opendir(self, inode: InodeT, ctx) -> FileHandleT:
|
||||
logger.debug("opendir inode:%d", inode)
|
||||
handle = self._open_handle(inode)
|
||||
if not isinstance(handle, _TroveHandleTree):
|
||||
logger.debug("attempted opendir on %d not a tree", inode)
|
||||
|
|
@ -277,10 +285,7 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
logger.debug("readdir %d start_id %d", fh, start_id)
|
||||
handle = self._get_handle(fh)
|
||||
note = handle.note
|
||||
if not isinstance(note, TroveTree):
|
||||
logger.debug("attempted readdir on %d not a tree", fh)
|
||||
raise pyfuse3.FUSEError(errno.ENOTDIR)
|
||||
entries = list(note.entries()) # [(name, object_id), ...]
|
||||
entries = list(note.children()) # [(name, object_id), ...]
|
||||
|
||||
for idx, entry in enumerate(entries):
|
||||
if idx < start_id:
|
||||
|
|
@ -320,13 +325,10 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
async def rmdir(self, parent_inode: InodeT, name: bytes, ctx) -> None:
|
||||
logger.debug("rmdir inode:%d name:%s", parent_inode, name)
|
||||
parent = self._get_inode_note(parent_inode)
|
||||
if not isinstance(parent, TreeNote):
|
||||
raise pyfuse3.FUSEError(errno.ENOTDIR)
|
||||
try:
|
||||
parent.unlink(name.decode())
|
||||
except KeyError:
|
||||
raise pyfuse3.FUSEError(errno.ENOENT) from None
|
||||
|
||||
parent.rm_child(name.decode(), False)
|
||||
except tr.ErrorWithErrno as e:
|
||||
raise pyfuse3.FUSEError(e.errno) from None
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# File ops
|
||||
|
|
@ -334,9 +336,10 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
|
||||
async def open(self, inode: InodeT, flags, ctx) -> pyfuse3.FileInfo:
|
||||
handle = self._open_handle(inode)
|
||||
if isinstance(handle.note, TroveTree):
|
||||
self._close_handle(handle)
|
||||
raise pyfuse3.FUSEError(errno.EISDIR)
|
||||
# FIXME: Add support for inode tree and inode content
|
||||
# if isinstance(handle.note, TroveTree):
|
||||
# self._close_handle(handle)
|
||||
# raise pyfuse3.FUSEError(errno.EISDIR)
|
||||
return pyfuse3.FileInfo(fh=handle.handle_id)
|
||||
|
||||
async def create(self, parent_inode: InodeT, name: bytes, mode: int, flags, ctx) -> tuple:
|
||||
|
|
@ -392,14 +395,13 @@ class TroveFuseOps(pyfuse3.Operations):
|
|||
|
||||
# Grab the parents
|
||||
new_parent = self._get_inode_note(parent_inode_new)
|
||||
if not isinstance(new_parent, TroveTree):
|
||||
raise pyfuse3.FUSEError(errno.ENOTDIR)
|
||||
old_parent = self._get_inode_note(parent_inode_old)
|
||||
if not isinstance(old_parent, TroveTree):
|
||||
raise pyfuse3.FUSEError(errno.ENOTDIR)
|
||||
|
||||
# Move!
|
||||
self._trove.move(old_parent, name_old_str, new_parent, name_new_str, overwrite=True)
|
||||
try:
|
||||
self._trove.move(old_parent, name_old_str, new_parent, name_new_str, overwrite=True)
|
||||
except tr.ErrorWithErrno as e:
|
||||
raise pyfuse3.FUSEError(e.errno) from None
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Serve
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue