revert undo log to temporary table, fix slowdown on big undo log

This commit is contained in:
Damien Elmes 2009-01-04 13:48:48 +09:00
parent 73767124d8
commit e3feff6ca6

View file

@ -49,7 +49,7 @@ decksTable = Table(
Column('created', Float, nullable=False, default=time.time), Column('created', Float, nullable=False, default=time.time),
Column('modified', Float, nullable=False, default=time.time), Column('modified', Float, nullable=False, default=time.time),
Column('description', UnicodeText, nullable=False, default=u""), Column('description', UnicodeText, nullable=False, default=u""),
Column('version', Integer, nullable=False, default=18), Column('version', Integer, nullable=False, default=19),
Column('currentModelId', Integer, ForeignKey("models.id")), Column('currentModelId', Integer, ForeignKey("models.id")),
# syncing # syncing
Column('syncName', UnicodeText), Column('syncName', UnicodeText),
@ -1611,6 +1611,8 @@ select id from fields where factId not in (select id from facts)""")
self.undoStack = [] self.undoStack = []
self.redoStack = [] self.redoStack = []
self.undoEnabled = True self.undoEnabled = True
self.s.statement(
"create temporary table undoLog (seq integer primary key, sql text)")
tables = self.s.column0( tables = self.s.column0(
"select name from sqlite_master where type = 'table'") "select name from sqlite_master where type = 'table'")
for table in tables: for table in tables:
@ -1699,7 +1701,7 @@ insert into undoLog values (null, 'insert into %(t)s (rowid""" % {'t': table}
self.redoStack = [] self.redoStack = []
def _latestUndoRow(self): def _latestUndoRow(self):
return self.s.scalar("select coalesce(max(rowid), 0) from undoLog") return self.s.scalar("select max(rowid) from undoLog")
def _undoredo(self, src, dst): def _undoredo(self, src, dst):
self.s.flush() self.s.flush()
@ -1716,7 +1718,7 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
newstart = self._latestUndoRow() newstart = self._latestUndoRow()
for s in sql: for s in sql:
#print "--", s.encode("utf-8")[0:30] #print "--", s.encode("utf-8")[0:30]
self.s.statement(s) self.s.execute(s)
newend = self._latestUndoRow() newend = self._latestUndoRow()
dst.append([u[0], newstart, newend]) dst.append([u[0], newstart, newend])
@ -2169,6 +2171,13 @@ where interval < 1""")
deck.s.commit() deck.s.commit()
DeckStorage._addIndices(deck) DeckStorage._addIndices(deck)
deck.s.statement("analyze") deck.s.statement("analyze")
if deck.version < 19:
# permanent undo log causes various problems, revert to temp
deck.s.statement("drop table undoLog")
deck.version = 19
deck.s.commit()
deck.s.statement("vacuum")
deck.s.statement("analyze")
return deck return deck
_upgradeDeck = staticmethod(_upgradeDeck) _upgradeDeck = staticmethod(_upgradeDeck)