diff options
author | ByteHamster <info@bytehamster.com> | 2018-02-20 23:22:49 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2018-02-20 23:22:51 +0100 |
commit | f90d3c2e7b7197e8189729b421aa2fed63085d87 (patch) | |
tree | 52f7751593c45122a5344c021004d18dadabdddc /core/src/main/java/de | |
parent | c13acc624dcf680c00f629bccf580da3a5ae133d (diff) | |
download | AntennaPod-f90d3c2e7b7197e8189729b421aa2fed63085d87.zip |
Backup corrupted db
This might allow some forensics if #2463 happens. Maybe it also
allows to recover some of the files manually.
Diffstat (limited to 'core/src/main/java/de')
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 3fd46951d..5ff3f70df 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -3,7 +3,9 @@ package de.danoeh.antennapod.core.storage; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; +import android.database.DatabaseErrorHandler; import android.database.DatabaseUtils; +import android.database.DefaultDatabaseErrorHandler; import android.database.MergeCursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; @@ -13,13 +15,12 @@ import android.media.MediaMetadataRetriever; import android.text.TextUtils; import android.util.Log; +import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.event.ProgressEvent; @@ -35,6 +36,7 @@ import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.util.LongIntMap; import de.danoeh.antennapod.core.util.flattr.FlattrStatus; import de.greenrobot.event.EventBus; +import org.apache.commons.io.FileUtils; // TODO Remove media column from feeditem table @@ -1644,6 +1646,28 @@ public class PodDBAdapter { } /** + * Called when a database corruption happens + */ + public static class PodDbErrorHandler implements DatabaseErrorHandler { + @Override + public void onCorruption(SQLiteDatabase db) { + Log.e(TAG, "Database corrupted: " + db.getPath()); + + File dbPath = new File(db.getPath()); + File backupFolder = PodDBAdapter.context.getExternalFilesDir(null); + File backupFile = new File(backupFolder, "CorruptedDatabaseBackup.db"); + try { + FileUtils.copyFile(dbPath, backupFile); + Log.d(TAG, "Dumped database to " + backupFile.getPath()); + } catch (IOException e) { + Log.d(TAG, Log.getStackTraceString(e)); + } + + new DefaultDatabaseErrorHandler().onCorruption(db); // This deletes the database + } + } + + /** * Helper class for opening the Antennapod database. */ private static class PodDBHelper extends SQLiteOpenHelper { @@ -1661,7 +1685,7 @@ public class PodDBAdapter { */ public PodDBHelper(final Context context, final String name, final CursorFactory factory) { - super(context, name, factory, VERSION); + super(context, name, factory, VERSION, new PodDbErrorHandler()); this.context = context; } |