package com.lechucksoftware.proxy.proxysettings.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.text.TextUtils; import android.util.Log; import com.lechucksoftware.proxy.proxysettings.App; import com.lechucksoftware.proxy.proxysettings.utils.DBUtils; import timber.log.Timber; /** * Created by Marco on 13/09/13. */ public class DatabaseSQLiteOpenHelper extends SQLiteOpenHelper { private static final String TAG = DatabaseSQLiteOpenHelper.class.getSimpleName(); public static final String TABLE_WIFI_AP = "wifiap"; public static final String TABLE_PAC = "pac"; public static final String TABLE_PROXIES = "proxies"; public static final String TABLE_TAGS = "tags"; public static final String TABLE_PROXY_TAG_LINKS = "taggedproxies"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_CREATION_DATE = "creationDate"; public static final String COLUMN_MODIFIED_DATE = "modifiedDate"; public static final String COLUMN_PROXY_HOST = "host"; public static final String COLUMN_PROXY_PORT = "port"; public static final String COLUMN_PROXY_EXCLUSION = "exclusion"; public static final String COLUMN_PROXY_COUNTRY_CODE = "country"; public static final String COLUMN_PROXY_IN_USE = "used"; public static final String COLUMN_TAG = "tag"; public static final String COLUMN_TAG_COLOR = "color"; public static final String COLUMN_PROXY_ID = "proxyId"; public static final String COLUMN_TAG_ID = "tagId"; public static final String COLUMN_WIFI_SSID = "ssid"; public static final String COLUMN_WIFI_SECURITY_TYPE = "securitytype"; public static final String COLUMN_WIFI_PROXY_SETTING = "proxysetting"; public static final String COLUMN_WIFI_PROXY_ID = "proxyid"; public static final String COLUMN_WIFI_PAC_ID = "pacid"; public static final String COLUMN_PAC_URL_FILE = "pacUrlFile"; public static final String COLUMN_PAC_IN_USE = "pacUsed"; public static final String DATABASE_NAME = "proxysettings.db"; public static final int DATABASE_VERSION = 4; // Database creation sql statement private static final String CREATE_TABLE_PROXIES = "create table " + TABLE_PROXIES + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_PROXY_HOST + " text not null, " + COLUMN_PROXY_PORT + " integer not null, " + COLUMN_PROXY_EXCLUSION + " text not null, " + COLUMN_PROXY_COUNTRY_CODE + " text, " + COLUMN_PROXY_IN_USE + " integer not null, " + COLUMN_CREATION_DATE + " integer not null, " + COLUMN_MODIFIED_DATE + " integer not null" + ");"; public static final String [] TABLE_PROXIES_COLUMNS = new String[] { TABLE_PROXIES + "." + COLUMN_ID, TABLE_PROXIES + "." + COLUMN_PROXY_HOST, TABLE_PROXIES + "." + COLUMN_PROXY_PORT, TABLE_PROXIES + "." + COLUMN_PROXY_EXCLUSION, TABLE_PROXIES + "." + COLUMN_PROXY_COUNTRY_CODE, TABLE_PROXIES + "." + COLUMN_PROXY_IN_USE, TABLE_PROXIES + "." + COLUMN_CREATION_DATE, TABLE_PROXIES + "." + COLUMN_MODIFIED_DATE}; public static final String TABLE_PROXIES_COLUMNS_STRING = TextUtils.join(", ", TABLE_PROXIES_COLUMNS); private static final String CREATE_TABLE_TAGS = "create table " + TABLE_TAGS + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_TAG + " text not null, " + COLUMN_TAG_COLOR + " integer not null, " + COLUMN_CREATION_DATE + " integer not null, " + COLUMN_MODIFIED_DATE + " integer not null" + ");"; public static final String [] TABLE_TAGS_COLUMNS = new String[] { TABLE_TAGS + "." + COLUMN_ID, TABLE_TAGS + "." + COLUMN_TAG, TABLE_TAGS + "." + COLUMN_TAG_COLOR, TABLE_TAGS + "." + COLUMN_CREATION_DATE, TABLE_TAGS + "." + COLUMN_MODIFIED_DATE}; public static final String TABLE_TAGS_COLUMNS_STRING = TextUtils.join(", ", TABLE_TAGS_COLUMNS); private static final String CREATE_TABLE_TAGGED_PROXIES = "create table " + TABLE_PROXY_TAG_LINKS + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_PROXY_ID + " integer not null, " + COLUMN_TAG_ID + " integer not null, " + COLUMN_CREATION_DATE + " integer not null, " + COLUMN_MODIFIED_DATE + " integer not null" + ");"; public static final String [] TABLE_TAGGED_PROXIES_COLUMNS = new String[] { TABLE_PROXY_TAG_LINKS + "." + COLUMN_ID, TABLE_PROXY_TAG_LINKS + "." + COLUMN_PROXY_ID, TABLE_PROXY_TAG_LINKS + "." + COLUMN_TAG_ID, TABLE_PROXY_TAG_LINKS + "." + COLUMN_CREATION_DATE, TABLE_PROXY_TAG_LINKS + "." + COLUMN_MODIFIED_DATE}; public static final String TABLE_TAGGED_PROXIES_COLUMNS_STRING = TextUtils.join(", ", TABLE_TAGGED_PROXIES_COLUMNS); private static final String CREATE_TABLE_WIFI_AP = "create table " + TABLE_WIFI_AP + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_WIFI_SSID + " text not null, " + COLUMN_WIFI_SECURITY_TYPE + " text not null, " + COLUMN_WIFI_PROXY_SETTING + " text not null, " + COLUMN_WIFI_PROXY_ID + " integer not null, " + COLUMN_WIFI_PAC_ID + " integer not null, " + COLUMN_CREATION_DATE + " integer not null, " + COLUMN_MODIFIED_DATE + " integer not null" + ");"; public static final String [] TABLE_WIFI_AP_COLUMNS = new String[] { TABLE_WIFI_AP + "." + COLUMN_ID, TABLE_WIFI_AP + "." + COLUMN_WIFI_SSID, TABLE_WIFI_AP + "." + COLUMN_WIFI_SECURITY_TYPE, TABLE_WIFI_AP + "." + COLUMN_WIFI_PROXY_SETTING, TABLE_WIFI_AP + "." + COLUMN_WIFI_PROXY_ID, TABLE_WIFI_AP + "." + COLUMN_WIFI_PAC_ID, TABLE_WIFI_AP + "." + COLUMN_CREATION_DATE, TABLE_WIFI_AP + "." + COLUMN_MODIFIED_DATE}; public static final String TABLE_WIFI_AP_COLUMNS_STRING = TextUtils.join(", ", TABLE_WIFI_AP_COLUMNS); private static final String CREATE_TABLE_PAC = "create table " + TABLE_PAC + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_PAC_URL_FILE + " text not null, " + COLUMN_PAC_IN_USE + " integer not null, " + COLUMN_CREATION_DATE + " integer not null, " + COLUMN_MODIFIED_DATE + " integer not null" + ");"; public static final String [] TABLE_PAC_COLUMNS = new String[] { TABLE_PAC + "." + COLUMN_ID, TABLE_PAC + "." + COLUMN_PAC_URL_FILE, TABLE_PAC + "." + COLUMN_PAC_IN_USE, TABLE_PAC + "." + COLUMN_CREATION_DATE, TABLE_PAC + "." + COLUMN_MODIFIED_DATE}; public static final String TABLE_PAC_COLUMNS_STRING = TextUtils.join(", ", TABLE_PAC_COLUMNS); private static DatabaseSQLiteOpenHelper instance; public static synchronized DatabaseSQLiteOpenHelper getInstance(Context context) { if (instance == null) { instance = new DatabaseSQLiteOpenHelper(context); } return instance; } private DatabaseSQLiteOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase database) { createDB(database); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Timber.d("DB - onUpgrade: %d -> %d", oldVersion, newVersion); if (oldVersion < 2) { /** * First released version is v2 * - previous versions doesn't need official upgrade plan * */ dropDB(db); createDB(db); return; } // Se example of upgrade planning here: http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/providers/calendar/CalendarDatabaseHelper.java/?v=source if (oldVersion == 2) { // Do something for v3 upgradeToVersion3(db); oldVersion = 3; // Remember to increment so that next upgrade phase is called } if (oldVersion == 3) { // Do something for v3 upgradeToVersion4(db); oldVersion = 4; } // // if (oldVersion == 4) // { // // Do something for v4 // } } public void upgradeToVersion3(SQLiteDatabase db) { /** * Changes from version 2 to version 3: * * - Added TABLE_WIFI_AP (Wi-Fi access points table) * */ DBUtils.execSQL(db, CREATE_TABLE_WIFI_AP); } public void upgradeToVersion4(SQLiteDatabase db) { /** * Changes from version 3 to version 4: * * - Added PACId column to TABLE_WIFI_AP * - Added TABLE_PAC (Proxy PAC configurations) * */ DBUtils.execSQL(db, "ALTER TABLE " + TABLE_WIFI_AP + " ADD COLUMN " + COLUMN_WIFI_PAC_ID + " int"); DBUtils.execSQL(db, CREATE_TABLE_PAC); } public void createDB(SQLiteDatabase db) { App.getTraceUtils().startTrace(TAG, "CREATE DATABASE", Log.DEBUG); DBUtils.execSQL(db, CREATE_TABLE_PROXIES); DBUtils.execSQL(db, CREATE_TABLE_TAGS); DBUtils.execSQL(db, CREATE_TABLE_TAGGED_PROXIES); DBUtils.execSQL(db, CREATE_TABLE_WIFI_AP); DBUtils.execSQL(db, CREATE_TABLE_PAC); App.getTraceUtils().stopTrace(TAG, "CREATE DATABASE", Log.DEBUG); } public void dropDB(SQLiteDatabase db) { App.getTraceUtils().startTrace(TAG, "DROP DATABASE", Log.DEBUG); DBUtils.execSQL(db, "DROP TABLE IF EXISTS " + TABLE_PROXIES); DBUtils.execSQL(db, "DROP TABLE IF EXISTS " + TABLE_TAGS); DBUtils.execSQL(db, "DROP TABLE IF EXISTS " + TABLE_PROXY_TAG_LINKS); DBUtils.execSQL(db, "DROP TABLE IF EXISTS " + TABLE_WIFI_AP); DBUtils.execSQL(db, "DROP TABLE IF EXISTS " + TABLE_PAC); App.getTraceUtils().stopTrace(TAG, "DROP DATABASE", Log.DEBUG); } }