mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix library name case changing in GUI when switching to a library that was used in the server
This commit is contained in:
parent
41177af9bd
commit
c2e4e66dc5
@ -32,9 +32,7 @@ def samefile(a, b):
|
|||||||
def init_library(library_path, is_default_library):
|
def init_library(library_path, is_default_library):
|
||||||
db = Cache(
|
db = Cache(
|
||||||
create_backend(
|
create_backend(
|
||||||
library_path, load_user_formatter_functions=is_default_library
|
library_path, load_user_formatter_functions=is_default_library))
|
||||||
)
|
|
||||||
)
|
|
||||||
db.init()
|
db.init()
|
||||||
return db
|
return db
|
||||||
|
|
||||||
@ -59,6 +57,7 @@ class LibraryBroker(object):
|
|||||||
self.lock = Lock()
|
self.lock = Lock()
|
||||||
self.lmap = OrderedDict()
|
self.lmap = OrderedDict()
|
||||||
self.library_name_map = {}
|
self.library_name_map = {}
|
||||||
|
self.original_path_map = {}
|
||||||
seen = set()
|
seen = set()
|
||||||
for original_path in libraries:
|
for original_path in libraries:
|
||||||
path = canonicalize_path(original_path)
|
path = canonicalize_path(original_path)
|
||||||
@ -75,9 +74,11 @@ class LibraryBroker(object):
|
|||||||
library_id = library_id_from_path(original_path, self.lmap)
|
library_id = library_id_from_path(original_path, self.lmap)
|
||||||
self.lmap[library_id] = path
|
self.lmap[library_id] = path
|
||||||
self.library_name_map[library_id] = os.path.basename(original_path)
|
self.library_name_map[library_id] = os.path.basename(original_path)
|
||||||
|
self.original_path_map[path] = original_path
|
||||||
self.loaded_dbs = {}
|
self.loaded_dbs = {}
|
||||||
self.category_caches, self.search_caches, self.tag_browser_caches = (
|
self.category_caches, self.search_caches, self.tag_browser_caches = (
|
||||||
defaultdict(OrderedDict), defaultdict(OrderedDict), defaultdict(OrderedDict))
|
defaultdict(OrderedDict), defaultdict(OrderedDict),
|
||||||
|
defaultdict(OrderedDict))
|
||||||
|
|
||||||
def get(self, library_id=None):
|
def get(self, library_id=None):
|
||||||
with self:
|
with self:
|
||||||
@ -89,8 +90,7 @@ class LibraryBroker(object):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
self.loaded_dbs[library_id] = ans = self.init_library(
|
self.loaded_dbs[library_id] = ans = self.init_library(
|
||||||
path, library_id == self.default_library
|
path, library_id == self.default_library)
|
||||||
)
|
|
||||||
ans.new_api.server_library_id = library_id
|
ans.new_api.server_library_id = library_id
|
||||||
except Exception:
|
except Exception:
|
||||||
self.loaded_dbs[library_id] = None
|
self.loaded_dbs[library_id] = None
|
||||||
@ -98,6 +98,7 @@ class LibraryBroker(object):
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
def init_library(self, library_path, is_default_library):
|
def init_library(self, library_path, is_default_library):
|
||||||
|
library_path = self.original_path_map.get(library_path, library_path)
|
||||||
return init_library(library_path, is_default_library)
|
return init_library(library_path, is_default_library)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
@ -117,8 +118,11 @@ class LibraryBroker(object):
|
|||||||
|
|
||||||
def allowed_libraries(self, filter_func):
|
def allowed_libraries(self, filter_func):
|
||||||
with self:
|
with self:
|
||||||
allowed_names = filter_func(os.path.basename(l) for l in self.lmap.itervalues())
|
allowed_names = filter_func(
|
||||||
return OrderedDict(((lid, self.library_map[lid]) for lid, path in self.lmap.iteritems() if os.path.basename(path) in allowed_names))
|
os.path.basename(l) for l in self.lmap.itervalues())
|
||||||
|
return OrderedDict(((lid, self.library_map[lid])
|
||||||
|
for lid, path in self.lmap.iteritems()
|
||||||
|
if os.path.basename(path) in allowed_names))
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.lock.acquire()
|
self.lock.acquire()
|
||||||
@ -152,6 +156,7 @@ class GuiLibraryBroker(LibraryBroker):
|
|||||||
self.gui_library_changed(db)
|
self.gui_library_changed(db)
|
||||||
|
|
||||||
def init_library(self, library_path, is_default_library):
|
def init_library(self, library_path, is_default_library):
|
||||||
|
library_path = self.original_path_map.get(library_path, library_path)
|
||||||
return LibraryDatabase(library_path, is_second_db=True)
|
return LibraryDatabase(library_path, is_second_db=True)
|
||||||
|
|
||||||
def get(self, library_id=None):
|
def get(self, library_id=None):
|
||||||
@ -167,14 +172,19 @@ class GuiLibraryBroker(LibraryBroker):
|
|||||||
if samefile(library_path, path):
|
if samefile(library_path, path):
|
||||||
db = self.loaded_dbs.get(library_id)
|
db = self.loaded_dbs.get(library_id)
|
||||||
if db is None:
|
if db is None:
|
||||||
db = self.loaded_dbs[library_id] = self.init_library(path, False)
|
db = self.loaded_dbs[library_id] = self.init_library(
|
||||||
|
path, False)
|
||||||
db.new_api.server_library_id = library_id
|
db.new_api.server_library_id = library_id
|
||||||
return db
|
return db
|
||||||
|
# A new library
|
||||||
|
if library_path not in self.original_path_map:
|
||||||
|
self.original_path_map[library_path] = original_library_path
|
||||||
db = self.init_library(library_path, False)
|
db = self.init_library(library_path, False)
|
||||||
library_id = library_id_from_path(library_path, self.lmap)
|
library_id = library_id_from_path(library_path, self.lmap)
|
||||||
db.new_api.server_library_id = library_id
|
db.new_api.server_library_id = library_id
|
||||||
self.lmap[library_id] = library_path
|
self.lmap[library_id] = library_path
|
||||||
self.library_name_map[library_id] = os.path.basename(original_library_path)
|
self.library_name_map[library_id] = os.path.basename(
|
||||||
|
original_library_path)
|
||||||
self.loaded_dbs[library_id] = db
|
self.loaded_dbs[library_id] = db
|
||||||
return db
|
return db
|
||||||
|
|
||||||
@ -200,9 +210,12 @@ class GuiLibraryBroker(LibraryBroker):
|
|||||||
self.gui_library_id = library_id
|
self.gui_library_id = library_id
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
library_id = self.gui_library_id = library_id_from_path(newloc, self.lmap)
|
# A new library
|
||||||
|
library_id = self.gui_library_id = library_id_from_path(
|
||||||
|
newloc, self.lmap)
|
||||||
self.lmap[library_id] = newloc
|
self.lmap[library_id] = newloc
|
||||||
self.library_name_map[library_id] = os.path.basename(original_path)
|
self.library_name_map[library_id] = os.path.basename(original_path)
|
||||||
|
self.original_path_map[newloc] = original_path
|
||||||
self.loaded_dbs[library_id] = db
|
self.loaded_dbs[library_id] = db
|
||||||
db.new_api.server_library_id = library_id
|
db.new_api.server_library_id = library_id
|
||||||
if olddb is not None and samefile(path_for_db(olddb), path_for_db(db)):
|
if olddb is not None and samefile(path_for_db(olddb), path_for_db(db)):
|
||||||
@ -219,7 +232,8 @@ class GuiLibraryBroker(LibraryBroker):
|
|||||||
def _prune_loaded_dbs(self):
|
def _prune_loaded_dbs(self):
|
||||||
now = monotonic()
|
now = monotonic()
|
||||||
for library_id in tuple(self.loaded_dbs):
|
for library_id in tuple(self.loaded_dbs):
|
||||||
if library_id != self.gui_library_id and now - self.last_used_times[library_id] > EXPIRED_AGE:
|
if library_id != self.gui_library_id and now - self.last_used_times[
|
||||||
|
library_id] > EXPIRED_AGE:
|
||||||
db = self.loaded_dbs.pop(library_id)
|
db = self.loaded_dbs.pop(library_id)
|
||||||
db.close()
|
db.close()
|
||||||
db.break_cycles()
|
db.break_cycles()
|
||||||
@ -236,7 +250,8 @@ class GuiLibraryBroker(LibraryBroker):
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
self.lmap.pop(library_id, None), self.library_name_map.pop(library_id, None)
|
self.lmap.pop(library_id, None), self.library_name_map.pop(
|
||||||
|
library_id, None), self.original_path_map.pop(path, None)
|
||||||
db = self.loaded_dbs.pop(library_id, None)
|
db = self.loaded_dbs.pop(library_id, None)
|
||||||
if db is not None:
|
if db is not None:
|
||||||
db.close()
|
db.close()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user