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,7 +2246,11 @@ 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()
if not quick:
# fix problems with cards being scheduled when not due # fix problems with cards being scheduled when not due
self.updateProgress() self.updateProgress()
self.s.statement("update cards set isDue = 0") self.s.statement("update cards set isDue = 0")
@ -2280,10 +2289,10 @@ select id from fields where factId not in (select id from facts)""")
self.updateProgress(_("Rebuilding counts...")) self.updateProgress(_("Rebuilding counts..."))
self.rebuildCounts() self.rebuildCounts()
# update deck and save # update deck and save
if not quick:
self.flushMod() self.flushMod()
self.save() self.save()
self.refresh() self.refresh()
self.updateProgress(_("Rebuilding queue..."))
self.rebuildQueue() self.rebuildQueue()
self.finishProgress() self.finishProgress()
if problems: if problems: