Merge pull request #564 from Valodim/db-backup

Db backup
This commit is contained in:
Dominik Schürmann 2014-04-14 13:12:55 +02:00
commit d703a1cb0c
3 changed files with 95 additions and 10 deletions

View File

@ -36,6 +36,9 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class KeychainDatabase extends SQLiteOpenHelper {
@ -179,10 +182,6 @@ public class KeychainDatabase extends SQLiteOpenHelper {
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
// TODO remove, once we remove the "always migrate" debug stuff
// db.execSQL("DROP TABLE user_ids;");
db.execSQL(CREATE_USER_IDS);
db.execSQL(CREATE_CERTS);
}
}
@ -205,7 +204,8 @@ public class KeychainDatabase extends SQLiteOpenHelper {
for(String db : dbs) {
if(db.equals("apg.db")) {
hasApgDb = true;
break;
} else if(db.equals("apg_old.db")) {
Log.d(Constants.TAG, "Found apg_old.db");
}
}
}
@ -283,9 +283,12 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
}
// Move to a different file (but don't delete, just to be safe)
Log.d(Constants.TAG, "All done - moving apg.db to apg_old.db");
context.getDatabasePath("apg.db").renameTo(context.getDatabasePath("apg_old.db"));
} catch(IOException e) {
Log.e(Constants.TAG, "Error importing apg db!", e);
return;
Log.e(Constants.TAG, "Error importing apg.db!", e);
} finally {
if(c != null) {
c.close();
@ -295,9 +298,45 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
}
// TODO delete old db, if we are sure this works
// context.deleteDatabase("apg.db");
Log.d(Constants.TAG, "All done, (not) deleting apg.db");
}
private static void copy(File in, File out) throws IOException {
FileInputStream ss = new FileInputStream(in);
FileOutputStream ds = new FileOutputStream(out);
byte[] buf = new byte[512];
while(ss.available() > 0) {
int count = ss.read(buf, 0, 512);
ds.write(buf, 0, count);
}
}
public static void debugRead(Context context) throws IOException {
if(!Constants.DEBUG) {
return;
}
File in = context.getDatabasePath("debug.db");
File out = context.getDatabasePath("openkeychain.db");
if(!in.canRead()) {
throw new IOException("Cannot read " + in.getName());
}
if(!out.canRead()) {
throw new IOException("Cannot write " + out.getName());
}
copy(in, out);
}
public static void debugWrite(Context context) throws IOException {
if(!Constants.DEBUG) {
return;
}
File in = context.getDatabasePath("openkeychain.db");
File out = context.getDatabasePath("debug.db");
if(!in.canRead()) {
throw new IOException("Cannot read " + in.getName());
}
if(!out.canRead()) {
throw new IOException("Cannot write " + out.getName());
}
copy(in, out);
}
}

View File

@ -22,9 +22,16 @@ import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
public class KeyListActivity extends DrawerActivity {
@ -46,6 +53,12 @@ public class KeyListActivity extends DrawerActivity {
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.key_list, menu);
if(Constants.DEBUG) {
menu.findItem(R.id.menu_key_list_debug_read).setVisible(true);
menu.findItem(R.id.menu_key_list_debug_write).setVisible(true);
}
return true;
}
@ -68,6 +81,27 @@ public class KeyListActivity extends DrawerActivity {
mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
return true;
case R.id.menu_key_list_debug_read:
try {
KeychainDatabase.debugRead(this);
AppMsg.makeText(this, "Restored from backup", AppMsg.STYLE_CONFIRM).show();
getContentResolver().notifyChange(KeychainContract.KeyRings.CONTENT_URI, null);
} catch(IOException e) {
Log.e(Constants.TAG, "IO Error", e);
AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show();
}
return true;
case R.id.menu_key_list_debug_write:
try {
KeychainDatabase.debugWrite(this);
AppMsg.makeText(this, "Backup successful", AppMsg.STYLE_CONFIRM).show();
} catch(IOException e) {
Log.e(Constants.TAG, "IO Error", e);
AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show();
}
return true;
default:
return super.onOptionsItemSelected(item);
}

View File

@ -31,4 +31,16 @@
app:showAsAction="never"
android:title="@string/menu_create_key_expert" />
<item
android:id="@+id/menu_key_list_debug_read"
app:showAsAction="never"
android:title="Debug / DB restore"
android:visible="false" />
<item
android:id="@+id/menu_key_list_debug_write"
app:showAsAction="never"
android:title="Debug / DB backup"
android:visible="false" />
</menu>