package org.ebookdroid.common.settings.books; import org.ebookdroid.common.settings.types.DocumentViewMode; import org.ebookdroid.common.settings.types.PageAlign; import org.ebookdroid.core.PageIndex; import org.ebookdroid.core.curl.PageAnimationType; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; class DBAdapterV1 implements IDBAdapter { public static final int VERSION = 1; public static final String DB_BOOK_CREATE = "create table book_settings (" // Book file path + "book varchar(1024) primary key, " // Last update time + "last_updated integer not null, " // Current document page + "doc_page integer not null, " // Current view page - dependent on view mode + "view_page integer not null, " // Page zoom + "zoom integer not null, " // Single page mode on/off + "single_page integer not null, " // Page align + "page_align integer not null, " // Page animation type + "page_animation integer not null, " // Split pages on/off + "split_pages integer not null" + // ... ");"; public static final String DB_BOOK_GET_ALL = "SELECT book, last_updated, doc_page, view_page, zoom, single_page, page_align, page_animation, split_pages FROM book_settings where last_updated > 0 ORDER BY last_updated DESC"; public static final String DB_BOOK_GET_ONE = "SELECT book, last_updated, doc_page, view_page, zoom, single_page, page_align, page_animation, split_pages FROM book_settings WHERE book=?"; public static final String DB_BOOK_STORE = "INSERT OR REPLACE INTO book_settings (book, last_updated, doc_page, view_page, zoom, single_page, page_align, page_animation, split_pages) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; public static final String DB_BOOK_DEL = "DELETE FROM book_settings WHERE book=?"; public static final String DB_BOOK_CLEAR_RECENT = "UPDATE book_settings set last_updated = 0"; public static final String DB_BOOK_REMOVE_BOOK_FROM_RECENT = "UPDATE book_settings set last_updated = 0 WHERE book=?"; public static final String DB_BOOK_DROP = "DROP TABLE IF EXISTS book_settings"; protected final DBSettingsManager manager; public DBAdapterV1(final DBSettingsManager manager) { this.manager = manager; } @Override public void onCreate(final SQLiteDatabase db) { db.execSQL(DB_BOOK_CREATE); } @Override public void onDestroy(final SQLiteDatabase db) { db.execSQL(DB_BOOK_DROP); } @Override public Map<String, BookSettings> getAllBooks() { return getRecentBooks(true); } @Override public Map<String, BookSettings> getRecentBooks(final boolean all) { return getBookSettings(DB_BOOK_GET_ALL, all); } protected final Map<String, BookSettings> getBookSettings(final String query, final boolean all) { final Map<String, BookSettings> map = new LinkedHashMap<String, BookSettings>(); try { final SQLiteDatabase db = manager.getReadableDatabase(); try { final Cursor c = db.rawQuery(query, null); if (c != null) { try { for (boolean next = c.moveToFirst(); next; next = c.moveToNext()) { final BookSettings bs = createBookSettings(c); loadBookmarks(bs, db); map.put(bs.fileName, bs); if (!all) { break; } } } finally { close(c); } } } finally { manager.closeDatabase(db); } } catch (final Throwable th) { LCTX.e("Retrieving book settings failed: ", th); } return map; } @Override public BookSettings getBookSettings(final String fileName) { return getBookSettings(DB_BOOK_GET_ONE, fileName); } protected final BookSettings getBookSettings(final String query, final String fileName) { try { final SQLiteDatabase db = manager.getReadableDatabase(); try { final Cursor c = db.rawQuery(query, new String[] { fileName }); if (c != null) { try { if (c.moveToFirst()) { final BookSettings bs = createBookSettings(c); loadBookmarks(bs, db); return bs; } } finally { close(c); } } } finally { manager.closeDatabase(db); } } catch (final Throwable th) { LCTX.e("Retrieving book settings failed: ", th); } return null; } @Override public boolean storeBookSettings(final List<BookSettings> list) { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); for (final BookSettings bs : list) { if (bs.lastChanged > 0) { bs.lastUpdated = System.currentTimeMillis(); } if (LCTX.isDebugEnabled()) { LCTX.d("Store: " + bs.toJSON()); } storeBookSettings(bs, db); } db.setTransactionSuccessful(); return true; } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Update book settings failed: ", th); } return false; } @Override public final boolean restoreBookSettings(final Collection<BookSettings> c) { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); for (final BookSettings bs : c) { storeBookSettings(bs, db); } db.setTransactionSuccessful(); return true; } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Update book settings failed: ", th); } return false; } @Override public boolean deleteAllBookmarks() { return false; } @Override public boolean clearRecent() { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); db.execSQL(DB_BOOK_CLEAR_RECENT, new Object[] {}); db.setTransactionSuccessful(); return true; } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Update book settings failed: ", th); } return false; } @Override public boolean removeBookFromRecents(final BookSettings bs) { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); db.execSQL(DB_BOOK_REMOVE_BOOK_FROM_RECENT, new Object[] { bs.fileName }); db.setTransactionSuccessful(); return true; } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Removing book from recents failed: ", th); } return false; } @Override public void delete(final BookSettings current) { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); db.execSQL(DB_BOOK_DEL, new Object[] { current.fileName }); db.setTransactionSuccessful(); } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Delete book settings failed: ", th); } } @Override public boolean deleteAll() { try { final SQLiteDatabase db = manager.getWritableDatabase(); try { db.beginTransaction(); db.execSQL(DB_BOOK_DROP, new Object[] {}); onCreate(db); db.setTransactionSuccessful(); return true; } finally { endTransaction(db); } } catch (final Throwable th) { LCTX.e("Update book settings failed: ", th); } return false; } protected void storeBookSettings(final BookSettings bs, final SQLiteDatabase db) { final Object[] args = new Object[] { // File name bs.fileName, // Last update bs.lastUpdated, // Current document page bs.currentPage.docIndex, // Current view page bs.currentPage.viewIndex, // Current page zoom bs.zoom, // Single page on/off bs.viewMode == DocumentViewMode.SINGLE_PAGE ? 1 : 0, // Page align bs.pageAlign.ordinal(), // Page animation type bs.animationType.ordinal(), // Split pages on/off bs.splitPages ? 1 : 0 }; db.execSQL(DB_BOOK_STORE, args); updateBookmarks(bs, db); } protected BookSettings createBookSettings(final Cursor c) { int index = 0; final BookSettings bs = new BookSettings(c.getString(index++)); bs.lastUpdated = c.getLong(index++); bs.currentPage = new PageIndex(c.getInt(index++), c.getInt(index++)); bs.zoom = c.getInt(index++); bs.viewMode = c.getInt(index++) != 0 ? DocumentViewMode.SINGLE_PAGE : DocumentViewMode.VERTICALL_SCROLL; bs.pageAlign = PageAlign.values()[c.getInt(index++)]; bs.animationType = PageAnimationType.values()[c.getInt(index++)]; bs.splitPages = c.getInt(index++) != 0; return bs; } void updateBookmarks(final BookSettings bs, final SQLiteDatabase db) { } void loadBookmarks(final BookSettings book, final SQLiteDatabase db) { book.bookmarks.clear(); } void endTransaction(final SQLiteDatabase db) { try { db.endTransaction(); } catch (final Exception ex) { } manager.closeDatabase(db); } final void close(final Cursor c) { try { c.close(); } catch (final Exception ex) { } } }