package com.lmit.jenkins.android.networking;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Semaphore;
import com.lmit.jenkins.android.activity.JenkinsMobi;
import com.lmit.jenkins.android.logger.Logger;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
public static final String STATE = "state";
private static final String FLAG = "flag";
private static final String DATABASE_NAME = "localstorage";
private static final String DATABASE_NAME_SWP = "localstorage.swap";
public static final int DATABASE_VERSION = 5;
public static final String JSON_TABLE_NAME = "json";
private static final String JSON_TABLE_CREATE = "CREATE TABLE " + JSON_TABLE_NAME + " (id TEXT PRIMARY KEY UNIQUE, data BLOB, tag TEXT, pluginid TEXT);";
private static final String JSON_TABLE_DELETE = "DROP TABLE IF EXISTS " + JSON_TABLE_NAME;
public static final String ICONS_TABLE_NAME = "icons";
private static final String ICONS_TABLE_CREATE = "CREATE TABLE " + ICONS_TABLE_NAME + " (id TEXT PRIMARY KEY UNIQUE, data BLOB, tag TEXT, pluginid TEXT);";
private static final String ICONS_TABLE_DELETE = "DROP TABLE IF EXISTS " + ICONS_TABLE_NAME;
private Context context;
private DatabaseHelper dBHelper;
private DatabaseHelperSwap databaseHelperSwap;
private SQLiteDatabase db;
private static Semaphore dbSem = new Semaphore(1);
public SQLiteDatabase getConnection() throws SQLException {
try {
dbSem.acquire();
} catch (InterruptedException e) {
return null;
}
this.context = JenkinsMobi.getAppContext();
dBHelper = new DatabaseHelper(context);
db = dBHelper.getWritableDatabase();
return db;
}
public void closeConnection() {
if(db == null) {
return;
}
db.close();
db = null;
dbSem.release();
}
public SQLiteDatabase getSWAPConnection() throws SQLException {
this.context = JenkinsMobi.getAppContext();
databaseHelperSwap = new DatabaseHelperSwap(context);
db = databaseHelperSwap.getWritableDatabase();
return db;
}
public SQLiteDatabase getProductionConnection(Context ctx)
throws SQLException {
this.context = JenkinsMobi.getAppContext();
dBHelper = new DatabaseHelper(context);
db = dBHelper.getWritableDatabase();
return db;
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
// It seems that upgrading from an older version, the create is invoked instead of the onUpgrade :-O
try {
db.execSQL(JSON_TABLE_DELETE);
db.execSQL(ICONS_TABLE_DELETE);
} catch(Throwable e) {
// Explicitly ignoring this: DELETE was issued as kind of workaround to an upgrade situation
}
db.execSQL(JSON_TABLE_CREATE);
db.execSQL(ICONS_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w("", "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL(JSON_TABLE_DELETE);
db.execSQL(ICONS_TABLE_DELETE);
onCreate(db);
}
}
private static class DatabaseHelperSwap extends SQLiteOpenHelper
{
DatabaseHelperSwap(Context context)
{
super(context, DATABASE_NAME_SWP, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(JSON_TABLE_CREATE);
db.execSQL(ICONS_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w("", "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL(JSON_TABLE_DELETE);
db.execSQL(ICONS_TABLE_DELETE);
onCreate(db);
}
}
public synchronized SQLiteDatabase swap() throws IOException {
Logger.getInstance().debug("Swapping");
databaseHelperSwap = new DatabaseHelperSwap(context);
SQLiteDatabase dbSwap = databaseHelperSwap.getWritableDatabase();
dbSwap.execSQL(JSON_TABLE_DELETE);
dbSwap.execSQL(ICONS_TABLE_DELETE);
dbSwap.execSQL("INSERT INTO "+DATABASE_NAME_SWP+"."+JSON_TABLE_NAME+" SELECT * FROM "+DATABASE_NAME+"."+JSON_TABLE_NAME);
return getSWAPConnection();
}
public synchronized void swapBack() throws IOException {
Logger.getInstance().debug("Swapping back");
db.execSQL(JSON_TABLE_DELETE);
db.execSQL(ICONS_TABLE_DELETE);
db.execSQL("INSERT INTO "+DATABASE_NAME+"."+JSON_TABLE_NAME+" SELECT * FROM "+DATABASE_NAME_SWP+"."+JSON_TABLE_NAME);
}
}