/*
* Copyright 2014 Bevbot LLC <info@bevbot.com>
*
* This file is part of the Kegtab package from the Kegbot project. For
* more information on Kegtab or Kegbot, see <http://kegbot.org/>.
*
* Kegtab 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, version 2.
*
* Kegtab 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 Kegtab. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kegbot.app.storage;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.util.Log;
import com.google.protobuf.AbstractMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import org.kegbot.proto.Api.RecordTemperatureRequest;
import org.kegbot.proto.Internal.PendingPour;
/**
* @author mike wakerly (mike@wakerly.com)
*/
public class LocalDbHelper extends SQLiteOpenHelper {
private static final String TAG = LocalDbHelper.class.getSimpleName();
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "kegbot_localdb.db";
public static final String TABLE_NAME = "pending_items";
public static final String COLUMN_NAME_ID = BaseColumns._ID;
public static final String COLUMN_NAME_ADDED_DATE = "added";
public static final String COLUMN_NAME_TYPE = "type";
public static final String COLUMN_NAME_RECORD = "record";
/**
* @param context
*/
public LocalDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
+ COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_NAME_ADDED_DATE + " DATETIME DEFAULT CURRENT_TIMESTAMP, "
+ COLUMN_NAME_TYPE + " TEXT NOT NULL, "
+ COLUMN_NAME_RECORD + " BLOB)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
+ ", destroying all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
/**
* Deletes a single row from the database.
*
* @param db
* @param rowId
* @return
*/
public static int deleteRow(final SQLiteDatabase db, int rowId) {
final String where = COLUMN_NAME_ID + " = ?";
final String[] whereArgs = {
String.valueOf(rowId)
};
return db.delete(TABLE_NAME, where, whereArgs);
}
public static boolean insertRecord(final SQLiteDatabase db, final AbstractMessage record) {
final String type;
if (record instanceof PendingPour) {
type = "pour";
} else if (record instanceof RecordTemperatureRequest) {
type = "thermo";
} else {
Log.w(TAG, "Unknown record type; dropping.");
return false;
}
Log.d(TAG, "Request is a " + type);
final ContentValues values = new ContentValues();
values.put(LocalDbHelper.COLUMN_NAME_TYPE, type);
values.put(LocalDbHelper.COLUMN_NAME_RECORD, record.toByteArray());
db.insert(TABLE_NAME, null, values);
return true;
}
public static AbstractMessage getCurrentRow(final SQLiteDatabase db, final Cursor cursor) throws InvalidProtocolBufferException {
final String type = cursor.getString(cursor.getColumnIndex(LocalDbHelper.COLUMN_NAME_TYPE));
final byte[] data = cursor.getBlob(cursor.getColumnIndex(LocalDbHelper.COLUMN_NAME_RECORD));
Log.w(TAG, "getCurrentRow: " + type);
if ("pour".equals(type)) {
return PendingPour.parseFrom(data);
} else if ("thermo".equals(type)) {
return RecordTemperatureRequest.parseFrom(data);
} else {
return null;
}
}
public static int deleteCurrentRow(final SQLiteDatabase db, final Cursor cursor) {
final int rowId = cursor.getInt(cursor.getColumnIndex(LocalDbHelper.COLUMN_NAME_ID));
return deleteRow(db, rowId);
}
}