package com.openfarmanager.android.core;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.util.Log;
import com.openfarmanager.android.App;
import com.openfarmanager.android.core.dbadapters.BookmarkDBAdapter;
import com.openfarmanager.android.core.dbadapters.NetworkAccountDbAdapter;
import com.openfarmanager.android.core.dbadapters.VendorDbAdapter;
import static com.openfarmanager.android.core.dbadapters.BookmarkDBAdapter.Columns.NETWORK_ACCOUNT_ID;
public class DataStorageHelper {
private static final String DB_NAME = "far_on_droid_database";
private static final int DB_VERSION = 4;
public static DatabaseHelper sHelper;
static {
sHelper = new DatabaseHelper();
}
private DataStorageHelper() {}
public static SQLiteDatabase getDatabase() {
if(sHelper == null) return null;
return sHelper.getDatabase();
}
public static void closeDatabase() {
if(sHelper == null) return;
sHelper.closeDatabase();
}
private static class DatabaseHelper extends SQLiteOpenHelper {
private final Object mLocker = new Object();
private SQLiteDatabase mDatabase = null;
private int mDbOpensCounter = 0;
public DatabaseHelper() {
super(App.sInstance, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) throws SQLiteException {
db.execSQL(BookmarkDBAdapter.CREATE_TABLE);
db.execSQL(NetworkAccountDbAdapter.CREATE_TABLE);
VendorDbAdapter.createTable(db);
Log.d("DataStorageHelper", "Create database, version " + DB_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) throws SQLiteException {
switch (oldVersion) {
case 1:
db.execSQL(NetworkAccountDbAdapter.CREATE_TABLE);
break;
case 2:
VendorDbAdapter.createTable(db);
break;
case 3:
db.execSQL("ALTER TABLE " + NetworkAccountDbAdapter.TABLE_NAME + " ADD COLUMN " + NetworkAccountDbAdapter.Columns.HOME_PATH + " TEXT");
db.execSQL("ALTER TABLE " + BookmarkDBAdapter.TABLE_NAME + " ADD COLUMN " + BookmarkDBAdapter.Columns.NETWORK_ACCOUNT_ID + " INTEGER DEFAULT -1");
break;
}
Log.d("DataStorageHelper", "Update database from version " + oldVersion + " to " + newVersion);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.e("DataStorageHelper", String.format("onDowngrade invoked. OldVersion=%s newVersion=%s", oldVersion, newVersion));
}
public SQLiteDatabase getDatabase() {
synchronized (mLocker) {
if(mDatabase == null) {
try {
mDatabase = getWritableDatabase();
mDatabase.setLockingEnabled(true);
mDbOpensCounter = 0;
}
catch(SQLiteException e) {
e.printStackTrace();
return null;
}
}
mDbOpensCounter++;
return mDatabase;
}
}
public void closeDatabase() {
synchronized (mLocker) {
if(--mDbOpensCounter > 0 || mDatabase == null) return;
if(mDatabase.isOpen()) mDatabase.close();
mDatabase = null;
}
}
private void clearDatabase() {
SQLiteDatabase db = getDatabase();
if (db == null) return;
try {
db.delete(BookmarkDBAdapter.TABLE_NAME, null, null);
db.delete(NetworkAccountDbAdapter.TABLE_NAME, null, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeDatabase();
}
}
}
}