From b527d314993813fbfb41af325c7abded132c8931 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 12 Mar 2009 17:21:11 +0900 Subject: [PATCH] fix the review history growing bug properly --- anki/deck.py | 10 +++++++--- anki/history.py | 6 +++--- anki/sync.py | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/anki/deck.py b/anki/deck.py index 785b2f8ab..6d29e117b 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -54,7 +54,7 @@ decksTable = Table( Column('created', Float, nullable=False, default=time.time), Column('modified', Float, nullable=False, default=time.time), Column('description', UnicodeText, nullable=False, default=u""), - Column('version', Integer, nullable=False, default=29), + Column('version', Integer, nullable=False, default=30), Column('currentModelId', Integer, ForeignKey("models.id")), # syncing Column('syncName', UnicodeText), @@ -2714,13 +2714,17 @@ where interval < 1""") deck.s.statement("pragma default_cache_size= 20000") deck.version = 28 deck.s.commit() - if deck.version < 29: + if deck.version < 30: # remove duplicates from review history deck.s.statement(""" delete from reviewHistory where id not in ( select min(id) from reviewHistory group by cardId, time);""") + # add a unique index to prevent them from appearing + deck.s.statement(""" +create unique index ix_reviewHistory_unique +on reviewHistory (cardId, time)""") deck.s.statement("vacuum") - deck.version = 29 + deck.version = 30 deck.s.commit() # this check we do regardless of version number since doing it on init # seems to crash diff --git a/anki/history.py b/anki/history.py index 60a52b3a1..b556df5ba 100644 --- a/anki/history.py +++ b/anki/history.py @@ -18,8 +18,7 @@ from anki.db import * reviewHistoryTable = Table( 'reviewHistory', metadata, - Column('id', Integer, primary_key=True), - Column('cardId', Integer, ForeignKey("cards.id")), + Column('cardId', Integer), Column('time', Float, nullable=False, default=time.time), Column('lastInterval', Float, nullable=False), Column('nextInterval', Float, nullable=False), @@ -30,7 +29,8 @@ reviewHistoryTable = Table( Column('reps', Float, nullable=False), Column('thinkingTime', Float, nullable=False), Column('yesCount', Float, nullable=False), - Column('noCount', Float, nullable=False)) + Column('noCount', Float, nullable=False), + PrimaryKeyConstraint("cardId", "time")) class CardHistoryEntry(object): "Create after rescheduling card." diff --git a/anki/sync.py b/anki/sync.py index 81c4bca80..11061001f 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -627,7 +627,7 @@ from reviewHistory where time > :ls""", if not dlist: return self.deck.s.statements(""" -insert into reviewHistory +insert or ignore into reviewHistory (cardId, time, lastInterval, nextInterval, ease, delay, lastFactor, nextFactor, reps, thinkingTime, yesCount, noCount) values