Пример #1
0
    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))
Пример #2
0
    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))
Пример #3
0
 def add_to_sort_history(self, items):
     self.sort_history = uniq((list(items) + list(self.sort_history)),
                              operator.itemgetter(0))[:tweaks['maximum_resort_levels']]