diff --git a/include/library.h b/include/library.h index 5c44cd8a2..9191b47d2 100644 --- a/include/library.h +++ b/include/library.h @@ -357,6 +357,7 @@ private: // functions std::vector getBookPropValueSet(BookStrPropMemFn p) const; BookIdCollection filterViaBookDB(const Filter& filter) const; void updateBookDB(const Book& book); + void dropReader(const std::string& bookId); }; } diff --git a/src/library.cpp b/src/library.cpp index c411f56f4..5caacc64c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -49,6 +49,13 @@ std::string normalizeText(const std::string& text) return removeAccents(text); } +bool booksReferToTheSameArchive(const Book& book1, const Book& book2) +{ + return book1.isPathValid() + && book2.isPathValid() + && book1.getPath() == book2.getPath(); +} + } // unnamed namespace class Library::BookDB : public Xapian::WritableDatabase @@ -79,6 +86,9 @@ bool Library::addBook(const Book& book) updateBookDB(book); try { auto& oldbook = m_books.at(book.getId()); + if ( ! booksReferToTheSameArchive(oldbook, book) ) { + dropReader(book.getId()); + } oldbook.update(book); return false; } catch (std::out_of_range&) { @@ -104,12 +114,16 @@ bool Library::removeBookmark(const std::string& zimId, const std::string& url) } +void Library::dropReader(const std::string& id) +{ + m_readers.erase(id); + m_archives.erase(id); +} bool Library::removeBookById(const std::string& id) { m_bookDB->delete_document("Q" + id); - m_readers.erase(id); - m_archives.erase(id); + dropReader(id); return m_books.erase(id) == 1; }