Sha256: eacd9342282e33ab1de97ba557938a73cbf010225c6991c8e8a1de752e6306f6

Contents?: true

Size: 1.68 KB

Versions: 3

Compression:

Stored size: 1.68 KB

Contents

# -- The settings table; has support for ttl etc. ---------------------------

require "json"

class MicroSql::KeyValueTable < MicroSql::Table
  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
  
  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

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

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

  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

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

  alias :[]= :update

  private
  
  def decode(io)
    return unless io
    return PG::Connection.unescape_bytea(io) if db.is_a?(MicroSql::PgAdapter)

    JSON.parse("[#{io}]").first
  end
  
  def encode(value)
    return unless value
    
    return db.connection.escape_bytea(value.to_s) if db.is_a?(MicroSql::PgAdapter)
    
    value.to_json
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
micro_sql-0.4.3 lib/micro_sql/key_value_table.rb
micro_sql-0.4.2 lib/micro_sql/key_value_table.rb
micro_sql-0.4.1 lib/micro_sql/key_value_table.rb