From 9fdfac722d5b07ddfc0d30292da68f89641ab135 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 24 Sep 2011 14:46:42 +0900 Subject: [PATCH] fixed bug in bundling --- anki/storage.py | 2 +- anki/sync.py | 15 +++++++++++++-- tests/test_sync.py | 23 +++++++++++++++-------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/anki/storage.py b/anki/storage.py index 2a3bd0b7e..25dc4b349 100644 --- a/anki/storage.py +++ b/anki/storage.py @@ -131,7 +131,7 @@ create table if not exists graves ( ); insert or ignore into deck -values(1,0,0,0,%(v)s,0,1,0,'','{}','','','{}'); +values(1,0,0,0,%(v)s,0,0,0,'','{}','','','{}'); """ % ({'v':CURRENT_VERSION})) import anki.deck if setDeckConf: diff --git a/anki/sync.py b/anki/sync.py index 5bc269076..2138d0c23 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -58,6 +58,7 @@ class Syncer(object): def sync(self): "Returns 'noChanges', 'fullSync', or 'success'." # step 1: login & metadata + self.status("login") self.rmod, rscm, self.maxUsn = self.server.times() self.lmod, lscm, self.minUsn = self.times() if self.lmod == self.rmod: @@ -66,27 +67,34 @@ class Syncer(object): return "fullSync" self.lnewer = self.lmod > self.rmod # step 2: deletions and small objects + self.status("meta") lchg = self.changes() rchg = self.server.applyChanges( minUsn=self.minUsn, lnewer=self.lnewer, changes=lchg) self.mergeChanges(lchg, rchg) # step 3: stream large tables from server + self.status("server") while 1: + self.status("stream") chunk = self.server.chunk() self.applyChunk(chunk) if chunk['done']: break # step 4: stream to server + self.status("client") while 1: + self.status("stream") chunk = self.chunk() self.server.applyChunk(chunk) if chunk['done']: break # step 5: sanity check during beta testing + self.status("sanity") c = self.sanityCheck() s = self.server.sanityCheck() assert c == s # finalize + self.status("finalize") mod = self.server.finish() self.finish(mod) return "success" @@ -202,7 +210,8 @@ from facts where %s""" % d) if not self.cursor: self.cursor = self.cursorForTable(curTable) rows = self.cursor.fetchmany(lim) - if len(rows) != lim: + fetched = len(rows) + if fetched != lim: # table is empty self.tablesLeft.pop(0) self.cursor = None @@ -212,7 +221,7 @@ from facts where %s""" % d) "update %s set usn=? where usn=-1"%curTable, self.maxUsn) buf[curTable] = rows - lim -= len(buf) + lim -= fetched if not self.tablesLeft: buf['done'] = True return buf @@ -483,6 +492,8 @@ class HttpSyncServerProxy(object): ########################################################################## # not yet ported +# make sure it resets any usn == -1 before uploading! + class FullSyncer(object): def __init__(self, deck): diff --git a/tests/test_sync.py b/tests/test_sync.py index 42fc75413..7013656e0 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -19,7 +19,7 @@ deck2=None client=None server=None -def setup_basic(loadDecks=None): +def setup_basic(): global deck1, deck2, client, server deck1 = getEmptyDeck() # add a fact to deck 1 @@ -231,14 +231,21 @@ def test_threeway(): def _test_speed(): t = time.time() - setup_basic([os.path.expanduser("~/rapid.anki"), - os.path.expanduser("~/rapid2.anki")]) + deck1 = Deck(os.path.expanduser("~/rapid.anki")) + for tbl in "revlog", "cards", "facts", "graves": + deck1.db.execute("update %s set usn = -1 where usn != -1"%tbl) + for m in deck1.models.all(): + m['usn'] = -1 + for tx in deck1.tags.all(): + deck1.tags.tags[tx] = -1 + deck1._usn = -1 + deck1.save() + deck2 = getEmptyDeck(server=True) + deck1.scm = deck2.scm = 0 + server = LocalServer(deck2) + client = Syncer(deck1, server) print "load %d" % ((time.time() - t)*1000); t = time.time() - deck2.save() - # 3000 revlog entries: ~128ms - # 3000 cards: ~200ms - # 3000 facts: ~500ms - assert client.sync() != "fullSync" + assert client.sync() == "success" print "sync %d" % ((time.time() - t)*1000); t = time.time()