From c7f9cec6579a5c4b91431ed0de3b0a770c6819c0 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 7 Apr 2009 11:55:08 +0900 Subject: [PATCH] add deck vars --- anki/deck.py | 20 ++++++++++++++++++++ anki/sync.py | 7 +++++++ tests/test_sync.py | 10 ++++++++++ 3 files changed, 37 insertions(+) diff --git a/anki/deck.py b/anki/deck.py index 6100c8838..097d1b840 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -49,6 +49,11 @@ REV_CARDS_RANDOM = 3 DECK_VERSION = 32 +deckVarsTable = Table( + 'deckVars', metadata, + Column('key', UnicodeText, nullable=False, primary_key=True), + Column('value', UnicodeText)) + # parts of the code assume we only have one deck decksTable = Table( 'decks', metadata, @@ -1833,6 +1838,21 @@ cardTags.tagId in %s""" % ids2str(ids) return True return False + # Meta vars + ########################################################################## + + def getInt(self, key): + ret = self.s.scalar("select value from deckVars where key = :k", + k=key) + if ret is not None: + ret = int(ret) + return ret + + def setVar(self, key, value): + self.s.statement("insert or replace into deckVars (key, value) " + "values (:key, :value)", key=key, value=value) + self.flushMod() + # Failed card handling ########################################################################## diff --git a/anki/sync.py b/anki/sync.py index 566ec4ba3..93215df12 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -561,9 +561,16 @@ values # these may be deleted before bundling if 'models' in d: del d['models'] if 'currentModel' in d: del d['currentModel'] + d['meta'] = self.realTuples(self.deck.s.all("select * from deckVars")) return d def updateDeck(self, deck): + meta = deck['meta'] + for (k,v) in meta: + self.deck.s.statement(""" +insert or replace into deckVars +(key, value) values (:k, :v)""", k=k, v=v) + del deck['meta'] self.applyDict(self.deck, deck) self.deck.lastSync = self.deck.modified self.deck.updateTagPriorities() diff --git a/tests/test_sync.py b/tests/test_sync.py index 4ed54169f..f91ec04d2 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -104,6 +104,13 @@ def test_localsync_deck(): assert dailyStats(deck2).reps == 1 assert globalStats(deck2).reps == 1 assert deck2.s.scalar("select count(*) from reviewHistory") == 1 + # make sure meta data is synced + deck1.setVar("foo", 1) + assert deck1.getInt("foo") == 1 + assert deck2.getInt("foo") is None + client.sync() + assert deck1.getInt("foo") == 1 + assert deck2.getInt("foo") == 1 @nose.with_setup(setup_local, teardown) def test_localsync_models(): @@ -283,6 +290,9 @@ def test_remotesync_fromserver(): assert deck2.modified > deck1.modified client.sync() assert deck2.modified == deck1.modified + # test deck vars + deck1.setVar("foo", 1) + client.sync() @nose.with_setup(setup_remote, teardown) def test_remotesync_toserver():