diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 183bcc4..66be132 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -40,111 +40,6 @@ class Syncer(object): self.col = col self.server = server - def sync(self): - "Returns 'noChanges', 'fullSync', 'success', etc" - self.syncMsg = "" - self.uname = "" - # if the deck has any pending changes, flush them first and bump mod - # time - self.col.save() - - # step 1: login & metadata - meta = self.server.meta() - self.col.log("rmeta", meta) - if not meta: - return "badAuth" - # server requested abort? - self.syncMsg = meta['msg'] - if not meta['cont']: - return "serverAbort" - else: - # don't abort, but if 'msg' is not blank, gui should show 'msg' - # after sync finishes and wait for confirmation before hiding - pass - rscm = meta['scm'] - rts = meta['ts'] - self.rmod = meta['mod'] - self.maxUsn = meta['usn'] - self.uname = meta.get("uname", "") - self.hostNum = meta.get("hostNum") - meta = self.meta() - self.col.log("lmeta", meta) - self.lmod = meta['mod'] - self.minUsn = meta['usn'] - lscm = meta['scm'] - lts = meta['ts'] - if abs(rts - lts) > 300: - self.col.log("clock off") - return "clockOff" - if self.lmod == self.rmod: - self.col.log("no changes") - return "noChanges" - elif lscm != rscm: - self.col.log("schema diff") - return "fullSync" - self.lnewer = self.lmod > self.rmod - # step 1.5: check collection is valid - if not self.col.basicCheck(): - self.col.log("basic check") - return "basicCheckFailed" - # step 2: startup and deletions - rrem = self.server.start(minUsn=self.minUsn, lnewer=self.lnewer) - - # apply deletions to server - lgraves = self.removed() - while lgraves: - gchunk, lgraves = self._gravesChunk(lgraves) - self.server.applyGraves(chunk=gchunk) - - # then apply server deletions here - self.remove(rrem) - - # ...and small objects - lchg = self.changes() - rchg = self.server.applyChanges(changes=lchg) - self.mergeChanges(lchg, rchg) - # step 3: stream large tables from server - while True: - chunk = self.server.chunk() - self.col.log("server chunk", chunk) - self.applyChunk(chunk=chunk) - if chunk['done']: - break - # step 4: stream to server - while True: - chunk = self.chunk() - self.col.log("client chunk", chunk) - self.server.applyChunk(chunk=chunk) - if chunk['done']: - break - # step 5: sanity check - c = self.sanityCheck() - ret = self.server.sanityCheck2(client=c) - if ret['status'] != "ok": - # roll back and force full sync - self.col.rollback() - self.col.modSchema(False) - self.col.save() - return "sanityCheckFailed" - # finalize - mod = self.server.finish() - self.finish(mod) - return "success" - - def _gravesChunk(self, graves): - lim = 250 - chunk = dict(notes=[], cards=[], decks=[]) - for cat in "notes", "cards", "decks": - if lim and graves[cat]: - chunk[cat] = graves[cat][:lim] - graves[cat] = graves[cat][lim:] - lim -= len(chunk[cat]) - - # anything remaining? - if graves['notes'] or graves['cards'] or graves['decks']: - return chunk, graves - return chunk, None - def meta(self): return dict( mod=self.col.mod,