try:
from allmydata.frontends import drop_upload
- s = drop_upload.DropUploader(self, upload_dircap, local_dir)
+ dbfile = os.path.join(self.basedir, "private", "magicfolderdb.sqlite")
+ dbfile = abspath_expanduser_unicode(dbfile)
+ s = drop_upload.DropUploader(self, upload_dircap, local_dir, dbfile)
s.setServiceParent(self)
s.startService()
from allmydata.util.encodingutil import listdir_unicode, to_filepath, \
unicode_from_filepath, quote_local_unicode_path, FilenameEncodingError
from allmydata.immutable.upload import FileName
+from allmydata.scripts import backupdb
class DropUploader(service.MultiService):
name = 'drop-upload'
- def __init__(self, client, upload_dircap, local_dir, inotify=None):
+ def __init__(self, client, upload_dircap, local_dir, dbfile, inotify=None):
precondition_abspath(local_dir)
service.MultiService.__init__(self)
self._stats_provider = client.stats_provider
self._convergence = client.convergence
self._local_path = to_filepath(self._local_dir)
+ self._dbfile = dbfile
self.is_upload_ready = False
mask = inotify.IN_CLOSE_WRITE | inotify.IN_MOVED_TO | inotify.IN_ONLYDIR
self._notifier.watch(self._local_path, mask=mask, callbacks=[self._notify])
+ def _check_db_file(self, childpath):
+ # returns True if the file must be uploaded.
+ assert self._db != None
+ r = self._db.check_file(childpath)
+ filecap = r.was_uploaded()
+ if filecap is False:
+ return True
+
def startService(self):
+ self._db = backupdb.get_backupdb(self._dbfile)
+ if self._db is None:
+ return Failure(Exception('ERROR: Unable to load magic folder db.'))
+
service.MultiService.startService(self)
d = self._notifier.startReading()
self._stats_provider.count('drop_upload.dirs_monitored', 1)
class MockDropUploader(service.MultiService):
name = 'drop-upload'
- def __init__(self, client, upload_dircap, local_dir_utf8, inotify=None):
+ def __init__(self, client, upload_dircap, local_dir, dbfile, inotify=None):
service.MultiService.__init__(self)
self.client = client
self.upload_dircap = upload_dircap
- self.local_dir_utf8 = local_dir_utf8
+ self.local_dir = local_dir
+ self.dbfile = dbfile
self.inotify = inotify
self.patch(allmydata.frontends.drop_upload, 'DropUploader', MockDropUploader)