move models, templates and fields to incremental ids

any change to them is marked as a schema change anyway, and smaller ids mean
more compact css and a smaller fdata table
This commit is contained in:
Damien Elmes 2011-03-07 18:09:20 +09:00
parent 3cb4ade4a1
commit c24bb95b31
2 changed files with 43 additions and 7 deletions

View file

@ -31,7 +31,7 @@ class Model(object):
self.id = id self.id = id
self.load() self.load()
else: else:
self.id = genID() self.id = None
self.name = u"" self.name = u""
self.mod = intTime() self.mod = intTime()
self.conf = defaultConf.copy() self.conf = defaultConf.copy()
@ -49,16 +49,23 @@ select mod, name, conf from models where id = ?""", self.id)
def flush(self): def flush(self):
self.mod = intTime() self.mod = intTime()
self.deck.db.execute(""" ret = self.deck.db.execute("""
insert or replace into models values (?, ?, ?, ?)""", insert or replace into models values (?, ?, ?, ?)""",
self.id, self.mod, self.name, self.id, self.mod, self.name,
simplejson.dumps(self.conf)) simplejson.dumps(self.conf))
self.id = ret.lastrowid
[f._flush() for f in self.fields] [f._flush() for f in self.fields]
[t._flush() for t in self.templates] [t._flush() for t in self.templates]
def updateCache(self): def updateCache(self):
self.deck.updateCache([self.id], "model") self.deck.updateCache([self.id], "model")
def _getID(self):
if not self.id:
# flush so we can get our DB id
self.flush()
return self.id
# Fields # Fields
################################################## ##################################################
@ -69,7 +76,7 @@ insert or replace into models values (?, ?, ?, ?)""",
def addField(self, field): def addField(self, field):
self.deck.modSchema() self.deck.modSchema()
field.mid = self.id field.mid = self._getID()
field.ord = len(self.fields) field.ord = len(self.fields)
self.fields.append(field) self.fields.append(field)
@ -87,7 +94,7 @@ insert or replace into models values (?, ?, ?, ?)""",
def addTemplate(self, template): def addTemplate(self, template):
self.deck.modSchema() self.deck.modSchema()
template.mid = self.id template.mid = self._getID()
template.ord = len(self.templates) template.ord = len(self.templates)
self.templates.append(template) self.templates.append(template)
@ -129,7 +136,7 @@ class Field(object):
if data: if data:
self.initFromData(data) self.initFromData(data)
else: else:
self.id = genID() self.id = None
self.numeric = 0 self.numeric = 0
self.conf = defaultFieldConf.copy() self.conf = defaultFieldConf.copy()
@ -143,11 +150,12 @@ class Field(object):
self.conf = simplejson.loads(self.conf) self.conf = simplejson.loads(self.conf)
def _flush(self): def _flush(self):
self.deck.db.execute(""" ret = self.deck.db.execute("""
insert or replace into fields values (?, ?, ?, ?, ?, ?)""", insert or replace into fields values (?, ?, ?, ?, ?, ?)""",
self.id, self.mid, self.ord, self.id, self.mid, self.ord,
self.name, self.numeric, self.name, self.numeric,
simplejson.dumps(self.conf)) simplejson.dumps(self.conf))
self.id = ret.lastrowid
# Template object # Template object
########################################################################## ##########################################################################
@ -183,8 +191,9 @@ class Template(object):
self.conf = simplejson.loads(self.conf) self.conf = simplejson.loads(self.conf)
def _flush(self): def _flush(self):
self.deck.db.execute(""" ret = self.deck.db.execute("""
insert or replace into templates values (?, ?, ?, ?, ?, ?, ?, ?)""", insert or replace into templates values (?, ?, ?, ?, ?, ?, ?, ?)""",
self.id, self.mid, self.ord, self.name, self.id, self.mid, self.ord, self.name,
self.active, self.qfmt, self.afmt, self.active, self.qfmt, self.afmt,
simplejson.dumps(self.conf)) simplejson.dumps(self.conf))
self.id = ret.lastrowid

View file

@ -412,9 +412,36 @@ allowEmptyAnswer, typeAnswer from cardModels"""):
# clean up # clean up
db.execute("drop table cardModels") db.execute("drop table cardModels")
def _rewriteIds(deck):
# rewrite model/template/field ids
models = deck.allModels()
deck.db.execute("delete from models")
deck.db.execute("delete from templates")
deck.db.execute("delete from fields")
for c, m in enumerate(models):
old = m.id
m.id = c+1
for t in m.templates:
t.mid = m.id
oldT = t.id
t.id = None
t._flush()
deck.db.execute(
"update cards set tid = ? where tid = ?", t.mid, oldT)
for f in m.fields:
f.mid = m.id
oldF = f.id
f.id = None
f._flush()
deck.db.execute(
"update fdata set fmid = ? where fmid = ?", f.id, oldF)
m.flush()
deck.db.execute("update facts set mid = ? where mid = ?", m.id, old)
def _postSchemaUpgrade(deck): def _postSchemaUpgrade(deck):
"Handle the rest of the upgrade to 2.0." "Handle the rest of the upgrade to 2.0."
import anki.deck import anki.deck
_rewriteIds(deck)
# remove old views # remove old views
for v in ("failedCards", "revCardsOld", "revCardsNew", for v in ("failedCards", "revCardsOld", "revCardsNew",
"revCardsDue", "revCardsRandom", "acqCardsRandom", "revCardsDue", "revCardsRandom", "acqCardsRandom",