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

View file

@ -412,9 +412,36 @@ allowEmptyAnswer, typeAnswer from cardModels"""):
# clean up
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):
"Handle the rest of the upgrade to 2.0."
import anki.deck
_rewriteIds(deck)
# remove old views
for v in ("failedCards", "revCardsOld", "revCardsNew",
"revCardsDue", "revCardsRandom", "acqCardsRandom",