From 7f3d6f6b155d13d5bc240d3e47fe2fb303f64c4d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 30 May 2011 15:53:04 +0100 Subject: [PATCH 1/3] Add missing reverse apostrophe in search documentation --- src/calibre/manual/gui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index a4e18c2e07..e2758bc257 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -352,7 +352,7 @@ The syntax for searching for dates is:: If the date is ambiguous, the current locale is used for date comparison. For example, in an mm/dd/yyyy locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009. Some special date strings are available. The string ``today`` translates to today's date, whatever it is. The -strings `yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare +strings ``yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare to a date some number of days ago, for example: date:>10daysago, date:<=45daysago. You can search for books that have a format of a certain size like this:: From cb2a5e5d963f093656eeb71e9e29eb25b02ff76f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 30 May 2011 19:21:42 +0100 Subject: [PATCH 2/3] Cache metadata used for coloring. Set times on extracted zip files. --- src/calibre/gui2/library/models.py | 15 ++++++++++++++- src/calibre/utils/zipfile.py | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 554b104c34..cac0346761 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -87,6 +87,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.column_map = [] self.headers = {} self.alignment_map = {} + self.mi_cache = {} self.buffer_size = buffer self.metadata_backup = None self.bool_yes_icon = QIcon(I('ok.png')) @@ -172,11 +173,13 @@ class BooksModel(QAbstractTableModel): # {{{ def refresh_ids(self, ids, current_row=-1): + self.mi_cache = {} rows = self.db.refresh_ids(ids) if rows: self.refresh_rows(rows, current_row=current_row) def refresh_rows(self, rows, current_row=-1): + self.mi_cache = {} for row in rows: if row == current_row: self.new_bookdisplay_data.emit( @@ -206,6 +209,7 @@ class BooksModel(QAbstractTableModel): # {{{ return ret def count_changed(self, *args): + self.mi_cache = {} self.count_changed_signal.emit(self.db.count()) def row_indices(self, index): @@ -336,6 +340,10 @@ class BooksModel(QAbstractTableModel): # {{{ self.db.refresh(field=None) self.resort(reset=reset) + def reset(self): + self.mi_cache = {} + QAbstractTableModel.reset(self) + def resort(self, reset=True): if not self.db: return @@ -718,7 +726,12 @@ class BooksModel(QAbstractTableModel): # {{{ elif role == Qt.ForegroundRole: key = self.column_map[col] if key in self.column_color_map: - mi = self.db.get_metadata(self.id(index), index_is_id=True) + id_ = self.id(index) + if id_ in self.mi_cache: + mi = self.mi_cache[id_] + else: + mi = self.db.get_metadata(self.id(index), index_is_id=True) + self.mi_cache[id_] = mi fmt = self.column_color_map[key] try: color = composite_formatter.safe_format(fmt, mi, '', mi) diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index e0f453452c..33ee19bf4f 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -1123,6 +1123,9 @@ class ZipFile: targetpath = os.sep.join(components) with open(targetpath, 'wb') as target: shutil.copyfileobj(source, target) + mtime = time.localtime() + mtime = time.mktime(member.date_time + (0, 0) + (mtime.tm_isdst,)) + os.utime(targetpath, (mtime, mtime)) self.extract_mapping[member.filename] = targetpath return targetpath From 1237db4c87685548d8613d63a5c34a6f82ba6939 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 30 May 2011 19:47:30 +0100 Subject: [PATCH 3/3] Use the cache for the rest of the calls to get_metadata. --- src/calibre/gui2/library/models.py | 37 +++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index cac0346761..906d2979fa 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -173,10 +173,12 @@ class BooksModel(QAbstractTableModel): # {{{ def refresh_ids(self, ids, current_row=-1): - self.mi_cache = {} rows = self.db.refresh_ids(ids) if rows: self.refresh_rows(rows, current_row=current_row) + else: + self.mi_cache = {} + def refresh_rows(self, rows, current_row=-1): self.mi_cache = {} @@ -367,8 +369,20 @@ class BooksModel(QAbstractTableModel): # {{{ def count(self): return self.rowCount(None) + def get_and_cache_metadata(self, idx, index_is_id = False, get_cover=False, + get_user_categories=True): + if not index_is_id: + idx = self.db.id(idx) + if idx in self.mi_cache: + mi = self.mi_cache[idx] + else: + mi = self.db.get_metadata(idx, index_is_id=True, get_cover=get_cover, + get_user_categories=get_user_categories) + self.mi_cache[idx] = mi + return mi + def get_book_display_info(self, idx): - mi = self.db.get_metadata(idx) + mi = self.get_and_cache_metadata(idx) mi.size = mi.book_size mi.cover_data = ('jpg', self.cover(idx)) mi.id = self.db.id(idx) @@ -395,7 +409,7 @@ class BooksModel(QAbstractTableModel): # {{{ def metadata_for(self, ids): ans = [] for id in ids: - mi = self.db.get_metadata(id, index_is_id=True, get_cover=True) + mi = self.get_and_cache_metadata(id, index_is_id=True, get_cover=True) ans.append(mi) return ans @@ -404,7 +418,7 @@ class BooksModel(QAbstractTableModel): # {{{ if not rows_are_ids: rows = [self.db.id(row.row()) for row in rows] for id in rows: - mi = self.db.get_metadata(id, index_is_id=True) + mi = self.get_and_cache_metadata(id, index_is_id=True) _full_metadata.append(mi) au = authors_to_string(mi.authors if mi.authors else [_('Unknown')]) tags = mi.tags if mi.tags else [] @@ -460,8 +474,9 @@ class BooksModel(QAbstractTableModel): # {{{ pt.seek(0) if set_metadata: try: - _set_metadata(pt, self.db.get_metadata(id, get_cover=True, index_is_id=True), - format) + _set_metadata(pt, self.get_and_cache_metadata(id, + get_cover=True, index_is_id=True), + format) except: traceback.print_exc() pt.close() @@ -505,7 +520,7 @@ class BooksModel(QAbstractTableModel): # {{{ pt.flush() pt.seek(0) if set_metadata: - _set_metadata(pt, self.db.get_metadata(row, get_cover=True), + _set_metadata(pt, self.get_and_cache_metadata(row, get_cover=True), format) pt.close() if paths else pt.seek(0) ans.append(pt) @@ -726,12 +741,8 @@ class BooksModel(QAbstractTableModel): # {{{ elif role == Qt.ForegroundRole: key = self.column_map[col] if key in self.column_color_map: - id_ = self.id(index) - if id_ in self.mi_cache: - mi = self.mi_cache[id_] - else: - mi = self.db.get_metadata(self.id(index), index_is_id=True) - self.mi_cache[id_] = mi + mi = self.get_and_cache_metadata(index.row(), + get_user_categories=False) fmt = self.column_color_map[key] try: color = composite_formatter.safe_format(fmt, mi, '', mi)