/** * Open a database connection to an ".anki" SQLite file. */ public DB(String ankiFilename) { SupportSQLiteOpenHelper.Configuration configuration = SupportSQLiteOpenHelper.Configuration.builder(AnkiDroidApp.getInstance()) .name(ankiFilename) .callback(getDBCallback()) .build(); SupportSQLiteOpenHelper helper = getSqliteOpenHelperFactory().create(configuration); mDatabase = helper.getWritableDatabase(); // TODO: remove this once everyone has stopped using old AnkiDroid clients with WAL (API >= 16) CompatHelper.getCompat().disableDatabaseWriteAheadLogging(mDatabase); mDatabase.query("PRAGMA synchronous = 2", null); mMod = false; }
private void dekey(Callable<?> decrypter) throws Exception { SafeHelperFactory factory= SafeHelperFactory.fromUser(new SpannableStringBuilder(PASSPHRASE)); SupportSQLiteOpenHelper helper= factory.create(InstrumentationRegistry.getTargetContext(), DB_NAME, new Callback(1)); SupportSQLiteDatabase db=helper.getWritableDatabase(); assertOriginalContent(db); db.close(); final Context ctxt=InstrumentationRegistry.getTargetContext(); decrypter.call(); SQLiteDatabase plainDb= SQLiteDatabase.openDatabase(ctxt.getDatabasePath(DB_NAME).getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); assertOriginalContent(plainDb); plainDb.close(); }
@Test public void wal() throws IOException { SafeHelperFactory factory= SafeHelperFactory.fromUser(new SpannableStringBuilder(PASSPHRASE)); SupportSQLiteOpenHelper helper= factory.create(InstrumentationRegistry.getTargetContext(), DB_NAME, new Callback(1)); SupportSQLiteDatabase db=helper.getWritableDatabase(); assertFalse(db.isWriteAheadLoggingEnabled()); assertTrue(db.enableWriteAheadLogging()); assertTrue(db.isWriteAheadLoggingEnabled()); db.close(); factory=SafeHelperFactory.fromUser(new SpannableStringBuilder(PASSPHRASE)); helper= factory.create(InstrumentationRegistry.getTargetContext(), DB_NAME, new Callback(1)); db=helper.getWritableDatabase(); assertTrue(db.isWriteAheadLoggingEnabled()); db.disableWriteAheadLogging(); assertFalse(db.isWriteAheadLoggingEnabled()); db.close(); }
@Test public void rekey() throws IOException { SafeHelperFactory factory= SafeHelperFactory.fromUser(new SpannableStringBuilder("sekrit")); SupportSQLiteOpenHelper helper= factory.create(InstrumentationRegistry.getTargetContext(), DB_NAME, new Callback(1)); SupportSQLiteDatabase db=helper.getWritableDatabase(); assertOriginalContent(db); SafeHelperFactory.rekey(db, new SpannableStringBuilder(PASSPHRASE)); assertOriginalContent(db); db.execSQL("UPDATE foo SET bar=?, goo=?", new Object[] {3, "four"}); assertUpdatedContent(db); db.close(); factory=SafeHelperFactory.fromUser(new SpannableStringBuilder(PASSPHRASE)); helper=factory.create(InstrumentationRegistry.getTargetContext(), DB_NAME, new Callback(1)); db=helper.getWritableDatabase(); assertUpdatedContent(db); }
@Test public void notQuiteAsSafeButStillNice() { final Context ctxt=InstrumentationRegistry.getTargetContext(); android.database.sqlite.SQLiteOpenHelper helper = new LessSafeNonRoomHelper(ctxt); helper.getWritableDatabase(); helper.close(); ImportingLessSafeDatabase room = ImportingLessSafeDatabase.gimme(ctxt); SupportSQLiteDatabase db=room.getOpenHelper().getWritableDatabase(); try { assertTrue(db.isWriteAheadLoggingEnabled()); } finally { room.close(); } }
@Test public void safe() { final Context ctxt=InstrumentationRegistry.getTargetContext(); SQLiteDatabase.loadLibs(ctxt); SQLiteOpenHelper helper = new SafeNonRoomHelper(ctxt); helper.getWritableDatabase(PASSPHRASE); helper.close(); ImportingSafeDatabase room = ImportingSafeDatabase.gimme(ctxt); SupportSQLiteDatabase db=room.getOpenHelper().getWritableDatabase(); try { assertTrue(db.isWriteAheadLoggingEnabled()); } finally { room.close(); } }