Add magic folder db.

Signed-off-by: Daira Hopwood <daira@jacaranda.org>
This commit is contained in:
Daira Hopwood 2015-04-28 20:52:05 +01:00
parent b37478195f
commit 5153dff291
3 changed files with 21 additions and 4 deletions

View File

@ -498,7 +498,9 @@ class Client(node.Node, pollmixin.PollMixin):
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()
except Exception, e:

View File

@ -12,12 +12,13 @@ from allmydata.util.fileutil import abspath_expanduser_unicode, precondition_abs
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)
@ -26,6 +27,7 @@ class DropUploader(service.MultiService):
self._stats_provider = client.stats_provider
self._convergence = client.convergence
self._local_path = to_filepath(self._local_dir)
self._dbfile = dbfile
if inotify is None:
from twisted.internet import inotify
@ -58,7 +60,19 @@ class DropUploader(service.MultiService):
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)

View File

@ -306,11 +306,12 @@ class Basic(testutil.ReallyEqualMixin, testutil.NonASCIIPathMixin, unittest.Test
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)