blob: 03670cda8e8e83136c4096e74ab824d36f926157 [file] [log] [blame]
package org.wordpress.android.ui.stats.datasets;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import org.wordpress.android.util.AppLog;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* database for all tracks information
*/
public class StatsDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "stats.db";
private static final int DB_VERSION = 1;
/*
* database singleton
*/
private static StatsDatabaseHelper mDatabaseHelper;
private final static Object mDbLock = new Object();
private final Context mContext;
public static StatsDatabaseHelper getDatabase(Context ctx) {
if (mDatabaseHelper == null) {
synchronized(mDbLock) {
if (mDatabaseHelper == null) {
mDatabaseHelper = new StatsDatabaseHelper(ctx);
// this ensures that onOpen() is called with a writable database (open will fail if app calls getReadableDb() first)
mDatabaseHelper.getWritableDatabase();
}
}
}
return mDatabaseHelper;
}
private StatsDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
mContext = context;
}
public static SQLiteDatabase getReadableDb(Context ctx) {
return getDatabase(ctx).getReadableDatabase();
}
public static SQLiteDatabase getWritableDb(Context ctx) {
return getDatabase(ctx).getWritableDatabase();
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// Used during development to copy database to external storage and read its content.
// copyDatabase(db);
}
/*
* drop & recreate all tables (essentially clears the db of all data)
*/
public void reset() {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
dropAllTables(db);
createAllTables(db);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
@Override
public void onCreate(SQLiteDatabase db) {
createAllTables(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// for now just reset the db when upgrading, future versions may want to avoid this
// and modify table structures, etc., on upgrade while preserving data
AppLog.i(AppLog.T.STATS, "Upgrading database from version " + oldVersion + " to version " + newVersion);
reset();
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// IMPORTANT: do NOT call super() here - doing so throws a SQLiteException
AppLog.w(AppLog.T.STATS, "Downgrading database from version " + oldVersion + " to version " + newVersion);
reset();
}
private void createAllTables(SQLiteDatabase db) {
StatsTable.createTables(db);
}
private void dropAllTables(SQLiteDatabase db) {
StatsTable.dropTables(db);
}
/*
* used during development to copy database to external storage so we can access it via DDMS
*/
@SuppressWarnings("unused")
private void copyDatabase(SQLiteDatabase db) {
String copyFrom = db.getPath();
String copyTo = mContext.getExternalFilesDir(null).getAbsolutePath() + "/" + DB_NAME;
try {
InputStream input = new FileInputStream(copyFrom);
OutputStream output = new FileOutputStream(copyTo);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
input.close();
} catch (IOException e) {
AppLog.e(AppLog.T.STATS, "failed to copy stats database", e);
}
}
}