Kobo driver: Improve performance when a large number of shelves are created on the device. Fixes #1066633 (Perfomance issues with kobo driver and shelves)

This commit is contained in:
Kovid Goyal 2012-10-17 18:43:03 +05:30
parent 85212fb0c1
commit eeeba5e40f
2 changed files with 24 additions and 17 deletions

View File

@ -58,6 +58,7 @@ class Book(Book_):
self.datetime = time.gmtime() self.datetime = time.gmtime()
self.contentID = None self.contentID = None
self.current_collections = []
if thumbnail_name is not None: if thumbnail_name is not None:
self.thumbnail = ImageWrapper(thumbnail_name) self.thumbnail = ImageWrapper(thumbnail_name)
@ -250,4 +251,3 @@ class KTCollectionsBookList(CollectionsBookList):
# debug_print("KTCollectionsBookList:is_debugging - is_debugging=", is_debugging) # debug_print("KTCollectionsBookList:is_debugging - is_debugging=", is_debugging)
return is_debugging return is_debugging

View File

@ -33,11 +33,11 @@ class KOBO(USBMS):
gui_name = 'Kobo Reader' gui_name = 'Kobo Reader'
description = _('Communicate with the Kobo Reader') description = _('Communicate with the Kobo Reader')
author = 'Timothy Legge and David Forrester' author = 'Timothy Legge and David Forrester'
version = (2, 0, 1) version = (2, 0, 2)
dbversion = 0 dbversion = 0
fwversion = 0 fwversion = 0
supported_dbversion = 62 supported_dbversion = 65
has_kepubs = False has_kepubs = False
supported_platforms = ['windows', 'osx', 'linux'] supported_platforms = ['windows', 'osx', 'linux']
@ -217,7 +217,7 @@ class KOBO(USBMS):
# print 'update_metadata_item returned true' # print 'update_metadata_item returned true'
changed = True changed = True
else: else:
debug_print(" Strange: The file: ", prefix, lpath, " does mot exist!") debug_print(" Strange: The file: ", prefix, lpath, " does mot exist!")
if lpath in playlist_map and \ if lpath in playlist_map and \
playlist_map[lpath] not in bl[idx].device_collections: playlist_map[lpath] not in bl[idx].device_collections:
bl[idx].device_collections = playlist_map.get(lpath,[]) bl[idx].device_collections = playlist_map.get(lpath,[])
@ -841,6 +841,14 @@ class KOBO(USBMS):
# debug_print('Finished update_device_database_collections', collections_attributes) # debug_print('Finished update_device_database_collections', collections_attributes)
def get_collections_attributes(self):
collections = []
opts = self.settings()
if opts.extra_customization and len(opts.extra_customization[self.OPT_COLLECTIONS]) > 0:
collections = [x.lower().strip() for x in opts.extra_customization[self.OPT_COLLECTIONS].split(',')]
return collections
def sync_booklists(self, booklists, end_session=True): def sync_booklists(self, booklists, end_session=True):
# debug_print('KOBO: started sync_booklists') # debug_print('KOBO: started sync_booklists')
paths = self.get_device_paths() paths = self.get_device_paths()
@ -853,12 +861,7 @@ class KOBO(USBMS):
blists[i] = booklists[i] blists[i] = booklists[i]
except IndexError: except IndexError:
pass pass
opts = self.settings() collections = self.get_collections_attributes()
if opts.extra_customization:
collections = [x.lower().strip() for x in
opts.extra_customization[self.OPT_COLLECTIONS].split(',')]
else:
collections = []
#debug_print('KOBO: collection fields:', collections) #debug_print('KOBO: collection fields:', collections)
for i, blist in blists.items(): for i, blist in blists.items():
@ -1447,6 +1450,7 @@ class KOBOTOUCH(KOBO):
if lpath in playlist_map: if lpath in playlist_map:
bl[idx].device_collections = playlist_map.get(lpath,[]) bl[idx].device_collections = playlist_map.get(lpath,[])
bl[idx].current_collections = bl[idx].device_collections
changed = True changed = True
if show_debug: if show_debug:
@ -1483,6 +1487,7 @@ class KOBOTOUCH(KOBO):
# print 'Update booklist' # print 'Update booklist'
book.device_collections = playlist_map.get(lpath,[])# if lpath in playlist_map else [] book.device_collections = playlist_map.get(lpath,[])# if lpath in playlist_map else []
book.current_collections = bl[idx].device_collections
book.contentID = ContentID book.contentID = ContentID
# debug_print('KoboTouch:update_booklist - title=', title, 'book.device_collections', book.device_collections) # debug_print('KoboTouch:update_booklist - title=', title, 'book.device_collections', book.device_collections)
@ -1944,6 +1949,7 @@ class KOBOTOUCH(KOBO):
if self.supports_bookshelves(): if self.supports_bookshelves():
debug_print("KoboTouch:update_device_database_collections - managing bookshelves.") debug_print("KoboTouch:update_device_database_collections - managing bookshelves.")
if bookshelf_attribute: if bookshelf_attribute:
debug_print("KoboTouch:update_device_database_collections - bookshelf_attribute=", bookshelf_attribute)
for book in booklists: for book in booklists:
if book.application_id is not None: if book.application_id is not None:
# debug_print("KoboTouch:update_device_database_collections - about to remove a book from shelves book.title=%s" % book.title) # debug_print("KoboTouch:update_device_database_collections - about to remove a book from shelves book.title=%s" % book.title)
@ -1958,11 +1964,7 @@ class KOBOTOUCH(KOBO):
def rebuild_collections(self, booklist, oncard): def rebuild_collections(self, booklist, oncard):
debug_print("KoboTouch:rebuild_collections") debug_print("KoboTouch:rebuild_collections")
collections_attributes = [] collections_attributes = self.get_collections_attributes()
opts = self.settings()
if opts.extra_customization:
collections_attributes = [x.strip() for x in
opts.extra_customization[self.OPT_COLLECTIONS].split(',')]
debug_print('KoboTouch:rebuild_collections: collection fields:', collections_attributes) debug_print('KoboTouch:rebuild_collections: collection fields:', collections_attributes)
self.update_device_database_collections(booklist, collections_attributes, oncard) self.update_device_database_collections(booklist, collections_attributes, oncard)
@ -2087,11 +2089,16 @@ class KOBOTOUCH(KOBO):
def remove_book_from_device_bookshelves(self, connection, book): def remove_book_from_device_bookshelves(self, connection, book):
show_debug = self.is_debugging_title(book.title)# or True show_debug = self.is_debugging_title(book.title)# or True
remove_shelf_list = set(book.current_collections) - set(book.device_collections) - set(["Im_Reading", "Read", "Closed"])
if show_debug: if show_debug:
debug_print('KoboTouch:remove_book_from_device_bookshelves - book.in_library="%s"'%book.application_id) debug_print('KoboTouch:remove_book_from_device_bookshelves - book.application_id="%s"'%book.application_id)
debug_print('KoboTouch:remove_book_from_device_bookshelves - book.contentID="%s"'%book.contentID) debug_print('KoboTouch:remove_book_from_device_bookshelves - book.contentID="%s"'%book.contentID)
debug_print('KoboTouch:remove_book_from_device_bookshelves - book.device_collections=', book.device_collections) debug_print('KoboTouch:remove_book_from_device_bookshelves - book.device_collections=', book.device_collections)
debug_print('KoboTouch:remove_book_from_device_bookshelves - remove_shelf_list=', remove_shelf_list)
if len(remove_shelf_list) == 0:
return
query = 'DELETE FROM ShelfContent WHERE ContentId = ?' query = 'DELETE FROM ShelfContent WHERE ContentId = ?'