package com.gettingmobile.google.reader.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.gettingmobile.android.database.DatabaseOpenHelper;
import com.gettingmobile.goodnews.settings.Settings;
import com.gettingmobile.goodnews.storage.StorageProvider;
import com.gettingmobile.goodnews.storage.StorageProviderFactory;
import com.gettingmobile.io.IOUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public final class DatabaseHelper extends DatabaseOpenHelper {
private static final String LOG_TAG = "goodnews.DatabaseHelper";
public static final String DATABASE_NAME = "goodnews";
private static final String SECONDARY_DATABASE_NAME = "goodnewsSecondary";
public static final int DATABASE_VERSION = 35;
private final List<Table> tables = new ArrayList<Table>();
protected DatabaseHelper(String dbName) {
super(dbName, null, DATABASE_VERSION);
tables.add(new TagTable());
tables.add(new FeedTable());
tables.add(new FeedTagTable());
tables.add(new ItemTable());
tables.add(new ItemTagTable());
tables.add(new ItemTagChangeEventTable());
tables.add(new ItemRequestSpecificationTable());
tables.add(new ItemBlacklistTable());
}
public static DatabaseHelper create(Context context, Settings settings) {
final String dbName;
if (settings != null && settings.areDatabasesSwapped()) {
Log.i(LOG_TAG, "Databases are swapped. Trying to rearrange.");
final File dbFile = context.getDatabasePath(DATABASE_NAME);
final File secondaryDbFile = context.getDatabasePath(SECONDARY_DATABASE_NAME);
if ((!dbFile.exists() || dbFile.delete()) && (!secondaryDbFile.exists() || secondaryDbFile.renameTo(dbFile))) {
dbName = DATABASE_NAME;
settings.setDatabasesSwapped(false);
} else {
dbName = SECONDARY_DATABASE_NAME;
}
} else {
dbName = DATABASE_NAME;
final File secondaryDbFile = context.getDatabasePath(SECONDARY_DATABASE_NAME);
IOUtils.deleteIgnore(secondaryDbFile);
}
Log.i(LOG_TAG, "Productive database is " + dbName);
return create(dbName, settings != null ?
settings.getDatabaseStorageProvider() : StorageProviderFactory.createInternalStorageProvider(context));
}
protected static DatabaseHelper create(String dbName, StorageProvider storageProvider) {
final DatabaseHelper dbHelper = new DatabaseHelper(dbName);
dbHelper.openOrCreateDatabase(storageProvider);
return dbHelper;
}
public void clean() {
final SQLiteDatabase db = getDatabase();
db.beginTransaction();
try {
/*
* delete all current data
*/
for (Table table : tables) {
table.clean(db);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "creating database ...");
db.beginTransaction();
try {
for (Table table : tables) {
table.create(db);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
Log.d(LOG_TAG, "database has been created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(LOG_TAG, "updating database ...");
db.beginTransaction();
try {
for (Table table : tables) {
table.upgrade(db, oldVersion, newVersion);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
analyze(db);
Log.d(LOG_TAG, "database has been updated");
}
public void tryVacuum() {
Log.d(LOG_TAG, "beginning vacuum ...");
try {
getDatabase().execSQL("VACUUM");
} catch (Exception ex) {
Log.w(LOG_TAG, "vacuum failed", ex);
} finally {
Log.d(LOG_TAG, "vacuum finished");
}
}
public void analyze() {
analyze(getDatabase());
}
private void analyze(SQLiteDatabase db) {
db.execSQL("ANALYZE");
}
}