diff --git a/anki/upgrade.py b/anki/upgrade.py index a40235e5b..259720586 100644 --- a/anki/upgrade.py +++ b/anki/upgrade.py @@ -90,9 +90,6 @@ f.id = cards.factId)"""): if db.list(""" select id from fields where factId not in (select id from facts)"""): return - # fix ordinal numbers - db.execute("""update fields set ordinal = (select ordinal from -fieldModels where id = fieldModelId)""") # incorrect types if db.list(""" select id from cards where relativeDelay != (case @@ -129,11 +126,24 @@ fieldModels where id = fieldModelId)""") db.execute("pragma page_size = 4096") db.execute("pragma legacy_file_format = 0") - # previous versions sometimes had cards with incorrect ordinals and - # the db check didn't fix that. so we fix it here: - db.execute(""" -update cards set ordinal = (select ordinal from cardModels -where id = cards.cardModelId)""") + for mid in db.list("select id from models"): + # ensure the ordinals are correct for each cardModel + for c, cmid in enumerate(db.list( + "select id from cardModels where modelId = ? order by ordinal", + mid)): + db.execute("update cardModels set ordinal = ? where id = ?", + c, cmid) + # and fieldModel + for c, fmid in enumerate(db.list( + "select id from fieldModels where modelId = ? order by ordinal", + mid)): + db.execute("update fieldModels set ordinal = ? where id = ?", + c, fmid) + # then fix ordinals numbers on cards & fields + db.execute("""update cards set ordinal = (select ordinal from +cardModels where cardModels.id = cardModelId)""") + db.execute("""update fields set ordinal = (select ordinal from +fieldModels where id = fieldModelId)""") # notes ########### diff --git a/tests/support/invalid-ords.anki b/tests/support/invalid-ords.anki new file mode 100644 index 000000000..f2f3df45e Binary files /dev/null and b/tests/support/invalid-ords.anki differ diff --git a/tests/test_upgrade.py b/tests/test_upgrade.py index 73bbc1110..0a7f58e1c 100644 --- a/tests/test_upgrade.py +++ b/tests/test_upgrade.py @@ -49,6 +49,14 @@ def test_upgrade1_due(): deck = u.upgrade(dst) assert not deck.db.scalar("select 1 from cards where due != 1") +def test_invalid_ords(): + dst = getUpgradeDeckPath("invalid-ords.anki") + u = Upgrader() + u.check(dst) + deck = u.upgrade(dst) + assert deck.db.scalar("select count() from cards where ord = 0") == 1 + assert deck.db.scalar("select count() from cards where ord = 1") == 1 + def test_upgrade2(): p = "/tmp/alpha-upgrade.anki2" if os.path.exists(p):