/* This file is part of BeepMe. BeepMe is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. BeepMe is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with BeepMe. If not, see <http://www.gnu.org/licenses/>. Copyright 2012-2014 Michael Glanznig http://beepme.yourexp.at */ package com.glanznig.beepme.db; import com.glanznig.beepme.BeeperApp; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class StorageHandler { private static final String TAG = "StorageHandler"; private static class DatabaseHelper extends SQLiteOpenHelper { protected static final int DB_VERSION = 19; public DatabaseHelper(Context ctx, String dbName) { super(ctx, dbName, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { SampleTable.createTable(db); TagTable.createTable(db); SampleTagTable.createTable(db); UptimeTable.createTable(db); ScheduledBeepTable.createTable(db); VocabularyTable.createTable(db); TimerProfileTable.createTable(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // legacy schema "upgrade" if (newVersion < 17 || oldVersion < 16) { dropTables(db); onCreate(db); } else { // do incremental db upgrades for (int mVers = oldVersion; mVers < newVersion; mVers++) { switch (mVers) { case 16: db.execSQL("ALTER TABLE " + TimerProfileTable.getTableName() + " ADD COLUMN minSizeBeepInterval INTEGER NOT NULL DEFAULT 60"); ContentValues values = new ContentValues(); values.put("minSizeBeepInterval", 60); db.update(TimerProfileTable.getTableName(), values, "_id=?", new String[] { "1" }); db.update(TimerProfileTable.getTableName(), values, "_id=?", new String[] { "2" }); break; case 17: db.execSQL("ALTER TABLE " + ScheduledBeepTable.getTableName() + " ADD COLUMN received INTEGER"); break; case 18: db.execSQL("CREATE TABLE IF NOT EXISTS sample2 (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "timestamp INTEGER NOT NULL UNIQUE, " + "title TEXT, " + "description TEXT, " + "accepted INTEGER NOT NULL, " + "photoUri TEXT, " + "uptimeId INTEGER, " + "FOREIGN KEY (uptimeId) REFERENCES " + UptimeTable.getTableName() + " (_id)" + ")"); db.execSQL("INSERT INTO sample2 (_id, timestamp, title, description, accepted, photoUri)" + "SELECT _id, timestamp, title, description, accepted, photoUri FROM " + SampleTable.getTableName()); db.execSQL("DROP TABLE " + SampleTable.getTableName()); db.execSQL("ALTER TABLE sample2 RENAME TO " + SampleTable.getTableName()); db.execSQL("CREATE TABLE IF NOT EXISTS uptime2 (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "start INTEGER NOT NULL UNIQUE, " + "end INTEGER UNIQUE, " + "timerProfileId INTEGER, " + "FOREIGN KEY (timerProfileId) REFERENCES " + TimerProfileTable.getTableName() + " (_id)" + ")"); db.execSQL("INSERT INTO uptime2 (_id, start, end)" + "SELECT _id, start, end FROM " + UptimeTable.getTableName()); db.execSQL("DROP TABLE " + UptimeTable.getTableName()); db.execSQL("ALTER TABLE uptime2 RENAME TO " + UptimeTable.getTableName()); db.execSQL("UPDATE " + VocabularyTable.getTableName() + " SET name='keywords' WHERE _id = 1"); break; } } } } public void dropTables(SQLiteDatabase db) { SampleTagTable.dropTable(db); SampleTable.dropTable(db); TagTable.dropTable(db); UptimeTable.dropTable(db); ScheduledBeepTable.dropTable(db); VocabularyTable.dropTable(db); TimerProfileTable.dropTable(db); } public void truncateTables() { dropTables(this.getWritableDatabase()); onCreate(this.getWritableDatabase()); } } private static DatabaseHelper dbHelperProduction = null; private static DatabaseHelper dbHelperTestMode = null; private Context ctx = null; public static final String DB_OLD_NAME = "beepme"; // can be removed in future versions private static final String DB_NAME_PRODUCTION = "beepme"; private static final String DB_NAME_TESTMODE = "beepme_testmode"; public StorageHandler(Context ctx) { this.ctx = ctx; BeeperApp app = (BeeperApp)ctx.getApplicationContext(); if (app.getPreferences().isTestMode()) { if (dbHelperTestMode == null) { dbHelperTestMode = new DatabaseHelper(ctx.getApplicationContext(), DB_NAME_TESTMODE); } } else { if (dbHelperProduction == null) { dbHelperProduction = new DatabaseHelper(ctx.getApplicationContext(), DB_NAME_PRODUCTION); } } } public SQLiteDatabase getDb() { BeeperApp app = (BeeperApp)ctx.getApplicationContext(); if (app.getPreferences().isTestMode()) { return dbHelperTestMode.getWritableDatabase(); } return dbHelperProduction.getWritableDatabase(); } public void truncateTables() { BeeperApp app = (BeeperApp)ctx.getApplicationContext(); if (app.getPreferences().isTestMode()) { dbHelperTestMode.truncateTables(); } else { dbHelperProduction.truncateTables(); } } public Context getContext() { return ctx; } public String getDatabaseName() { BeeperApp app = (BeeperApp)ctx.getApplicationContext(); if (app.getPreferences().isTestMode()) { return DB_NAME_TESTMODE; } return DB_NAME_PRODUCTION; } public static String getProductionDatabaseName() { return DB_NAME_PRODUCTION; } public static String getTestModeDatabaseName() { return DB_NAME_TESTMODE; } }