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.provider.KeychainContract.CertsColumns;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
public class KeychainDatabase extends SQLiteOpenHelper { public class KeychainDatabase extends SQLiteOpenHelper {
@ -179,10 +182,6 @@ public class KeychainDatabase extends SQLiteOpenHelper {
if (!db.isReadOnly()) { if (!db.isReadOnly()) {
// Enable foreign key constraints // Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;"); 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) { for(String db : dbs) {
if(db.equals("apg.db")) { if(db.equals("apg.db")) {
hasApgDb = true; 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) { } catch(IOException e) {
Log.e(Constants.TAG, "Error importing apg db!", e); Log.e(Constants.TAG, "Error importing apg.db!", e);
return;
} finally { } finally {
if(c != null) { if(c != null) {
c.close(); 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.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ExportHelper; 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 { public class KeyListActivity extends DrawerActivity {
@ -46,6 +53,12 @@ public class KeyListActivity extends DrawerActivity {
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu); super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.key_list, 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; return true;
} }
@ -68,6 +81,27 @@ public class KeyListActivity extends DrawerActivity {
mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true); mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
return 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: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

View File

@ -31,4 +31,16 @@
app:showAsAction="never" app:showAsAction="never"
android:title="@string/menu_create_key_expert" /> 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> </menu>