Class: MicroSql::KeyValueTable

Inherits:
Table
  • Object
show all
Defined in:
lib/micro_sql/key_value_table.rb

Instance Attribute Summary

Attributes inherited from Table

#db

Instance Method Summary collapse

Methods inherited from Table

#insert, #primary_key

Constructor Details

#initialize(db, table_name = "settings") ⇒ KeyValueTable

Returns a new instance of KeyValueTable.



6
7
8
9
10
11
12
13
14
# File 'lib/micro_sql/key_value_table.rb', line 6

def initialize(db, table_name = "settings")
  sql = if db.is_a?(MicroSql::PgAdapter)
    "CREATE TABLE #{table_name}_b(uid TEXT PRIMARY KEY, value BYTEA, ttl INTEGER NOT NULL)"
  else
    "CREATE TABLE #{table_name}(uid TEXT PRIMARY KEY, value TEXT, ttl INTEGER NOT NULL)"
  end

  super db, sql
end

Instance Method Details

#[](key) ⇒ Object



16
17
18
19
# File 'lib/micro_sql/key_value_table.rb', line 16

def [](key)
  value, ttl = db.ask("SELECT value, ttl FROM #{table_name} WHERE uid=?", key)
  decode(value) if ttl && (ttl == 0 || ttl > Time.now.to_i)
end

#cached(key, ttl = nil, &block) ⇒ Object



25
26
27
# File 'lib/micro_sql/key_value_table.rb', line 25

def cached(key, ttl = nil, &block)
  self[key] || update(key, yield, ttl)
end

#delete_allObject



21
22
23
# File 'lib/micro_sql/key_value_table.rb', line 21

def delete_all
  @db.exec "DELETE FROM #{table_name}"
end

#expire(key, ttl) ⇒ Object



44
45
46
47
# File 'lib/micro_sql/key_value_table.rb', line 44

def expire(key, ttl)
  ttl = ttl ? ttl + Time.now.to_i : ttl
  @db.ask("UPDATE #{table_name} SET ttl=? WHERE uid=?", ttl, key)
end

#update(key, value, ttl = nil) ⇒ Object Also known as: []=



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/micro_sql/key_value_table.rb', line 29

def update(key, value, ttl = nil)
  if value
    encoded = encode(value)
    ttl = ttl ? ttl + Time.now.to_i : 0
    affected = @db.ask("UPDATE #{table_name} SET value=?, ttl=? WHERE uid=?", encoded, ttl, key)
    if affected == 0
      @db.ask("INSERT INTO #{table_name}(value, ttl, uid) VALUES(?,?,?)", encoded, ttl, key)
    end
  else
    @db.ask("DELETE FROM #{table_name} WHERE uid=?", key)
  end

  value
end