From 14b348b3912962d7333ccd795e46bdad09ff18bb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 24 Aug 2013 11:22:22 +0530 Subject: [PATCH] newdb: Handle damaged one-one text tables Ignore text records in the database that are damaged, instead of erroring out. Lets the rest of the data be used. Fixes #1215981 [calibre 1.0 can't find database](https://bugs.launchpad.net/calibre/+bug/1215981) --- src/calibre/db/tables.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/calibre/db/tables.py b/src/calibre/db/tables.py index c8d974fcf7..6d578e788c 100644 --- a/src/calibre/db/tables.py +++ b/src/calibre/db/tables.py @@ -92,7 +92,14 @@ class OneToOneTable(Table): query = db.conn.execute('SELECT {0}, {1} FROM {2}'.format(idcol, self.metadata['column'], self.metadata['table'])) if self.unserialize is None: - self.book_col_map = dict(query) + try: + self.book_col_map = dict(query) + except UnicodeDecodeError: + # The db is damaged, try to work around it by ignoring + # failures to decode utf-8 + query = db.conn.execute('SELECT {0}, cast({1} as blob) FROM {2}'.format(idcol, + self.metadata['column'], self.metadata['table'])) + self.book_col_map = {k:bytes(val).decode('utf-8', 'ignore') for k, val in query} else: us = self.unserialize self.book_col_map = {book_id:us(val) for book_id, val in query}