def fix_case_duplicates(self, db): from calibre.db.write import uniq case_map = defaultdict(set) for item_id, val in self.id_map.iteritems(): case_map[icu_lower(val)].add(item_id) for v in case_map.itervalues(): if len(v) > 1: done_books = set() main_id = min(v) v.discard(main_id) for item_id in v: self.id_map.pop(item_id, None) books = self.col_book_map.pop(item_id, set()) for book_id in books: if book_id in done_books: continue done_books.add(book_id) orig = self.book_col_map.get(book_id, ()) if not orig: continue vals = uniq( tuple(main_id if x in v else x for x in orig)) self.book_col_map[book_id] = vals if len(orig) == len(vals): # We have a simple replacement db.conn.executemany( 'UPDATE {0} SET {1}=? WHERE {1}=? AND book=?'. format(self.link_table, self.metadata['link_column']), tuple((main_id, x, book_id) for x in v)) else: # duplicates db.conn.execute( 'DELETE FROM {0} WHERE book=?'.format( self.link_table), (book_id, )) db.conn.executemany( 'INSERT INTO {0} (book,{1}) VALUES (?,?)'. format(self.link_table, self.metadata['link_column']), tuple((book_id, x) for x in vals)) db.conn.executemany( 'DELETE FROM {0} WHERE id=?'.format( self.metadata['table']), tuple((x, ) for x in v))
def fix_case_duplicates(self, db): from calibre.db.write import uniq case_map = defaultdict(set) for item_id, val in self.id_map.iteritems(): case_map[icu_lower(val)].add(item_id) for v in case_map.itervalues(): if len(v) > 1: done_books = set() main_id = min(v) v.discard(main_id) for item_id in v: self.id_map.pop(item_id, None) books = self.col_book_map.pop(item_id, set()) for book_id in books: if book_id in done_books: continue done_books.add(book_id) orig = self.book_col_map.get(book_id, ()) if not orig: continue vals = uniq(tuple(main_id if x in v else x for x in orig)) self.book_col_map[book_id] = vals if len(orig) == len(vals): # We have a simple replacement db.conn.executemany( 'UPDATE {0} SET {1}=? WHERE {1}=? AND book=?'.format( self.link_table, self.metadata['link_column']), tuple((main_id, x, book_id) for x in v)) else: # duplicates db.conn.execute('DELETE FROM {0} WHERE book=?'.format(self.link_table), (book_id,)) db.conn.executemany( 'INSERT INTO {0} (book,{1}) VALUES (?,?)'.format(self.link_table, self.metadata['link_column']), tuple((book_id, x) for x in vals)) db.conn.executemany('DELETE FROM {0} WHERE id=?'.format(self.metadata['table']), tuple((x,) for x in v))
def add_to_sort_history(self, items): self.sort_history = uniq((list(items) + list(self.sort_history)), operator.itemgetter(0))[:tweaks['maximum_resort_levels']]