Class: SAAL::DBStore

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dbstore.rb

Constant Summary collapse

MAX_LAST_VAL_AGE =

Only give out last_value if it’s less than 5 min old

5*60

Instance Method Summary collapse

Constructor Details

#initialize(conffile = SAAL::DBCONF) ⇒ DBStore

Returns a new instance of DBStore.



7
8
9
10
11
# File 'lib/dbstore.rb', line 7

def initialize(conffile=SAAL::DBCONF)
  @dbopts = YAML::load(File.new(conffile))
  @db = nil
  db_initialize
end

Instance Method Details

#average(sensor, from, to) ⇒ Object



34
35
36
# File 'lib/dbstore.rb', line 34

def average(sensor, from, to)     
  db_range("AVG", sensor, from, to)
end

#db_initializeObject



13
14
15
16
17
18
19
20
# File 'lib/dbstore.rb', line 13

def db_initialize
  db_query "CREATE TABLE IF NOT EXISTS sensor_reads
               (sensor VARCHAR(100), 
                date INT, 
                value FLOAT) ENGINE=InnoDB"
  db_query "ALTER TABLE sensor_reads ADD INDEX sensor_date_value (sensor,date,value) USING BTREE",
           :ignoreerr => 1061
end

#db_wipeObject



22
23
24
# File 'lib/dbstore.rb', line 22

def db_wipe
  db_query "DROP TABLE sensor_reads"
end

#eachObject



59
60
61
62
63
64
65
# File 'lib/dbstore.rb', line 59

def each
  db_query "SELECT sensor,date,value FROM sensor_reads" do |r|
    r.each do |row|
      yield [row["sensor"],row["date"].to_i, row["value"].to_f]
    end
  end
end

#last_value(sensor) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/dbstore.rb', line 44

def last_value(sensor)
  db_query "SELECT date,value FROM sensor_reads 
              WHERE sensor = '#{db_quote(sensor.to_s)}'
              AND date > '#{Time.now.utc.to_i - MAX_LAST_VAL_AGE}'
              ORDER BY date DESC LIMIT 1" do |r|
    row = r.first
    if row
      _date, value = [row["date"].to_i, row["value"].to_f]
      value
    else
      nil
    end
  end
end

#maximum(sensor, from, to) ⇒ Object



41
42
43
# File 'lib/dbstore.rb', line 41

def maximum(sensor, from, to)     
  db_range("MAX", sensor, from, to)
end

#minimum(sensor, from, to) ⇒ Object



38
39
40
# File 'lib/dbstore.rb', line 38

def minimum(sensor, from, to)     
  db_range("MIN", sensor, from, to)
end

#write(sensor, date, value) ⇒ Object

Raises:

  • (ArgumentError)


26
27
28
29
30
31
32
# File 'lib/dbstore.rb', line 26

def write(sensor, date, value)
  raise ArgumentError, "Trying to store an empty sensor read" if !value
  raise ArgumentError, "Trying to store an empty timestamp" if !date
  raise ArgumentError, "Trying to store a timestamp <= 0" if date <= 0
  db_query "INSERT INTO sensor_reads VALUES
              ('"+db_quote(sensor.to_s)+"',"+date.to_s+","+value.to_s+")"
end