Use the primary key for a small performance improvement when updating existing preference values

This commit is contained in:
Kovid Goyal 2015-02-21 15:07:28 +05:30
parent 6df6682870
commit 7f6d06709e
2 changed files with 11 additions and 9 deletions

View File

@ -111,12 +111,12 @@ class DBPrefs(dict): # {{{
if not self.disable_setting: if not self.disable_setting:
raw = self.to_raw(val) raw = self.to_raw(val)
with self.db.conn: with self.db.conn:
dbraw = self.db.execute('SELECT val FROM preferences WHERE key=?', (key,)).fetchone() dbraw = self.db.execute('SELECT id,val FROM preferences WHERE key=?', (key,)).fetchone()
if dbraw != (raw,): if dbraw is None or dbraw[1] != raw:
if dbraw is None: if dbraw is None:
self.db.execute('INSERT INTO preferences (key,val) VALUES (?,?)', (key, raw)) self.db.execute('INSERT INTO preferences (key,val) VALUES (?,?)', (key, raw))
else: else:
self.db.execute('UPDATE preferences SET val=? WHERE key=?', (raw, key)) self.db.execute('UPDATE preferences SET val=? WHERE id=?', (raw, dbraw[0]))
dict.__setitem__(self, key, val) dict.__setitem__(self, key, val)
def set(self, key, val): def set(self, key, val):

View File

@ -695,18 +695,20 @@ class WritingTest(BaseTest):
def test_preferences(self): # {{{ def test_preferences(self): # {{{
' Test getting and setting of preferences, especially with mutable objects ' ' Test getting and setting of preferences, especially with mutable objects '
cache = self.init_cache() cache = self.init_cache()
changes = []
cache.backend.conn.setupdatehook(lambda typ, dbname, tblname, rowid: changes.append(rowid))
prefs = cache.backend.prefs prefs = cache.backend.prefs
prefs['test mutable'] = [1, 2, 3] prefs['test mutable'] = [1, 2, 3]
self.assertEqual(len(changes), 1)
a = prefs['test mutable'] a = prefs['test mutable']
a.append(4) a.append(4)
self.assertIn(4, prefs['test mutable']) self.assertIn(4, prefs['test mutable'])
prefs['test mutable'] = a prefs['test mutable'] = a
self.assertEqual(len(changes), 2)
prefs.load_from_db() prefs.load_from_db()
self.assertIn(4, prefs['test mutable']) self.assertIn(4, prefs['test mutable'])
changes = [] prefs['test mutable'] = {k:k for k in range(10)}
cache.backend.conn.setupdatehook(lambda typ, dbname, tblname, rowid: changes.append(rowid)) self.assertEqual(len(changes), 3)
prefs['test mutable'] = {k:k for k in range(4)} prefs['test mutable'] = {k:k for k in reversed(range(10))}
self.assertEqual(len(changes), 1) self.assertEqual(len(changes), 3, 'The database was written to despite there being no change in value')
prefs['test mutable'] = {k:k for k in range(4)}
self.assertEqual(len(changes), 1, 'The database was written to despite there being no change in value')
# }}} # }}}