diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 3aa4b09b50..c5a4bd5726 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -111,12 +111,12 @@ class DBPrefs(dict): # {{{ if not self.disable_setting: raw = self.to_raw(val) with self.db.conn: - dbraw = self.db.execute('SELECT val FROM preferences WHERE key=?', (key,)).fetchone() - if dbraw != (raw,): + dbraw = self.db.execute('SELECT id,val FROM preferences WHERE key=?', (key,)).fetchone() + if dbraw is None or dbraw[1] != raw: if dbraw is None: self.db.execute('INSERT INTO preferences (key,val) VALUES (?,?)', (key, raw)) 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) def set(self, key, val): diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index 9c764049f9..eefc682372 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -695,18 +695,20 @@ class WritingTest(BaseTest): def test_preferences(self): # {{{ ' Test getting and setting of preferences, especially with mutable objects ' cache = self.init_cache() + changes = [] + cache.backend.conn.setupdatehook(lambda typ, dbname, tblname, rowid: changes.append(rowid)) prefs = cache.backend.prefs prefs['test mutable'] = [1, 2, 3] + self.assertEqual(len(changes), 1) a = prefs['test mutable'] a.append(4) self.assertIn(4, prefs['test mutable']) prefs['test mutable'] = a + self.assertEqual(len(changes), 2) prefs.load_from_db() self.assertIn(4, prefs['test mutable']) - changes = [] - cache.backend.conn.setupdatehook(lambda typ, dbname, tblname, rowid: changes.append(rowid)) - prefs['test mutable'] = {k:k for k in range(4)} - self.assertEqual(len(changes), 1) - 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') + prefs['test mutable'] = {k:k for k in range(10)} + self.assertEqual(len(changes), 3) + prefs['test mutable'] = {k:k for k in reversed(range(10))} + self.assertEqual(len(changes), 3, 'The database was written to despite there being no change in value') # }}}