2929from argparse import ArgumentParser
3030from collections import defaultdict
3131from time import time
32+ from typing import cast
3233
3334import trio
3435
3536import pyfuse3
36- from pyfuse3 import FUSEError
37+ from pyfuse3 import FileHandleT , FileInfo , FUSEError , InodeT
3738
3839try :
3940 import faulthandler
@@ -124,9 +125,9 @@ def get_row(self, *a, **kw):
124125 return row
125126
126127 async def lookup (self , parent_inode , name , ctx = None ):
127- if name == '.' :
128+ if name == b '.' :
128129 inode = parent_inode
129- elif name == '..' :
130+ elif name == b '..' :
130131 inode = self .get_row ("SELECT * FROM contents WHERE inode=?" ,
131132 (parent_inode ,))['parent_inode' ]
132133 else :
@@ -136,7 +137,7 @@ async def lookup(self, parent_inode, name, ctx=None):
136137 except NoSuchRowError :
137138 raise (pyfuse3 .FUSEError (errno .ENOENT ))
138139
139- return await self .getattr (inode , ctx )
140+ return await self .getattr (InodeT ( inode ) , ctx )
140141
141142
142143 async def getattr (self , inode , ctx = None ):
@@ -170,19 +171,22 @@ async def readlink(self, inode, ctx):
170171 return self .get_row ('SELECT * FROM inodes WHERE id=?' , (inode ,))['target' ]
171172
172173 async def opendir (self , inode , ctx ):
173- return inode
174+ # For simplicity, we use the inode as file handle
175+ return FileHandleT (inode )
174176
175177 async def readdir (self , fh , start_id , token ):
176178 if start_id == 0 :
177- start_id = - 1
179+ off = - 1
180+ else :
181+ off = start_id
178182
179183 cursor2 = self .db .cursor ()
180184 cursor2 .execute ("SELECT * FROM contents WHERE parent_inode=? "
181- 'AND rowid > ? ORDER BY rowid' , (fh , start_id ))
185+ 'AND rowid > ? ORDER BY rowid' , (fh , off ))
182186
183187 for row in cursor2 :
184188 pyfuse3 .readdir_reply (
185- token , row ['name' ], await self .getattr (row ['inode' ]), row ['rowid' ])
189+ token , row ['name' ], await self .getattr (InodeT ( row ['inode' ]) ), row ['rowid' ])
186190
187191 async def unlink (self , parent_inode , name , ctx ):
188192 entry = await self .lookup (parent_inode , name )
@@ -224,16 +228,14 @@ async def rename(self, parent_inode_old, name_old, parent_inode_new, name_new,
224228
225229 entry_old = await self .lookup (parent_inode_old , name_old )
226230
231+ entry_new = None
227232 try :
228- entry_new = await self .lookup (parent_inode_new , name_new )
233+ entry_new = await self .lookup (parent_inode_new , name_new if isinstance ( name_new , bytes ) else name_new . encode () )
229234 except pyfuse3 .FUSEError as exc :
230235 if exc .errno != errno .ENOENT :
231236 raise
232- target_exists = False
233- else :
234- target_exists = True
235237
236- if target_exists :
238+ if entry_new is not None :
237239 self ._replace (parent_inode_old , name_old , parent_inode_new , name_new ,
238240 entry_old , entry_new )
239241 else :
@@ -335,12 +337,10 @@ async def statfs(self, ctx):
335337 return stat_
336338
337339 async def open (self , inode , flags , ctx ):
338- # Yeah, unused arguments
339- #pylint: disable=W0613
340340 self .inode_open_count [inode ] += 1
341341
342- # Use inodes as a file handles
343- return pyfuse3 . FileInfo (fh = inode )
342+ # For simplicity, we use the inode as file handle
343+ return FileInfo (fh = FileHandleT ( inode ) )
344344
345345 async def access (self , inode , mode , ctx ):
346346 # Yeah, could be a function and has unused arguments
@@ -351,7 +351,8 @@ async def create(self, parent_inode, name, mode, flags, ctx):
351351 #pylint: disable=W0612
352352 entry = await self ._create (parent_inode , name , mode , ctx )
353353 self .inode_open_count [entry .st_ino ] += 1
354- return (pyfuse3 .FileInfo (fh = entry .st_ino ), entry )
354+ # For simplicity, we use the inode as file handle
355+ return (FileInfo (fh = FileHandleT (entry .st_ino )), entry )
355356
356357 async def _create (self , parent_inode , name , mode , ctx , rdev = 0 , target = None ):
357358 if (await self .getattr (parent_inode )).st_nlink == 0 :
@@ -364,7 +365,7 @@ async def _create(self, parent_inode, name, mode, ctx, rdev=0, target=None):
364365 'ctime_ns, target, rdev) VALUES(?, ?, ?, ?, ?, ?, ?, ?)' ,
365366 (ctx .uid , ctx .gid , mode , now_ns , now_ns , now_ns , target , rdev ))
366367
367- inode = self .cursor .lastrowid
368+ inode = cast ( InodeT , self .cursor .lastrowid )
368369 self .db .execute ("INSERT INTO contents(name, inode, parent_inode) VALUES(?,?,?)" ,
369370 (name , inode , parent_inode ))
370371 return await self .getattr (inode )
@@ -386,12 +387,13 @@ async def write(self, fh, off, buf):
386387 return len (buf )
387388
388389 async def release (self , fh ):
389- self .inode_open_count [fh ] -= 1
390+ inode = cast (InodeT , fh )
391+ self .inode_open_count [inode ] -= 1
390392
391- if self .inode_open_count [fh ] == 0 :
392- del self .inode_open_count [fh ]
393- if (await self .getattr (fh )).st_nlink == 0 :
394- self .cursor .execute ("DELETE FROM inodes WHERE id=?" , (fh ,))
393+ if self .inode_open_count [inode ] == 0 :
394+ del self .inode_open_count [inode ]
395+ if (await self .getattr (inode )).st_nlink == 0 :
396+ self .cursor .execute ("DELETE FROM inodes WHERE id=?" , (inode ,))
395397
396398class NoUniqueValueError (Exception ):
397399 def __str__ (self ):
0 commit comments