package org.starfishrespect.myconsumption.android.dao;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import org.starfishrespect.myconsumption.android.data.SensorData;
import org.starfishrespect.myconsumption.android.data.SensorValue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* S23Y (2015). Licensed under the Apache License, Version 2.0.
* Created by Patrick Herbeuval on 7/04/14.
*/
public class SensorValuesDao {
private static final String TAG = "SensorValuesDao";
private DatabaseHelper db;
public SensorValuesDao(DatabaseHelper db) {
this.db = db;
}
/**
* Compares the given sensor list and the one saved in database, then
* creates tables for sensor not present yet, and delete tables if sensors are
* removed
*
* @param sensors the sensor list
* @return false if any error occurs
*/
public boolean updateSensorList(List<SensorData> sensors) {
Log.d(TAG, "updatesensorlist");
try {
List<SensorData> oldSensors = db.getSensorDao().queryForAll();
Collections.sort(sensors);
Collections.sort(oldSensors);
int progress = 0, oldProgress = 0;
List<SensorData> toAdd = new ArrayList<>();
List<SensorData> toDelete = new ArrayList<>();
while (progress < sensors.size() && oldProgress < oldSensors.size()) {
SensorData cur = sensors.get(progress);
SensorData old = oldSensors.get(oldProgress);
if (cur.sameId(old)) {
System.out.println("Same id\n" + cur.toString() + "\n" + old.toString());
progress++;
oldProgress++;
if (old.updateSettings(cur)) {
db.getSensorDao().update(old);
}
} else if (cur.compareTo(old) > 0) {
toDelete.add(old);
oldProgress++;
} else {
toAdd.add(cur);
progress++;
}
}
while (progress < sensors.size()) {
Log.d(TAG, "ADD LOOP");
toAdd.add(sensors.get(progress));
progress++;
}
while (oldProgress < oldSensors.size()) {
Log.d(TAG, "DELETE LOOP");
toDelete.add(oldSensors.get(oldProgress));
oldProgress++;
}
SQLiteDatabase writeDb = db.getWritableDatabase();
if (writeDb == null) {
return false;
}
for (SensorData s : toAdd) {
Log.d(TAG, "will add " + s.getSensorId());
db.getSensorDao().create(s);
writeDb.execSQL("CREATE TABLE IF NOT EXISTS sensor_" + s.getSensorId() + "(" +
"timestamp INTEGER PRIMARY KEY, value INTEGER)");
writeDb.execSQL("DELETE FROM sensor_" + s.getSensorId());
}
for (SensorData s : toDelete) {
Log.d(TAG, "will delete " + s.getSensorId());
db.getSensorDao().delete(s);
writeDb.execSQL("DROP TABLE IF EXISTS sensor_" + s.getSensorId());
}
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public void removeSensor(String sensorId) {
db.getWritableDatabase().execSQL("DROP TABLE IF EXISTS sensor_" + sensorId);
}
public void insertSensorValue(String sensorId, SensorValue value) {
ContentValues values = new ContentValues();
values.put("timestamp", value.getTimestamp());
values.put("value", value.getValue());
db.getWritableDatabase().insertWithOnConflict("sensor_" + sensorId, null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
public void insertSensorValues(String sensorId, List<SensorValue> values) {
db.getWritableDatabase().beginTransaction();
for (SensorValue value : values) {
insertSensorValue(sensorId, value);
}
db.getWritableDatabase().setTransactionSuccessful();
db.getWritableDatabase().endTransaction();
}
public List<SensorValue> getValues(String sensorId, int start, int end) {
List<SensorValue> values = new ArrayList<>();
Cursor cr = read("sensor_" + sensorId, "timestamp >= "
+ start + " AND timestamp <= " + end, null, null);
while (cr.moveToNext()) {
values.add(new SensorValue(getI(cr, "timestamp"), getI(cr, "value")));
}
return values;
}
public static int getI(Cursor cr, String col) {
return cr.getInt(cr.getColumnIndex(col));
}
public Cursor read(String table, String where, String order, String limit) {
return db.getReadableDatabase().query(table, null, where, null, null, null, order, limit);
}
}