Fix case changing even when allow_case_changes=False when setting

series/tags/publisher and the value being set is the only instance in
the db. Also rationalize the way books_to_refresh works.
This commit is contained in:
Kovid Goyal 2013-07-13 19:04:42 +05:30
parent 2dec08b6fb
commit 69c3f37f33

View File

@ -2423,7 +2423,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
if not authors: if not authors:
authors = [_('Unknown')] authors = [_('Unknown')]
self.conn.execute('DELETE FROM books_authors_link WHERE book=?',(id,)) self.conn.execute('DELETE FROM books_authors_link WHERE book=?',(id,))
books_to_refresh = set([]) books_to_refresh = {id}
final_authors = [] final_authors = []
for a in authors: for a in authors:
case_change = False case_change = False
@ -2615,10 +2615,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
def set_publisher(self, id, publisher, notify=True, commit=True, def set_publisher(self, id, publisher, notify=True, commit=True,
allow_case_change=False): allow_case_change=False):
self.conn.execute('DELETE FROM books_publishers_link WHERE book=?',(id,)) self.conn.execute('DELETE FROM books_publishers_link WHERE book=?',(id,))
self.conn.execute('''DELETE FROM publishers WHERE (SELECT COUNT(id) books_to_refresh = {id}
FROM books_publishers_link
WHERE publisher=publishers.id) < 1''')
books_to_refresh = set([])
if publisher: if publisher:
case_change = False case_change = False
if not isinstance(publisher, unicode): if not isinstance(publisher, unicode):
@ -2634,6 +2631,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
case_change = True case_change = True
else: else:
publisher = cur_name publisher = cur_name
books_to_refresh = set()
else: else:
aid = self.conn.execute('''INSERT INTO publishers(name) aid = self.conn.execute('''INSERT INTO publishers(name)
VALUES (?)''', (publisher,)).lastrowid VALUES (?)''', (publisher,)).lastrowid
@ -2643,6 +2641,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
bks = self.conn.get('''SELECT book FROM books_publishers_link bks = self.conn.get('''SELECT book FROM books_publishers_link
WHERE publisher=?''', (aid,)) WHERE publisher=?''', (aid,))
books_to_refresh |= set([bk[0] for bk in bks]) books_to_refresh |= set([bk[0] for bk in bks])
self.conn.execute('''DELETE FROM publishers WHERE (SELECT COUNT(id)
FROM books_publishers_link
WHERE publisher=publishers.id) < 1''')
self.dirtied(set([id])|books_to_refresh, commit=False) self.dirtied(set([id])|books_to_refresh, commit=False)
if commit: if commit:
self.conn.commit() self.conn.commit()
@ -3054,11 +3056,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
tags = [] tags = []
if not append: if not append:
self.conn.execute('DELETE FROM books_tags_link WHERE book=?', (id,)) self.conn.execute('DELETE FROM books_tags_link WHERE book=?', (id,))
self.conn.execute('''DELETE FROM tags WHERE (SELECT COUNT(id)
FROM books_tags_link WHERE tag=tags.id) < 1''')
otags = self.get_tags(id) otags = self.get_tags(id)
tags = self.cleanup_tags(tags) tags = self.cleanup_tags(tags)
books_to_refresh = set([]) books_to_refresh = {id}
for tag in (set(tags)-otags): for tag in (set(tags)-otags):
case_changed = False case_changed = False
tag = tag.strip() tag = tag.strip()
@ -3089,6 +3089,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
bks = self.conn.get('SELECT book FROM books_tags_link WHERE tag=?', bks = self.conn.get('SELECT book FROM books_tags_link WHERE tag=?',
(tid,)) (tid,))
books_to_refresh |= set([bk[0] for bk in bks]) books_to_refresh |= set([bk[0] for bk in bks])
self.conn.execute('''DELETE FROM tags WHERE (SELECT COUNT(id)
FROM books_tags_link WHERE tag=tags.id) < 1''')
self.dirtied(set([id])|books_to_refresh, commit=False) self.dirtied(set([id])|books_to_refresh, commit=False)
if commit: if commit:
self.conn.commit() self.conn.commit()
@ -3139,11 +3141,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
def set_series(self, id, series, notify=True, commit=True, allow_case_change=True): def set_series(self, id, series, notify=True, commit=True, allow_case_change=True):
self.conn.execute('DELETE FROM books_series_link WHERE book=?',(id,)) self.conn.execute('DELETE FROM books_series_link WHERE book=?',(id,))
self.conn.execute('''DELETE FROM series
WHERE (SELECT COUNT(id) FROM books_series_link
WHERE series=series.id) < 1''')
(series, idx) = self._get_series_values(series) (series, idx) = self._get_series_values(series)
books_to_refresh = set([]) books_to_refresh = {id}
if series: if series:
case_change = False case_change = False
if not isinstance(series, unicode): if not isinstance(series, unicode):
@ -3159,6 +3158,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
case_change = True case_change = True
else: else:
series = cur_name series = cur_name
books_to_refresh = set()
else: else:
aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid
self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid)) self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid))
@ -3168,6 +3168,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
bks = self.conn.get('SELECT book FROM books_series_link WHERE series=?', bks = self.conn.get('SELECT book FROM books_series_link WHERE series=?',
(aid,)) (aid,))
books_to_refresh |= set([bk[0] for bk in bks]) books_to_refresh |= set([bk[0] for bk in bks])
self.conn.execute('''DELETE FROM series
WHERE (SELECT COUNT(id) FROM books_series_link
WHERE series=series.id) < 1''')
self.dirtied([id], commit=False) self.dirtied([id], commit=False)
if commit: if commit:
self.conn.commit() self.conn.commit()