remove views and pre 0.9.9.8.6 upgrade code; upgrade test decks to 0.9.9.8.6

This commit is contained in:
Damien Elmes 2011-02-11 07:37:41 +09:00
parent 28604b9d29
commit 1a3c8c0c1e
7 changed files with 6 additions and 401 deletions

View file

@ -3122,7 +3122,6 @@ where id = :id""", fid=f.id, cmid=m.cardModels[0].id, id=id)
"Please restore from automatic backup (see FAQ).")
# ensure correct views and indexes are available
self.updateProgress()
DeckStorage._addViews(self)
DeckStorage._addIndices(self)
# does the user have a model?
self.updateProgress(_("Checking schema..."))
@ -3571,7 +3570,6 @@ class DeckStorage(object):
deck.s.execute("vacuum")
# add views/indices
initTagTables(deck.s)
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.s.statement("analyze")
deck._initVars()
@ -3734,59 +3732,6 @@ create index if not exists ix_cardTags_tagCard on cardTags (tagId, cardId)""")
create index if not exists ix_cardTags_cardId on cardTags (cardId)""")
_addIndices = staticmethod(_addIndices)
def _addViews(deck):
"Add latest version of SQL views to DB."
s = deck.s
# old views
s.statement("drop view if exists failedCards")
s.statement("drop view if exists revCardsOld")
s.statement("drop view if exists revCardsNew")
s.statement("drop view if exists revCardsDue")
s.statement("drop view if exists revCardsRandom")
s.statement("drop view if exists acqCardsRandom")
s.statement("drop view if exists acqCardsOld")
s.statement("drop view if exists acqCardsNew")
# failed cards
s.statement("""
create view failedCards as
select * from cards
where type = 0 and isDue = 1
order by type, isDue, combinedDue
""")
# rev cards
s.statement("""
create view revCardsOld as
select * from cards
where type = 1 and isDue = 1
order by priority desc, interval desc""")
s.statement("""
create view revCardsNew as
select * from cards
where type = 1 and isDue = 1
order by priority desc, interval""")
s.statement("""
create view revCardsDue as
select * from cards
where type = 1 and isDue = 1
order by priority desc, due""")
s.statement("""
create view revCardsRandom as
select * from cards
where type = 1 and isDue = 1
order by priority desc, factId, ordinal""")
# new cards
s.statement("""
create view acqCardsOld as
select * from cards
where type = 2 and isDue = 1
order by priority desc, due""")
s.statement("""
create view acqCardsNew as
select * from cards
where type = 2 and isDue = 1
order by priority desc, due desc""")
_addViews = staticmethod(_addViews)
def _upgradeDeck(deck, path):
"Upgrade deck to the latest version."
if deck.version < DECK_VERSION:
@ -3801,353 +3746,8 @@ order by priority desc, due desc""")
else:
prog = False
deck.path = path
if deck.version == 0:
# new columns
try:
deck.s.statement("""
alter table cards add column spaceUntil float not null default 0""")
deck.s.statement("""
alter table cards add column relativeDelay float not null default 0.0""")
deck.s.statement("""
alter table cards add column isDue boolean not null default 0""")
deck.s.statement("""
alter table cards add column type integer not null default 0""")
deck.s.statement("""
alter table cards add column combinedDue float not null default 0""")
# update cards.spaceUntil based on old facts
deck.s.statement("""
update cards
set spaceUntil = (select (case
when cards.id = facts.lastCardId
then 0
else facts.spaceUntil
end) from cards as c, facts
where c.factId = facts.id
and cards.id = c.id)""")
deck.s.statement("""
update cards
set combinedDue = max(due, spaceUntil)
""")
except:
print "failed to upgrade"
# rebuild with new file format
deck.s.commit()
deck.s.execute("pragma legacy_file_format = off")
deck.s.execute("vacuum")
# add views/indices
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
# rebuild type and delay cache
deck.rebuildTypes()
deck.reset()
# bump version
deck.version = 1
# optimize indices
deck.s.statement("analyze")
if deck.version == 1:
# fix indexes and views
deck.s.statement("drop index if exists ix_cards_newRandomOrder")
deck.s.statement("drop index if exists ix_cards_newOrderedOrder")
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.rebuildTypes()
# optimize indices
deck.s.statement("analyze")
deck.version = 2
if deck.version == 2:
# compensate for bug in 0.9.7 by rebuilding isDue and priorities
deck.s.statement("update cards set isDue = 0")
# compensate for bug in early 0.9.x where fieldId was not unique
deck.s.statement("update fields set id = random()")
deck.version = 3
if deck.version == 3:
# remove conflicting and unused indexes
deck.s.statement("drop index if exists ix_cards_isDueCombined")
deck.s.statement("drop index if exists ix_facts_lastCardId")
deck.s.statement("drop index if exists ix_cards_successive")
deck.s.statement("drop index if exists ix_cards_priority")
deck.s.statement("drop index if exists ix_cards_reps")
deck.s.statement("drop index if exists ix_cards_due")
deck.s.statement("drop index if exists ix_stats_type")
deck.s.statement("drop index if exists ix_stats_day")
deck.s.statement("drop index if exists ix_factsDeleted_cardId")
deck.s.statement("drop index if exists ix_modelsDeleted_cardId")
DeckStorage._addIndices(deck)
deck.s.statement("analyze")
deck.version = 4
if deck.version == 4:
# decks field upgraded earlier
deck.version = 5
if deck.version == 5:
# new spacing
deck.newCardSpacing = NEW_CARDS_DISTRIBUTE
deck.version = 6
# low priority cards now stay in same queue
deck.rebuildTypes()
if deck.version == 6:
# removed 'new cards first' option, so order has changed
deck.newCardSpacing = NEW_CARDS_DISTRIBUTE
deck.version = 7
# <version 7->8 upgrade code removed as obsolete>
if deck.version < 9:
# back up the media dir again, just in case
shutil.copytree(deck.mediaDir(create=True),
deck.mediaDir() + "-old-%s" %
hash(time.time()))
# backup media
media = deck.s.all("""
select filename, size, created, originalPath, description from media""")
# fix mediaDeleted definition
deck.s.execute("drop table mediaDeleted")
deck.s.execute("drop table media")
metadata.create_all(deck.engine)
# restore
h = []
for row in media:
h.append({
'id': genID(),
'filename': row[0],
'size': row[1],
'created': row[2],
'originalPath': row[3],
'description': row[4]})
if h:
deck.s.statements("""
insert into media values (
:id, :filename, :size, :created, :originalPath, :description)""", h)
deck.version = 9
if deck.version < 10:
deck.s.statement("""
alter table models add column source integer not null default 0""")
deck.version = 10
if deck.version < 11:
DeckStorage._setUTCOffset(deck)
deck.version = 11
deck.s.commit()
if deck.version < 12:
deck.s.statement("drop index if exists ix_cards_revisionOrder")
deck.s.statement("drop index if exists ix_cards_newRandomOrder")
deck.s.statement("drop index if exists ix_cards_newOrderedOrder")
deck.s.statement("drop index if exists ix_cards_markExpired")
deck.s.statement("drop index if exists ix_cards_failedIsDue")
deck.s.statement("drop index if exists ix_cards_failedOrder")
deck.s.statement("drop index if exists ix_cards_type")
deck.s.statement("drop index if exists ix_cards_priority")
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.s.statement("analyze")
if deck.version < 13:
deck.reset()
deck.rebuildCounts()
# regenerate question/answer cache
for m in deck.models:
deck.updateCardsFromModel(m, dirty=False)
deck.version = 13
if deck.version < 14:
deck.s.statement("""
update cards set interval = 0
where interval < 1""")
deck.version = 14
if deck.version < 15:
deck.delay1 = deck.delay0
deck.delay2 = 0.0
deck.version = 15
if deck.version < 16:
deck.version = 16
if deck.version < 17:
deck.s.statement("drop view if exists acqCards")
deck.s.statement("drop view if exists futureCards")
deck.s.statement("drop view if exists revCards")
deck.s.statement("drop view if exists typedCards")
deck.s.statement("drop view if exists failedCardsNow")
deck.s.statement("drop view if exists failedCardsSoon")
deck.s.statement("drop index if exists ix_cards_revisionOrder")
deck.s.statement("drop index if exists ix_cards_newRandomOrder")
deck.s.statement("drop index if exists ix_cards_newOrderedOrder")
deck.s.statement("drop index if exists ix_cards_combinedDue")
# add new views
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.version = 17
if deck.version < 18:
deck.s.statement(
"create table undoLog (seq integer primary key, sql text)")
deck.version = 18
deck.s.commit()
DeckStorage._addIndices(deck)
deck.s.statement("analyze")
if deck.version < 19:
# permanent undo log causes various problems, revert to temp
deck.s.statement("drop table undoLog")
deck.sessionTimeLimit = 600
deck.sessionRepLimit = 0
deck.version = 19
deck.s.commit()
if deck.version < 20:
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.version = 20
deck.s.commit()
if deck.version < 21:
deck.s.statement("vacuum")
deck.s.statement("analyze")
deck.version = 21
deck.s.commit()
if deck.version < 22:
deck.s.statement(
'update cardModels set typeAnswer = ""')
deck.version = 22
deck.s.commit()
if deck.version < 23:
try:
deck.s.execute("drop table undoLog")
except:
pass
deck.version = 23
deck.s.commit()
if deck.version < 24:
deck.s.statement(
"update cardModels set lastFontColour = '#ffffff'")
deck.version = 24
deck.s.commit()
if deck.version < 25:
deck.s.statement("drop index if exists ix_cards_priorityDue")
deck.s.statement("drop index if exists ix_cards_priorityDueReal")
DeckStorage._addViews(deck)
DeckStorage._addIndices(deck)
deck.updateDynamicIndices()
deck.version = 25
deck.s.commit()
if deck.version < 26:
# no spaces in tags anymore, as separated by space
def munge(tags):
tags = re.sub(", ?", "--tmp--", tags)
tags = re.sub(" - ", "-", tags)
tags = re.sub(" ", "-", tags)
tags = re.sub("--tmp--", " ", tags)
tags = canonifyTags(tags)
return tags
rows = deck.s.all('select id, tags from facts')
d = []
for (id, tags) in rows:
d.append({
'i': id,
't': munge(tags),
})
deck.s.statements(
"update facts set tags = :t where id = :i", d)
for k in ('highPriority', 'medPriority',
'lowPriority', 'suspended'):
x = getattr(deck, k)
setattr(deck, k, munge(x))
for m in deck.models:
for cm in m.cardModels:
cm.name = munge(cm.name)
m.tags = munge(m.tags)
deck.updateCardsFromModel(m, dirty=False)
deck.version = 26
deck.s.commit()
deck.s.statement("vacuum")
if deck.version < 27:
DeckStorage._addIndices(deck)
deck.updateCardTags()
deck.version = 27
deck.s.commit()
if deck.version < 28:
deck.s.statement("pragma default_cache_size= 20000")
deck.version = 28
deck.s.commit()
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);""")
deck.version = 30
deck.s.commit()
if deck.version < 31:
# recreate review history table
deck.s.statement("drop index if exists ix_reviewHistory_unique")
schema = """
CREATE TABLE %s (
cardId INTEGER NOT NULL,
time NUMERIC(10, 2) NOT NULL,
lastInterval NUMERIC(10, 2) NOT NULL,
nextInterval NUMERIC(10, 2) NOT NULL,
ease INTEGER NOT NULL,
delay NUMERIC(10, 2) NOT NULL,
lastFactor NUMERIC(10, 2) NOT NULL,
nextFactor NUMERIC(10, 2) NOT NULL,
reps NUMERIC(10, 2) NOT NULL,
thinkingTime NUMERIC(10, 2) NOT NULL,
yesCount NUMERIC(10, 2) NOT NULL,
noCount NUMERIC(10, 2) NOT NULL,
PRIMARY KEY (cardId, time))"""
deck.s.statement(schema % "revtmp")
deck.s.statement("""
insert into revtmp
select cardId, time, lastInterval, nextInterval, ease, delay, lastFactor,
nextFactor, reps, thinkingTime, yesCount, noCount from reviewHistory""")
deck.s.statement("drop table reviewHistory")
metadata.create_all(deck.engine)
deck.s.statement(
"insert into reviewHistory select * from revtmp")
deck.s.statement("drop table revtmp")
deck.version = 31
deck.s.commit()
deck.s.statement("vacuum")
if deck.version < 32:
deck.s.execute("drop index if exists ix_cardTags_tagId")
deck.s.execute("drop index if exists ix_cardTags_cardId")
DeckStorage._addIndices(deck)
deck.s.execute("analyze")
deck.version = 32
deck.s.commit()
if deck.version < 33:
deck.s.execute("drop index if exists ix_tags_tag")
DeckStorage._addIndices(deck)
deck.version = 33
deck.s.commit()
if deck.version < 34:
deck.s.execute("drop view if exists acqCardsRandom")
deck.s.execute("drop index if exists ix_cards_factId")
DeckStorage._addIndices(deck)
deck.updateDynamicIndices()
deck.version = 34
deck.s.commit()
if deck.version < 36:
deck.s.statement("drop index if exists ix_cards_priorityDue")
DeckStorage._addIndices(deck)
deck.s.execute("analyze")
deck.version = 36
deck.s.commit()
if deck.version < 37:
if deck.getFailedCardPolicy() == 1:
deck.failedCardMax = 0
deck.version = 37
deck.s.commit()
if deck.version < 39:
deck.reset()
# manually suspend all suspended cards
ids = deck.findCards("tag:suspended")
if ids:
# unrolled from suspendCards() to avoid marking dirty
deck.s.statement(
"update cards set isDue=0, priority=-3 "
"where id in %s" % ids2str(ids))
deck.rebuildCounts()
# suspended tag obsolete - don't do this yet
deck.suspended = re.sub(u" ?Suspended ?", u"", deck.suspended)
deck.version = 39
deck.s.commit()
if deck.version < 40:
# now stores media url
deck.s.statement("update models set features = ''")
deck.version = 40
deck.s.commit()
if deck.version < 43:
deck.s.statement("update fieldModels set features = ''")
deck.version = 43
deck.s.commit()
raise Exception("oldDeckVersion")
if deck.version < 44:
# leaner indices
deck.s.statement("drop index if exists ix_cards_factId")
@ -4275,6 +3875,11 @@ this message. (ERR-0101)""") % {
"dueAsc", "dueDesc"):
deck.s.statement("drop index if exists ix_cards_%s2" % d)
deck.s.statement("drop index if exists ix_cards_%s" % d)
# remove old views
for v in ("failedCards", "revCardsOld", "revCardsNew",
"revCardsDue", "revCardsRandom", "acqCardsRandom",
"acqCardsOld", "acqCardsNew"):
deck.s.statement("drop view if exists %s" % v)
deck.s.execute("analyze")
deck.version = 70
deck.s.commit()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.