diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 9d58ae4456..89184bedf9 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -3217,7 +3217,6 @@ books_series_link feeds if callable(callback): if callback(''): break - return duplicates def add_custom_book_data(self, book_id, name, val): @@ -3226,12 +3225,19 @@ books_series_link feeds raise ValueError('add_custom_book_data: no such book_id %d'%book_id) # Do the json encode first, in case it throws an exception s = json.dumps(val, default=to_json) - self.conn.execute('DELETE FROM books_plugin_data WHERE book=? AND name=?', - (book_id, name)) - self.conn.execute('''INSERT INTO books_plugin_data(book, name, val) + self.conn.execute('''INSERT OR REPLACE INTO books_plugin_data(book, name, val) VALUES(?, ?, ?)''', (book_id, name, s)) self.commit() + def add_multiple_custom_book_data(self, name, vals, delete_first=False): + if delete_first: + self.conn.execute('DELETE FROM books_plugin_data WHERE name=?', (name, )) + self.conn.executemany( + 'INSERT OR REPLACE INTO books_plugin_data (book, name, val) VALUES (?, ?, ?)', + [(book_id, name, json.dumps(val, default=to_json)) + for book_id, val in vals.iteritems()]) + self.commit() + def get_custom_book_data(self, book_id, name, default=None): try: s = self.conn.get('''select val FROM books_plugin_data @@ -3243,11 +3249,29 @@ books_series_link feeds pass return default + def get_all_custom_book_data(self, name, default=None): + try: + s = self.conn.get('''select book, val FROM books_plugin_data + WHERE name=?''', (name,)) + if s is None: + return default + res = {} + for r in s: + res[r[0]] = json.loads(r[1], object_hook=from_json) + return res + except: + pass + return default + def delete_custom_book_data(self, book_id, name): self.conn.execute('DELETE FROM books_plugin_data WHERE book=? AND name=?', (book_id, name)) self.commit() + def delete_all_custom_book_data(self, name): + self.conn.execute('DELETE FROM books_plugin_data WHERE name=?', (name, )) + self.commit() + def get_ids_for_custom_book_data(self, name): s = self.conn.get('''SELECT book FROM books_plugin_data WHERE name=?''', (name,)) return [x[0] for x in s]