LongDelta.java 2.61 KB
package se.lil.om;

import java.sql.ResultSet;
import java.sql.Timestamp;

class LongDelta {
	public String name = null;
	public Long curValue = null;
	public Long lastValue = null;
	public Timestamp lastFetch = null;
	public Timestamp curFetch = null;
	boolean urProt = false; // Under-run protection
	boolean lastUpdCausedUR = false;
	
	public LongDelta() {};
	public LongDelta(boolean UnderrunProtection) { this.urProt = UnderrunProtection; }
	
	public void update(ResultSet rset) throws Throwable{
		update(rset, 2, false, true);
	}
	public void update(ResultSet rset, boolean convert) throws Throwable{
		update(rset, 2, convert, true);
	}
	public void update(ResultSet rset, int pos, boolean convert) throws Throwable{
		update(rset, pos, convert, true);
	}
	public void update(ResultSet rset, int pos, boolean convert, boolean close) throws Throwable{
		rset.next();
		long newval = rset.getLong(pos);
		if(convert) newval = newval/1000;
		if(urProt) {
			if(this.curValue != null && this.curValue > newval) {
				//This would be a negative delta. Ignore this data
				//System.out.println("Underrunprotection on " + name + " New Val: " + newval + " Old Val: " + this.curValue);
				lastUpdCausedUR = true;
				if(close) rset.close(); 
				return;
			}
		}
		this.lastFetch = this.curFetch;
		this.curFetch = rset.getTimestamp(1);
		this.lastValue = this.curValue;
		this.curValue = newval;
		lastUpdCausedUR = false;
		if(close) rset.close(); 
	}
	
	public boolean didLastUnderRun() {
		return lastUpdCausedUR;
	}
	
	public double getPerSecondValue() throws Throwable {
		if(this.curValue != null && this.lastValue != null && this.lastFetch != null && this.curFetch != null) {
			// We have values, calculate the number of gets per second
			double numMilliSeconds = this.curFetch.getTime() - this.lastFetch.getTime();
			double delta = this.curValue - this.lastValue;
			double perMilli = delta/numMilliSeconds;
			return perMilli * 1000;
		} else {
			return 0;
		}
	}
	public long getCurrentValue() throws Throwable {
		if(this.curValue != null) return this.curValue;
		else return 0;
	}
	public double getSeconds() throws Throwable {
		if(this.lastFetch != null && this.curFetch != null) {
			double numSeconds = this.curFetch.getTime() - this.lastFetch.getTime();
			return numSeconds/1000;
		}
		return 0;
	}
	public long getMilliSeconds() throws Throwable {
		if(this.lastFetch != null && this.curFetch != null) {
			return this.curFetch.getTime() - this.lastFetch.getTime();
		}
		return 0;
	}
	public long getDelta() throws Throwable {
		if(this.lastValue != null && this.curValue != null) {
			return this.curValue - this.lastValue;
		}
		return 0;
	}
}