mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 23:42:23 -04:00
support quick db check, don't forget deletions, report deleted cards
This commit is contained in:
parent
d091166fe5
commit
2a9e88cb5d
1 changed files with 59 additions and 50 deletions
109
anki/deck.py
109
anki/deck.py
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue