class Golem::DB::Pg

Postgres functionality. Requires pg.

Public Class Methods

new(db_url) click to toggle source

Initializes PGConn connection. @param [String] db_url postgres url to connect to (e.g. +postgres://user:pw@host/db+).

# File lib/golem/db/pg.rb, line 7
def initialize(db_url)
    @connection ||= ::PGconn.connect(*(db_url.match(/\Apostgres:\/\/([^:]+):([^@]+)@([^\/]+)\/(.+)\z/) {|m| [m[3], 5432, nil, nil, m[4], m[1], m[2]]}))
end

Public Instance Methods

repositories(opts = {}) click to toggle source

Retrieve repositories. @param [Hash] opts options, see {Golem::DB}. @return [Array] list of repotitories.

# File lib/golem/db/pg.rb, line 22
def repositories(opts = {})
    opts[:table] = :repositories
    get(opts)
end
setup() click to toggle source

Setup schema. @return [PGRes] result.

# File lib/golem/db/pg.rb, line 37
def setup
    @connection.exec(File.read(File.expand_path(File.dirname(__FILE__) + '/postgres.sql')))
end
ssh_keys(opts = {}) click to toggle source

Retrieve ssh keys. @param [Hash] opts options, see {Golem::DB}. @return [Array] list of keys.

# File lib/golem/db/pg.rb, line 30
def ssh_keys(opts = {})
    opts[:table] = "keys join users on keys.user_name=users.name"
    get(opts)
end
users(opts = {}) click to toggle source

Retrieve users. @param [Hash] opts options, see {Golem::DB}. @return [Array] list of users.

# File lib/golem/db/pg.rb, line 14
def users(opts = {})
    opts[:table] = :users
    get(opts)
end

Private Instance Methods

get(opts = {}) click to toggle source
# File lib/golem/db/pg.rb, line 42
def get(opts = {})
    table = opts.delete(:table) || ''
    fields = opts.delete(:fields) || ['*']
    fields = [fields] unless fields.is_a?(Array)
    order = opts.delete(:order)
    limit = opts.delete(:limit)
    ret_array = opts.delete(:return) == :array
    sql = "SELECT #{fields.collect {|f| f.to_s}.join(', ')} FROM #{table.to_s}"
    sql += " WHERE #{opts.keys.enum_for(:each_with_index).collect {|k, i| k.to_s + ' = $' + (i + 1).to_s}.join(' AND ')}" if opts.length > 0
    sql += " ORDER BY #{order.to_s}" if order
    sql += " LIMIT #{limit.to_s}" if limit
    res = @connection.exec(sql, opts.values)
    ret_fields = fields === ['*'] ? res.fields : fields
    ret = res.collect do |row|
        if ret_array
            v = ret_fields.collect {|f| row[f.to_s]}
            v.length == 1 ? v.first : v
        else
            ret_fields.inject({}) do |memo, field|
                memo[field.to_sym] = row[field.to_s]
                memo
            end
        end
    end
    res.clear
    ret
end