diff --git a/src/org/geometerplus/android/fbreader/library/SQLiteBooksDatabase.java b/src/org/geometerplus/android/fbreader/library/SQLiteBooksDatabase.java index 554794397..13c36c4e7 100644 --- a/src/org/geometerplus/android/fbreader/library/SQLiteBooksDatabase.java +++ b/src/org/geometerplus/android/fbreader/library/SQLiteBooksDatabase.java @@ -61,7 +61,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase { private void migrate(Context context) { final int version = myDatabase.getVersion(); - final int currentVersion = 16; + final int currentVersion = 17; if (version >= currentVersion) { return; } @@ -102,6 +102,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase { updateTables14(); case 15: updateTables15(); + case 16: + updateTables16(); } myDatabase.setTransactionSuccessful(); myDatabase.endTransaction(); @@ -174,9 +176,9 @@ public final class SQLiteBooksDatabase extends BooksDatabase { } @Override - protected Map loadBooks(FileInfoSet infos) { + protected Map loadBooks(FileInfoSet infos, boolean existing) { Cursor cursor = myDatabase.rawQuery( - "SELECT book_id,file_id,title,encoding,language FROM Books", null + "SELECT book_id,file_id,title,encoding,language FROM Books WHERE `exists` = " + (existing ? 1 : 0), null ); final HashMap booksById = new HashMap(); final HashMap booksByFileId = new HashMap(); @@ -252,7 +254,29 @@ public final class SQLiteBooksDatabase extends BooksDatabase { return booksByFileId; } + @Override + protected void setExistingFlag(Collection books, boolean flag) { + if (books.isEmpty()) { + return; + } + final StringBuilder bookSet = new StringBuilder("("); + boolean first = true; + for (Book b : books) { + if (first) { + first = false; + } else { + bookSet.append(","); + } + bookSet.append(b.getId()); + } + bookSet.append(")"); + myDatabase.execSQL( + "UPDATE Books SET `exists` = " + (flag ? 1 : 0) + " WHERE book_id IN " + bookSet + ); + } + private SQLiteStatement myUpdateBookInfoStatement; + @Override protected void updateBookInfo(long bookId, long fileId, String encoding, String language, String title) { if (myUpdateBookInfoStatement == null) { myUpdateBookInfoStatement = myDatabase.compileStatement( @@ -1186,4 +1210,10 @@ public final class SQLiteBooksDatabase extends BooksDatabase { "hyperlink_id TEXT NOT NULL," + "CONSTRAINT VisitedHyperlinks_Unique UNIQUE (book_id, hyperlink_id))"); } + + private void updateTables16() { + myDatabase.execSQL( + "ALTER TABLE Books ADD COLUMN `exists` INTEGER DEFAULT 1" + ); + } } diff --git a/src/org/geometerplus/fbreader/library/BooksDatabase.java b/src/org/geometerplus/fbreader/library/BooksDatabase.java index 50b125921..f7624221a 100644 --- a/src/org/geometerplus/fbreader/library/BooksDatabase.java +++ b/src/org/geometerplus/fbreader/library/BooksDatabase.java @@ -56,7 +56,8 @@ public abstract class BooksDatabase { protected abstract void executeAsATransaction(Runnable actions); // returns map fileId -> book - protected abstract Map loadBooks(FileInfoSet infos); + protected abstract Map loadBooks(FileInfoSet infos, boolean existing); + protected abstract void setExistingFlag(Collection books, boolean flag); protected abstract Book loadBook(long bookId); protected abstract void reloadBook(Book book); protected abstract Book loadBookByFile(long fileId, ZLFile file); diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index c0ef28cbb..68cfdc6a7 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -209,7 +209,7 @@ public final class Library { FileInfoSet fileInfos = new FileInfoSet(); - final Map savedBooks = BooksDatabase.Instance().loadBooks(fileInfos); + final Map savedBooks = BooksDatabase.Instance().loadBooks(fileInfos, true); for (ZLPhysicalFile file : physicalFilesList) { // TODO: better value for this flag