diff --git a/anki/collection.py b/anki/collection.py index 964bcd663..c1d04a8c0 100644 --- a/anki/collection.py +++ b/anki/collection.py @@ -292,10 +292,11 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""", now = intTime() rem = [] usn = self.usn() - for nid, mid, did, flds in self.db.execute( - "select id, mid, did, flds from notes where id in "+snids): + for nid, mid, flds in self.db.execute( + "select id, mid, flds from notes where id in "+snids): model = self.models.get(mid) avail = self.models.availOrds(model, flds) + did = model['did'] for t in model['tmpls']: doHave = nid in have and t['ord'] in have[nid] # if have ord but empty, add cid to remove list @@ -335,7 +336,7 @@ insert into cards values (?,?,?,?,?,?,0,0,?,0,0,0,0,0,0,0,0,"")""", card = anki.cards.Card(self) card.nid = note.id card.ord = template['ord'] - card.did = template['did'] or note.did + card.did = template['did'] or note.model()['did'] card.due = self._dueForDid(card.did, due) if flush: card.flush() diff --git a/anki/consts.py b/anki/consts.py index 8cfce092d..573ca0134 100644 --- a/anki/consts.py +++ b/anki/consts.py @@ -32,7 +32,7 @@ MEDIA_ADD = 0 MEDIA_REM = 1 # deck schema & syncing vars -SCHEMA_VERSION = 2 +SCHEMA_VERSION = 3 SYNC_ZIP_SIZE = int(2.5*1024*1024) SYNC_URL = os.environ.get("SYNC_URL") or "https://beta.ankiweb.net/sync/" SYNC_VER = 1 diff --git a/anki/exporting.py b/anki/exporting.py index 0b37a456a..ccdc66351 100644 --- a/anki/exporting.py +++ b/anki/exporting.py @@ -147,7 +147,7 @@ class AnkiExporter(Exporter): notedata = self.src.db.all("select * from notes where id in "+ strnids) self.dst.db.executemany( - "insert into notes values (?,?,?,?,?,?,?,?,?,?,?,?)", + "insert into notes values (?,?,?,?,?,?,?,?,?,?,?)", notedata) # models used by the notes mids = self.dst.db.list("select distinct mid from notes where id in "+ diff --git a/anki/importing/anki2.py b/anki/importing/anki2.py index 2490f72ab..ebb693057 100644 --- a/anki/importing/anki2.py +++ b/anki/importing/anki2.py @@ -83,19 +83,18 @@ class Anki2Importer(Importer): existing[note[0]] = True # rewrite internal ids, models, etc note[2] = lmid - note[3] = self._did(note[3]) - note[4] = intTime() - note[5] = usn + note[3] = intTime() + note[4] = usn add.append(note) dirty.append(note[0]) # note we have the added note - self._notes[guid] = (note[0], note[4], note[2]) + self._notes[guid] = (note[0], note[3], note[2]) else: # not yet implemented pass # add to col self.dst.db.executemany( - "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?,?)", + "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", add) self.dst.updateFieldCache(dirty) self.dst.tags.registerNotes(dirty) diff --git a/anki/importing/noteimp.py b/anki/importing/noteimp.py index 6ade752f5..53832bc90 100644 --- a/anki/importing/noteimp.py +++ b/anki/importing/noteimp.py @@ -150,13 +150,13 @@ class NoteImporter(Importer): for ord, c in n.cards.items(): self._cards.append((id, ord, c)) self.col.tags.register(n.tags) - return [id, guid64(), self.model['id'], self.didForNote(n), + return [id, guid64(), self.model['id'], intTime(), self.col.usn(), self.col.tags.join(n.tags), n.fieldsStr, "", "", 0, ""] def addNew(self, rows): self.col.db.executemany( - "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?,?)", + "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) # need to document that deck is ignored in this case @@ -175,13 +175,6 @@ class NoteImporter(Importer): update notes set mod = ?, usn = ?, flds = ?, tags = ? where id = ? and (flds != ? or tags != ?)""", rows) - def didForNote(self, n): - if not n.deck: - n.deck = _("Imported") - if n.deck not in self._deckMap: - self._deckMap[n.deck] = self.col.decks.id(n.deck) - return self._deckMap[n.deck] - def processFields(self, note): fields = [""]*len(self.model['flds']) for c, f in enumerate(self.mapping): diff --git a/anki/notes.py b/anki/notes.py index 3e10ffa0a..1edf51fc3 100644 --- a/anki/notes.py +++ b/anki/notes.py @@ -19,7 +19,6 @@ class Note(object): self.id = timestampID(col.db, "notes") self.guid = guid64() self._model = model - self.did = model['did'] self.mid = model['id'] self.tags = [] self.fields = [""] * len(self._model['flds']) @@ -31,14 +30,13 @@ class Note(object): def load(self): (self.guid, self.mid, - self.did, self.mod, self.usn, self.tags, self.fields, self.flags, self.data) = self.col.db.first(""" -select guid, mid, did, mod, usn, tags, flds, flags, data +select guid, mid, mod, usn, tags, flds, flags, data from notes where id = ?""", self.id) self.fields = splitFields(self.fields) self.tags = self.col.tags.split(self.tags) @@ -55,8 +53,8 @@ from notes where id = ?""", self.id) tags = self.stringTags() csum = fieldChecksum(self.fields[0]) res = self.col.db.execute(""" -insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?,?)""", - self.id, self.guid, self.mid, self.did, +insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)""", + self.id, self.guid, self.mid, self.mod, self.usn, tags, self.joinedFields(), sfld, csum, self.flags, self.data) @@ -73,12 +71,6 @@ insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?,?)""", def model(self): return self._model - def updateCardDids(self): - for c in self.cards(): - if c.did != self.did and not c.template()['did']: - c.did = self.did - c.flush() - # Dict interface ################################################## diff --git a/anki/stats.py b/anki/stats.py index acf5cefee..956d15155 100644 --- a/anki/stats.py +++ b/anki/stats.py @@ -50,8 +50,7 @@ class CardStats(object): self.addLine(_("Position"), c.due) self.addLine(_("Card Type"), c.template()['name']) self.addLine(_("Note Type"), c.model()['name']) - self.addLine(_("Card Deck"), self.col.decks.name(c.did)) - self.addLine(_("Note Deck"), self.col.decks.name(c.note().did)) + self.addLine(_("Deck"), self.col.decks.name(c.did)) self.txt += "" return self.txt diff --git a/anki/storage.py b/anki/storage.py index 343d8a3a4..652e07f58 100644 --- a/anki/storage.py +++ b/anki/storage.py @@ -46,8 +46,11 @@ def Collection(path, lock=True, server=False, sync=True): # no upgrades necessary at the moment def _upgradeSchema(db): - if db.scalar("select ver from col") < SCHEMA_VERSION: - print "upgrading" + if db.scalar("select ver from col") == SCHEMA_VERSION: + return SCHEMA_VERSION + # add odid to cards, edue->odue + ###################################################################### + if db.scalar("select ver from col") == 1: db.execute("alter table cards rename to cards2") _addSchema(db) db.execute(""" @@ -57,6 +60,17 @@ left, edue, 0, flags, data from cards2""") db.execute("drop table cards2") db.execute("update col set ver = 2") _updateIndices(db) + # remove did from notes + ###################################################################### + if db.scalar("select ver from col") == 2: + db.execute("alter table notes rename to notes2") + _addSchema(db) + db.execute(""" +insert into notes select +id, guid, mid, mod, usn, tags, flds, sfld, csum, flags, data from notes2""") + db.execute("drop table notes2") + db.execute("update col set ver = 3") + _updateIndices(db) return SCHEMA_VERSION def _upgrade(col, ver): @@ -96,7 +110,6 @@ create table if not exists notes ( id integer primary key, guid text not null, mid integer not null, - did integer not null, mod integer not null, usn integer not null, tags text not null, diff --git a/anki/sync.py b/anki/sync.py index f93affecd..ee8be173c 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -185,7 +185,7 @@ select id, nid, did, ord, mod, %d, type, queue, due, ivl, factor, reps, lapses, left, odue, odid, flags, data from cards where %s""" % d) else: return x(""" -select id, guid, mid, did, mod, %d, tags, flds, '', '', flags, data +select id, guid, mid, mod, %d, tags, flds, '', '', flags, data from notes where %s""" % d) def chunk(self): @@ -369,7 +369,7 @@ from notes where %s""" % d) def mergeNotes(self, notes): rows = self.newerRows(notes, "notes", 4) self.col.db.executemany( - "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?,?)", + "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) self.col.updateFieldCache([f[0] for f in rows]) diff --git a/anki/upgrade.py b/anki/upgrade.py index 458963609..acde650eb 100644 --- a/anki/upgrade.py +++ b/anki/upgrade.py @@ -149,7 +149,7 @@ end) """) # pull facts into memory, so we can merge them with fields efficiently facts = db.all(""" -select id, id, modelId, 1, cast(created*1000 as int), cast(modified as int), +select id, id, modelId, cast(created*1000 as int), cast(modified as int), 0, tags from facts order by created""") # build field hash fields = {} @@ -185,7 +185,7 @@ select id, id, modelId, 1, cast(created*1000 as int), cast(modified as int), # and put the facts into the new table db.execute("drop table facts") _addSchema(db, False) - db.executemany("insert into notes values (?,?,?,?,?,?,?,?,'','',0,'')", data) + db.executemany("insert into notes values (?,?,?,?,?,?,?,'','',0,'')", data) db.execute("drop table fields") # cards diff --git a/tests/test_decks.py b/tests/test_decks.py index fcabf57cb..9cfd2b7e3 100644 --- a/tests/test_decks.py +++ b/tests/test_decks.py @@ -39,7 +39,7 @@ def test_remove(): g1 = deck.decks.id("g1") f = deck.newNote() f['Front'] = u"1" - f.did = g1 + f.model()['did'] = g1 deck.addNote(f) c = f.cards()[0] assert c.did == g1 diff --git a/tests/test_exporting.py b/tests/test_exporting.py index 571423cf2..9bc0c6dce 100644 --- a/tests/test_exporting.py +++ b/tests/test_exporting.py @@ -20,7 +20,7 @@ def setup1(): # with a different deck f = deck.newNote() f['Front'] = u"baz"; f['Back'] = u"qux" - f.did = deck.decks.id("new deck") + f.model()['did'] = deck.decks.id("new deck") deck.addNote(f) ########################################################################## diff --git a/tests/test_sched.py b/tests/test_sched.py index 5ff1e527a..f25656eb4 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -61,7 +61,7 @@ def test_newLimits(): f = d.newNote() f['Front'] = str(i) if i > 4: - f.did = g2 + f.model()['did'] = g2 d.addNote(f) # give the child deck a different configuration c2 = d.decks.confId("new conf") @@ -716,7 +716,7 @@ def test_deckDue(): # and one that's a child f = d.newNote() f['Front'] = u"two" - default1 = f.did = d.decks.id("Default::1") + default1 = f.model()['did'] = d.decks.id("Default::1") d.addNote(f) # make it a review card c = f.cards()[0] @@ -726,12 +726,12 @@ def test_deckDue(): # add one more with a new deck f = d.newNote() f['Front'] = u"two" - foobar = f.did = d.decks.id("foo::bar") + foobar = f.model()['did'] = d.decks.id("foo::bar") d.addNote(f) # and one that's a sibling f = d.newNote() f['Front'] = u"three" - foobaz = f.did = d.decks.id("foo::baz") + foobaz = f.model()['did'] = d.decks.id("foo::baz") d.addNote(f) d.reset() assert len(d.decks.decks) == 5 @@ -775,12 +775,12 @@ def test_deckFlow(): # and one that's a child f = d.newNote() f['Front'] = u"two" - default1 = f.did = d.decks.id("Default::2") + default1 = f.model()['did'] = d.decks.id("Default::2") d.addNote(f) # and another that's higher up f = d.newNote() f['Front'] = u"three" - default1 = f.did = d.decks.id("Default::1") + default1 = f.model()['did'] = d.decks.id("Default::1") d.addNote(f) # should get top level one first, then ::1, then ::2 d.reset()