android: Fix database update from older versions
This commit is contained in:
+80
-50
@@ -63,52 +63,68 @@ public class VpnProfileDataSource
|
|||||||
|
|
||||||
private static final int DATABASE_VERSION = 14;
|
private static final int DATABASE_VERSION = 14;
|
||||||
|
|
||||||
public static final String DATABASE_CREATE =
|
public static final DbColumn[] COLUMNS = new DbColumn[] {
|
||||||
"CREATE TABLE " + TABLE_VPNPROFILE + " (" +
|
new DbColumn(KEY_ID, "INTEGER PRIMARY KEY AUTOINCREMENT", 1),
|
||||||
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
|
new DbColumn(KEY_UUID, "TEXT UNIQUE", 9),
|
||||||
KEY_UUID + " TEXT UNIQUE," +
|
new DbColumn(KEY_NAME, "TEXT NOT NULL", 1),
|
||||||
KEY_NAME + " TEXT NOT NULL," +
|
new DbColumn(KEY_GATEWAY, "TEXT NOT NULL", 1),
|
||||||
KEY_GATEWAY + " TEXT NOT NULL," +
|
new DbColumn(KEY_VPN_TYPE, "TEXT NOT NULL", 3),
|
||||||
KEY_VPN_TYPE + " TEXT NOT NULL," +
|
new DbColumn(KEY_USERNAME, "TEXT", 1),
|
||||||
KEY_USERNAME + " TEXT," +
|
new DbColumn(KEY_PASSWORD, "TEXT", 1),
|
||||||
KEY_PASSWORD + " TEXT," +
|
new DbColumn(KEY_CERTIFICATE, "TEXT", 1),
|
||||||
KEY_CERTIFICATE + " TEXT," +
|
new DbColumn(KEY_USER_CERTIFICATE, "TEXT", 2),
|
||||||
KEY_USER_CERTIFICATE + " TEXT," +
|
new DbColumn(KEY_MTU, "INTEGER", 5),
|
||||||
KEY_MTU + " INTEGER," +
|
new DbColumn(KEY_PORT, "INTEGER", 5),
|
||||||
KEY_PORT + " INTEGER," +
|
new DbColumn(KEY_SPLIT_TUNNELING, "INTEGER", 7),
|
||||||
KEY_SPLIT_TUNNELING + " INTEGER," +
|
new DbColumn(KEY_LOCAL_ID, "TEXT", 8),
|
||||||
KEY_LOCAL_ID + " TEXT," +
|
new DbColumn(KEY_REMOTE_ID, "TEXT", 8),
|
||||||
KEY_REMOTE_ID + " TEXT," +
|
new DbColumn(KEY_EXCLUDED_SUBNETS, "TEXT", 10),
|
||||||
KEY_EXCLUDED_SUBNETS + " TEXT," +
|
new DbColumn(KEY_INCLUDED_SUBNETS, "TEXT", 11),
|
||||||
KEY_INCLUDED_SUBNETS + " TEXT," +
|
new DbColumn(KEY_SELECTED_APPS, "INTEGER", 12),
|
||||||
KEY_SELECTED_APPS + " INTEGER," +
|
new DbColumn(KEY_SELECTED_APPS_LIST, "TEXT", 12),
|
||||||
KEY_SELECTED_APPS_LIST + " TEXT," +
|
new DbColumn(KEY_NAT_KEEPALIVE, "INTEGER", 13),
|
||||||
KEY_NAT_KEEPALIVE + " INTEGER," +
|
new DbColumn(KEY_FLAGS, "INTEGER", 14),
|
||||||
KEY_FLAGS + " INTEGER" +
|
|
||||||
");";
|
|
||||||
private static final String[] ALL_COLUMNS = new String[] {
|
|
||||||
KEY_ID,
|
|
||||||
KEY_UUID,
|
|
||||||
KEY_NAME,
|
|
||||||
KEY_GATEWAY,
|
|
||||||
KEY_VPN_TYPE,
|
|
||||||
KEY_USERNAME,
|
|
||||||
KEY_PASSWORD,
|
|
||||||
KEY_CERTIFICATE,
|
|
||||||
KEY_USER_CERTIFICATE,
|
|
||||||
KEY_MTU,
|
|
||||||
KEY_PORT,
|
|
||||||
KEY_SPLIT_TUNNELING,
|
|
||||||
KEY_LOCAL_ID,
|
|
||||||
KEY_REMOTE_ID,
|
|
||||||
KEY_EXCLUDED_SUBNETS,
|
|
||||||
KEY_INCLUDED_SUBNETS,
|
|
||||||
KEY_SELECTED_APPS,
|
|
||||||
KEY_SELECTED_APPS_LIST,
|
|
||||||
KEY_NAT_KEEPALIVE,
|
|
||||||
KEY_FLAGS,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static final String[] ALL_COLUMNS = getColumns(DATABASE_VERSION);
|
||||||
|
|
||||||
|
private static String getDatabaseCreate(int version)
|
||||||
|
{
|
||||||
|
boolean first = true;
|
||||||
|
StringBuilder create = new StringBuilder("CREATE TABLE ");
|
||||||
|
create.append(TABLE_VPNPROFILE);
|
||||||
|
create.append(" (");
|
||||||
|
for (DbColumn column : COLUMNS)
|
||||||
|
{
|
||||||
|
if (column.Since <= version)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
{
|
||||||
|
create.append(",");
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
create.append(column.Name);
|
||||||
|
create.append(" ");
|
||||||
|
create.append(column.Type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
create.append(");");
|
||||||
|
return create.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] getColumns(int version)
|
||||||
|
{
|
||||||
|
ArrayList<String> columns = new ArrayList<>();
|
||||||
|
for (DbColumn column : COLUMNS)
|
||||||
|
{
|
||||||
|
if (column.Since <= version)
|
||||||
|
{
|
||||||
|
columns.add(column.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return columns.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
private static class DatabaseHelper extends SQLiteOpenHelper
|
private static class DatabaseHelper extends SQLiteOpenHelper
|
||||||
{
|
{
|
||||||
public DatabaseHelper(Context context)
|
public DatabaseHelper(Context context)
|
||||||
@@ -119,7 +135,7 @@ public class VpnProfileDataSource
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(SQLiteDatabase database)
|
public void onCreate(SQLiteDatabase database)
|
||||||
{
|
{
|
||||||
database.execSQL(DATABASE_CREATE);
|
database.execSQL(getDatabaseCreate(DATABASE_VERSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -139,7 +155,7 @@ public class VpnProfileDataSource
|
|||||||
}
|
}
|
||||||
if (oldVersion < 4)
|
if (oldVersion < 4)
|
||||||
{ /* remove NOT NULL constraint from username column */
|
{ /* remove NOT NULL constraint from username column */
|
||||||
updateColumns(db);
|
updateColumns(db, 4);
|
||||||
}
|
}
|
||||||
if (oldVersion < 5)
|
if (oldVersion < 5)
|
||||||
{
|
{
|
||||||
@@ -167,7 +183,7 @@ public class VpnProfileDataSource
|
|||||||
{
|
{
|
||||||
db.execSQL("ALTER TABLE " + TABLE_VPNPROFILE + " ADD " + KEY_UUID +
|
db.execSQL("ALTER TABLE " + TABLE_VPNPROFILE + " ADD " + KEY_UUID +
|
||||||
" TEXT;");
|
" TEXT;");
|
||||||
updateColumns(db);
|
updateColumns(db, 9);
|
||||||
}
|
}
|
||||||
if (oldVersion < 10)
|
if (oldVersion < 10)
|
||||||
{
|
{
|
||||||
@@ -198,15 +214,15 @@ public class VpnProfileDataSource
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateColumns(SQLiteDatabase db)
|
private void updateColumns(SQLiteDatabase db, int version)
|
||||||
{
|
{
|
||||||
db.beginTransaction();
|
db.beginTransaction();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
db.execSQL("ALTER TABLE " + TABLE_VPNPROFILE + " RENAME TO tmp_" + TABLE_VPNPROFILE + ";");
|
db.execSQL("ALTER TABLE " + TABLE_VPNPROFILE + " RENAME TO tmp_" + TABLE_VPNPROFILE + ";");
|
||||||
db.execSQL(DATABASE_CREATE);
|
db.execSQL(getDatabaseCreate(version));
|
||||||
StringBuilder insert = new StringBuilder("INSERT INTO " + TABLE_VPNPROFILE + " SELECT ");
|
StringBuilder insert = new StringBuilder("INSERT INTO " + TABLE_VPNPROFILE + " SELECT ");
|
||||||
SQLiteQueryBuilder.appendColumns(insert, ALL_COLUMNS);
|
SQLiteQueryBuilder.appendColumns(insert, getColumns(version));
|
||||||
db.execSQL(insert.append(" FROM tmp_" + TABLE_VPNPROFILE + ";").toString());
|
db.execSQL(insert.append(" FROM tmp_" + TABLE_VPNPROFILE + ";").toString());
|
||||||
db.execSQL("DROP TABLE tmp_" + TABLE_VPNPROFILE + ";");
|
db.execSQL("DROP TABLE tmp_" + TABLE_VPNPROFILE + ";");
|
||||||
db.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
@@ -421,4 +437,18 @@ public class VpnProfileDataSource
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class DbColumn
|
||||||
|
{
|
||||||
|
public final String Name;
|
||||||
|
public final String Type;
|
||||||
|
public final Integer Since;
|
||||||
|
|
||||||
|
public DbColumn(String name, String type, Integer since)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Type = type;
|
||||||
|
Since = since;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user