package org.wikipedia.useroption.database;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import org.wikipedia.database.DatabaseTable;
import org.wikipedia.database.DbUtil;
import org.wikipedia.database.column.Column;
import org.wikipedia.database.contract.UserOptionContract;
import org.wikipedia.database.contract.UserOptionContract.OptionCol;
import org.wikipedia.useroption.UserOption;
import org.wikipedia.util.StringUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class UserOptionDatabaseTable extends DatabaseTable<UserOption> {
private static final int INTRODUCED_AT_DATABASE_VERSION = 9;
private static final int HTTP_COLS_REMOVED_AT_DATABASE_VERSION = 11;
public UserOptionDatabaseTable() {
super(UserOptionContract.TABLE_OPTION, UserOptionContract.Option.URI);
}
@Override
public UserOption fromCursor(Cursor cursor) {
String key = OptionCol.KEY.val(cursor);
String val = OptionCol.VAL.val(cursor);
return new UserOption(key, val);
}
@SuppressWarnings("deprecation")
@NonNull
@Override
public Column<?>[] getColumnsAdded(int version) {
switch (version) {
case INTRODUCED_AT_DATABASE_VERSION:
List<Column<?>> cols = new ArrayList<>();
cols.add(OptionCol.ID);
cols.add(OptionCol.KEY);
cols.add(OptionCol.VAL);
cols.add(OptionCol.Legacy.HTTP_STATUS);
cols.add(OptionCol.Legacy.HTTP_TIMESTAMP);
cols.add(OptionCol.Legacy.HTTP_TRANSACTION_ID);
return cols.toArray(new Column<?>[cols.size()]);
default:
return super.getColumnsAdded(version);
}
}
@Override
protected ContentValues toContentValues(UserOption option) {
ContentValues contentValues = new ContentValues();
contentValues.put(OptionCol.KEY.getName(), option.key());
contentValues.put(OptionCol.VAL.getName(), option.val());
return contentValues;
}
@Override
protected String getPrimaryKeySelection(@NonNull UserOption option,
@NonNull String[] selectionArgs) {
return super.getPrimaryKeySelection(option, OptionCol.SELECTION);
}
@Override
protected String[] getUnfilteredPrimaryKeySelectionArgs(@NonNull UserOption option) {
return new String[] {option.key()};
}
@Override
protected int getDBVersionIntroducedAt() {
return INTRODUCED_AT_DATABASE_VERSION;
}
@Override protected void upgradeSchema(@NonNull SQLiteDatabase db, int toVersion) {
switch (toVersion) {
case HTTP_COLS_REMOVED_AT_DATABASE_VERSION:
upgradeSchemaHttpColsRemoved(db);
break;
default:
super.upgradeSchema(db, toVersion);
}
}
private void upgradeSchemaHttpColsRemoved(@NonNull SQLiteDatabase db) {
String httpCols = DbUtil.namesCsv(UserOptionContract.HttpCol.KEY,
UserOptionContract.HttpCol.STATUS, UserOptionContract.HttpCol.TIMESTAMP,
UserOptionContract.HttpCol.TRANSACTION_ID);
@SuppressWarnings("deprecation") String oldHttpCols = DbUtil.namesCsv(OptionCol.KEY,
OptionCol.Legacy.HTTP_STATUS, OptionCol.Legacy.HTTP_TIMESTAMP,
OptionCol.Legacy.HTTP_TRANSACTION_ID);
String colDefs = StringUtil.listToCsv(Arrays.asList(OptionCol.ID.toString(), OptionCol.KEY.toString(),
OptionCol.VAL.toString()));
String cols = DbUtil.namesCsv(OptionCol.ID, OptionCol.KEY, OptionCol.VAL);
String sql = ("insert into :httpTbl (:httpCols) select :oldHttpCols from :tbl;"
+ "alter table :tbl rename to :tblBackup;"
+ "create table :tbl (:colDefs);"
+ "insert into :tbl select :cols from :tblBackup;"
+ "drop table :tblBackup")
.replaceAll(":httpTbl", UserOptionContract.TABLE_HTTP)
.replaceAll(":httpCols", httpCols)
.replaceAll(":oldHttpCols", oldHttpCols)
.replaceAll(":tbl", UserOptionContract.TABLE_OPTION)
.replaceAll(":colDefs", colDefs)
.replaceAll(":cols", cols);
DbUtil.execSqlTransaction(db, sql);
}
}