From 31467359620cbb35e6533f0a5e8c7b0b0eb2afc6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 21 Feb 2015 14:07:49 +0530 Subject: [PATCH] Fix regression in 2.20 that prevented some plugins from updating their preferences --- src/calibre/db/backend.py | 14 ++++++-------- src/calibre/db/tests/writing.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index abe07a12a1..5077d1f1a7 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -107,14 +107,12 @@ class DBPrefs(dict): # {{{ def __setitem__(self, key, val): if not self.disable_setting: - try: - current_val = self[key] - except KeyError: - current_val = object() - if val != current_val: - raw = self.to_raw(val) - self.db.execute('INSERT OR REPLACE INTO preferences (key,val) VALUES (?,?)', (key, raw)) - dict.__setitem__(self, key, val) + raw = self.to_raw(val) + with self.db.conn: + dbraw = self.db.execute('SELECT val FROM preferences WHERE key=?', (key,)).fetchone() + if dbraw != raw: + self.db.execute('INSERT OR REPLACE INTO preferences (key,val) VALUES (?,?)', (key, raw)) + dict.__setitem__(self, key, val) def set(self, key, val): self.__setitem__(key, val) diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index 175043ce6a..eca53bd86b 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -7,6 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import os from collections import namedtuple from functools import partial from io import BytesIO @@ -692,3 +693,18 @@ class WritingTest(BaseTest): ae(c.field_for('tags', 3), (t.id_map[lid], t.id_map[norm])) # }}} + def test_preferences(self): # {{{ + ' Test getting and setting of preferences, especially with mutable objects ' + cache = self.init_cache() + prefs = cache.backend.prefs + prefs['test mutable'] = [1, 2, 3] + a = prefs['test mutable'] + a.append(4) + self.assertIn(4, prefs['test mutable']) + prefs['test mutable'] = a + prefs.load_from_db() + self.assertIn(4, prefs['test mutable']) + before = os.stat(cache.backend.library_path) + prefs['test mutable'] = a + self.assertEqual(before, os.stat(cache.backend.library_path), 'The database was written to despite there being no change in value') + # }}}