support quick db check, don't forget deletions, report deleted cards

This commit is contained in:
Damien Elmes 2009-05-16 02:47:51 +09:00
parent d091166fe5
commit 2a9e88cb5d

View file

@ -2167,20 +2167,26 @@ Return new path, relative to media dir."""
# DB maintenance # DB maintenance
########################################################################## ##########################################################################
def fixIntegrity(self): def fixIntegrity(self, quick=False):
"Responsibility of caller to call rebuildQueue()" "Responsibility of caller to call rebuildQueue()"
self.s.commit() self.s.commit()
self.resetUndo() self.resetUndo()
self.startProgress(12) problems = []
deletedCards = []
if quick:
num = 4
else:
num = 9
self.startProgress(num)
self.updateProgress(_("Checking integrity...")) self.updateProgress(_("Checking integrity..."))
if self.s.scalar("pragma integrity_check") != "ok": if self.s.scalar("pragma integrity_check") != "ok":
self.finishProgress() self.finishProgress()
return _("Database file damaged. Restore from backup.") return _("Database file is damaged.\n"
"Please restore from automatic backup (see FAQ).")
# ensure correct views and indexes are available # ensure correct views and indexes are available
self.updateProgress() self.updateProgress(_("Adding views and indices..."))
DeckStorage._addViews(self) DeckStorage._addViews(self)
DeckStorage._addIndices(self) DeckStorage._addIndices(self)
problems = []
# does the user have a model? # does the user have a model?
self.updateProgress(_("Checking schema...")) self.updateProgress(_("Checking schema..."))
if not self.s.scalar("select count(id) from models"): if not self.s.scalar("select count(id) from models"):
@ -2192,14 +2198,7 @@ select decks.id from decks, models where
decks.currentModelId = models.id"""): decks.currentModelId = models.id"""):
self.currentModelId = self.models[0].id self.currentModelId = self.models[0].id
problems.append(_("The current model didn't exist")) problems.append(_("The current model didn't exist"))
# forget all deletions (do this before deleting anything)
self.updateProgress()
self.s.statement("delete from cardsDeleted")
self.s.statement("delete from factsDeleted")
self.s.statement("delete from modelsDeleted")
self.s.statement("delete from mediaDeleted")
# facts missing a field? # facts missing a field?
self.updateProgress()
ids = self.s.column0(""" ids = self.s.column0("""
select distinct facts.id from facts, fieldModels where select distinct facts.id from facts, fieldModels where
facts.modelId = fieldModels.modelId and fieldModels.id not in facts.modelId = fieldModels.modelId and fieldModels.id not in
@ -2213,6 +2212,9 @@ facts.modelId = fieldModels.modelId and fieldModels.id not in
ids = self.s.column0(""" ids = self.s.column0("""
select id from cards where factId not in (select id from facts)""") select id from cards where factId not in (select id from facts)""")
if ids: if ids:
deletedCards.extend(self.s.all(
"select question, answer from cards where id in %s" %
ids2str(ids)))
self.deleteCards(ids) self.deleteCards(ids)
problems.append(ngettext("Deleted %d card with missing fact", problems.append(ngettext("Deleted %d card with missing fact",
"Deleted %d cards with missing fact", len(ids)) % "Deleted %d cards with missing fact", len(ids)) %
@ -2222,6 +2224,9 @@ select id from cards where factId not in (select id from facts)""")
select id from cards where cardModelId not in select id from cards where cardModelId not in
(select id from cardModels)""") (select id from cardModels)""")
if ids: if ids:
deletedCards.extend(self.s.all(
"select question, answer from cards where id in %s" %
ids2str(ids)))
self.deleteCards(ids) self.deleteCards(ids)
problems.append(ngettext("Deleted %d card with no card template", problems.append(ngettext("Deleted %d card with no card template",
"Deleted %d cards with no card template", len(ids)) % "Deleted %d cards with no card template", len(ids)) %
@ -2241,49 +2246,53 @@ select id from fields where factId not in (select id from facts)""")
problems.append(ngettext("Deleted %d dangling field", problems.append(ngettext("Deleted %d dangling field",
"Deleted %d dangling fields", len(ids)) % "Deleted %d dangling fields", len(ids)) %
len(ids)) len(ids))
for card in deletedCards:
print card
problems.append(_("Deleted: ") + "%s %s" % tuple(card))
self.s.flush() self.s.flush()
# fix problems with cards being scheduled when not due if not quick:
self.updateProgress() # fix problems with cards being scheduled when not due
self.s.statement("update cards set isDue = 0") self.updateProgress()
# these sometimes end up null on upgrade self.s.statement("update cards set isDue = 0")
self.s.statement("update models set source = 0 where source is null") # these sometimes end up null on upgrade
self.s.statement( self.s.statement("update models set source = 0 where source is null")
"update cardModels set allowEmptyAnswer = 1, typeAnswer = '' " self.s.statement(
"where allowEmptyAnswer is null or typeAnswer is null") "update cardModels set allowEmptyAnswer = 1, typeAnswer = '' "
# fix tags "where allowEmptyAnswer is null or typeAnswer is null")
self.updateProgress(_("Rebuilding tag cache...")) # fix tags
self.updateCardTags() self.updateProgress(_("Rebuilding tag cache..."))
# fix any priorities self.updateCardTags()
self.updateProgress(_("Updating priorities...")) # fix any priorities
self.updateAllPriorities() self.updateProgress(_("Updating priorities..."))
# fix problems with stripping html self.updateAllPriorities()
self.updateProgress(_("Rebuilding QA cache...")) # fix problems with stripping html
fields = self.s.all("select id, value from fields") self.updateProgress(_("Rebuilding QA cache..."))
newFields = [] fields = self.s.all("select id, value from fields")
for (id, value) in fields: newFields = []
newFields.append({'id': id, 'value': tidyHTML(value)}) for (id, value) in fields:
self.s.statements( newFields.append({'id': id, 'value': tidyHTML(value)})
"update fields set value=:value where id=:id", self.s.statements(
newFields) "update fields set value=:value where id=:id",
# regenerate question/answer cache newFields)
for m in self.models: # regenerate question/answer cache
self.updateCardsFromModel(m) for m in self.models:
# mark everything changed to force sync self.updateCardsFromModel(m)
self.s.flush() # mark everything changed to force sync
self.s.statement("update cards set modified = :t", t=time.time()) self.s.flush()
self.s.statement("update facts set modified = :t", t=time.time()) self.s.statement("update cards set modified = :t", t=time.time())
self.s.statement("update models set modified = :t", t=time.time()) self.s.statement("update facts set modified = :t", t=time.time())
self.lastSync = 0 self.s.statement("update models set modified = :t", t=time.time())
# rebuild self.lastSync = 0
self.updateProgress(_("Rebuilding types...")) # rebuild
self.rebuildTypes() self.updateProgress(_("Rebuilding types..."))
self.rebuildTypes()
self.updateProgress(_("Rebuilding counts...")) self.updateProgress(_("Rebuilding counts..."))
self.rebuildCounts() self.rebuildCounts()
# update deck and save # update deck and save
self.flushMod() if not quick:
self.save() self.flushMod()
self.save()
self.refresh() self.refresh()
self.updateProgress(_("Rebuilding queue..."))
self.rebuildQueue() self.rebuildQueue()
self.finishProgress() self.finishProgress()
if problems: if problems: