Class: MicroSql::KeyValueTable
- Defined in:
- lib/micro_sql/key_value_table.rb
Instance Attribute Summary
Attributes inherited from Table
Instance Method Summary collapse
- #[](key) ⇒ Object
- #cached(key, ttl = nil, &block) ⇒ Object
- #delete_all ⇒ Object
- #expire(key, ttl) ⇒ Object
-
#initialize(db, table_name = "settings") ⇒ KeyValueTable
constructor
A new instance of KeyValueTable.
- #update(key, value, ttl = nil) ⇒ Object (also: #[]=)
Methods inherited from Table
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_all ⇒ Object
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 |