package it.angelic.soulissclient.model.db; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteConstraintException; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.NonNull; import android.util.Log; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.SoulissApp; import it.angelic.soulissclient.model.SoulissTypical; import static it.angelic.soulissclient.Constants.TAG; import static junit.framework.Assert.assertTrue; public class SoulissTypicalDTO implements Serializable { /** * */ private static final long serialVersionUID = -7375342157142543740L; private String name; private short nodeId; private short slot = -1; private short typical; private short output; private int iconId; private int warnDelayMsec; private boolean isFavourite; public boolean isTagged() { return isTagged; } public void setTagged(boolean isTagged) { this.isTagged = isTagged; } public boolean isFavourite() { return isFavourite; } public void setFavourite(boolean isFavourite) { this.isFavourite = isFavourite; } private boolean isTagged; private short inputCommand; private Calendar refreshedAt; public SoulissTypicalDTO() { // niente di fatto } public SoulissTypicalDTO(Cursor cursor) { // byte typ = (byte) cursor.getShort(1); setNodeId(cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_NODE_ID))); setTypical(cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL))); setSlot(cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_SLOT))); setInput((byte) cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_INPUT))); setOutput(cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_VALUE))); setIconId(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_ICON))); setWarnDelayMsec(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_WARNTIMER))); //setFavourite(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_ISFAV))); setName(cursor.getString(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_NAME))); Calendar now = Calendar.getInstance(); now.setTime(new Date(cursor.getLong(cursor.getColumnIndex(SoulissDB.COLUMN_TYPICAL_LASTMOD)))); setRefreshedAt(now); } @Override public boolean equals(Object o) { if (!(o instanceof SoulissTypicalDTO)) return false; SoulissTypicalDTO tg = (SoulissTypicalDTO) o; return tg.getNodeId() == nodeId && tg.getTypical() == typical && tg.getSlot() == slot; } @Override public int hashCode() { return getNodeId(); } /** * Aggiorna un tipico, pensato per JSON TYP, SLO e VAL * * @return */ public int persist() { SoulissDBHelper.open(); SQLiteDatabase db = SoulissDBHelper.getDatabase(); int upd; ContentValues values = new ContentValues(); assertTrue(getSlot() != -1); values.put(SoulissDB.COLUMN_TYPICAL_NODE_ID, getNodeId()); values.put(SoulissDB.COLUMN_TYPICAL, getTypical()); values.put(SoulissDB.COLUMN_TYPICAL_SLOT, getSlot()); values.put(SoulissDB.COLUMN_TYPICAL_NAME, getName()); values.put(SoulissDB.COLUMN_TYPICAL_ICON, getIconId()); values.put(SoulissDB.COLUMN_TYPICAL_VALUE, getOutput()); values.put(SoulissDB.COLUMN_TYPICAL_WARNTIMER, getWarnDelayMsec()); //values.put(SoulissDB.COLUMN_TYPICAL_ISFAV, getFavourite()); values.put(SoulissDB.COLUMN_TYPICAL_LASTMOD, Calendar.getInstance().getTime().getTime()); upd = SoulissDBHelper.getDatabase().update( SoulissDB.TABLE_TYPICALS, values, SoulissDB.COLUMN_TYPICAL_NODE_ID + " = " + getNodeId() + " AND " + SoulissDB.COLUMN_TYPICAL_SLOT + " = " + getSlot(), null); if (upd == 0) {//magari non esiste, prova insert try { upd = (int) db.insert(SoulissDB.TABLE_TYPICALS, null, values); } catch (SQLiteConstraintException sqe) { //esiste, magari il primo fail era sfiga. Riproviamo... upd = SoulissDBHelper.getDatabase().update( SoulissDB.TABLE_TYPICALS, values, SoulissDB.COLUMN_TYPICAL_NODE_ID + " = " + getNodeId() + " AND " + SoulissDB.COLUMN_TYPICAL_SLOT + " = " + getSlot(), null); } } if (upd == 0) { //Se ancora 0, qualcosa è storto di sicuro Log.w(TAG, "WARNING: UNPERSISTED TYPICAL! "); } return upd; } public Date getLastStatusChange() { Cursor cursor = SoulissDBHelper.getDatabase().query( SoulissDB.TABLE_LOGS, new String[]{SoulissDB.COLUMN_LOG_DATE, SoulissDB.COLUMN_LOG_VAL, // "strftime('%Y-%m-%d', datetime((cldlogwhen/1000), 'unixepoch', 'localtime')) AS IDX", // "AVG(CAST(flologval AS FLOAT)) AS AVG", // "MIN(CAST(flologval AS FLOAT)) AS MIN", // "MAX(CAST(flologval AS FLOAT)) AS MAX" }, SoulissDB.COLUMN_LOG_NODE_ID + " = " + this.getNodeId() + " AND " + SoulissDB.COLUMN_LOG_SLOT + " = " + this.getSlot() + " AND " + SoulissDB.COLUMN_LOG_ID + " = ( SELECT MAX(" + SoulissDB.COLUMN_LOG_ID + ") FROM " + SoulissDB.TABLE_LOGS + " WHERE " + SoulissDB.COLUMN_LOG_NODE_ID + " = " + this.getNodeId() + " AND " + SoulissDB.COLUMN_LOG_SLOT + " = " + this.getSlot() + ")", null, null, null, SoulissDB.COLUMN_LOG_DATE + " ASC"); cursor.moveToFirst(); while (!cursor.isAfterLast()) { try { Date dff = new Date(cursor.getLong(cursor.getColumnIndex(SoulissDB.COLUMN_LOG_DATE))); cursor.close(); return dff; } catch (Exception e) { Log.e(TAG, "getHistoryTypicalHashMap", e); } cursor.moveToNext(); } return null; } /** * Aggiorna un tipico, ma solo il valore eventualmente logga storia * * @return */ public int refresh(@NonNull SoulissTypical parent) { //log di àbasso livelloà sse no sensor ne related if (SoulissApp.getOpzioni().isLogHistoryEnabled() && !(parent.isSensor() || parent.isRelated())) { // se e` un sensore viene loggato altrove Cursor cursor = SoulissDBHelper.getDatabase().query( SoulissDB.TABLE_TYPICALS, SoulissDB.ALLCOLUMNS_TYPICALS, SoulissDB.COLUMN_TYPICAL_NODE_ID + " = " + nodeId + " AND " + SoulissDB.COLUMN_TYPICAL_SLOT + " = " + slot, null, null, null, null); cursor.moveToFirst(); SoulissTypicalDTO dto = new SoulissTypicalDTO(cursor); if (dto.getOutput() != getOutput()) { parent.logTypical();// logga il nuovo Log.i(Constants.TAG, "logging node " + this.getNodeId() + " - slot " + parent.getSlot() + " - " + parent.getNiceName() + " new state from: " + dto.getOutput() + " to " + Integer.toHexString(parent.getOutput().intValue())); } cursor.close(); } ContentValues values = new ContentValues(); assertTrue(getSlot() != -1); values.put(SoulissDB.COLUMN_TYPICAL_VALUE, getOutput()); values.put(SoulissDB.COLUMN_TYPICAL_LASTMOD, Calendar.getInstance().getTime().getTime()); int upd = SoulissDBHelper.getDatabase().update( SoulissDB.TABLE_TYPICALS, values, SoulissDB.COLUMN_TYPICAL_NODE_ID + " = " + getNodeId() + " AND " + SoulissDB.COLUMN_TYPICAL_SLOT + " = " + getSlot(), null); // TODO throw exception return upd; } /** * INSERT or UPDATE a row, based on primary key * * @return Inefficient //TODO split */ public SoulissTypical createOrReplaceTypical(SoulissDBHelper database) { ContentValues values = new ContentValues(); assertTrue(getSlot() != -1); values.put(SoulissDB.COLUMN_TYPICAL_NODE_ID, getNodeId()); values.put(SoulissDB.COLUMN_TYPICAL_NAME, getName()); values.put(SoulissDB.COLUMN_TYPICAL_ICON, getIconId()); values.put(SoulissDB.COLUMN_TYPICAL, getTypical()); values.put(SoulissDB.COLUMN_TYPICAL_SLOT, getSlot()); values.put(SoulissDB.COLUMN_TYPICAL_INPUT, getInput()); values.put(SoulissDB.COLUMN_TYPICAL_VALUE, getOutput()); values.put(SoulissDB.COLUMN_TYPICAL_WARNTIMER, getWarnDelayMsec()); //values.put(SoulissDB.COLUMN_TYPICAL_ISFAV, getFavourite()); values.put(SoulissDB.COLUMN_TYPICAL_LASTMOD, Calendar.getInstance().getTime().getTime()); int upd = SoulissDBHelper.getDatabase().update( SoulissDB.TABLE_TYPICALS, values, SoulissDB.COLUMN_TYPICAL_NODE_ID + " = " + getNodeId() + " AND " + SoulissDB.COLUMN_TYPICAL_SLOT + " = " + getSlot(), null); if (upd == 0) { SoulissDBHelper.getDatabase().insert(SoulissDB.TABLE_TYPICALS, null, values); } return database.getTypical(getNodeId(), getSlot()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public short getNodeId() { return nodeId; } public void setNodeId(short nodeId) { this.nodeId = nodeId; } public short getOutput() { return output; } public void setOutput(short output) { this.output = output; } public Calendar getRefreshedAt() { return refreshedAt; } public void setRefreshedAt(Calendar refreshedAt) { this.refreshedAt = refreshedAt; } public short getSlot() { return slot; } public void setSlot(short j) { slot = j; } public short getTypical() { return typical; } public void setTypical(short typical) { this.typical = typical; } public short getInput() { return inputCommand; } public void setInput(byte input) { this.inputCommand = input; } public int getIconId() { return iconId; } public void setIconId(int iconId) { this.iconId = iconId; } public String getTypicalDec() { return Integer.toHexString(typical); } public int getWarnDelayMsec() { return warnDelayMsec; } public void setWarnDelayMsec(int warnDelayMsec) { this.warnDelayMsec = warnDelayMsec; } }