Class: Psql

Inherits:
Object
  • Object
show all
Defined in:
lib/raka/lang/psql/impl.rb

Overview

postgresql protocol using psql, requires HOST, PORT, USER, DB

Instance Method Summary collapse

Constructor Details

#initialize(conn: nil, create: 'mview', params: {}) ⇒ Psql

  1. do not add required argument here, so psql.config will work or we can only use psql(conn: xxx).config



27
28
29
30
31
# File 'lib/raka/lang/psql/impl.rb', line 27

def initialize(conn: nil, create: 'mview', params: {})
  @create = create
  @params = params
  @conn = conn
end

Instance Method Details

#build(code, _) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/raka/lang/psql/impl.rb', line 33

def build(code, _)
  # 2. lazily check the argument only when used
  raise 'argument conn required' if @conn.nil?

  if @create.to_s == 'table'
    'DROP TABLE IF EXISTS :_name_;' \
      'CREATE TABLE :_name_ AS (' + code + ');'
  elsif @create.to_s == 'mview'
    'DROP MATERIALIZED VIEW IF EXISTS :_name_;' \
      'CREATE MATERIALIZED VIEW :_name_ AS (' + code + ');'
  else
    code
  end
end

#run_script(env, fname, task) ⇒ Object



48
49
50
51
52
53
54
55
56
# File 'lib/raka/lang/psql/impl.rb', line 48

def run_script(env, fname, task)
  param_str = (@params || {}).map { |k, v| "-v #{k}=\"#{v}\"" }.join(' ')

  bash env, %(
  #{sh_cmd(task.scope)} #{param_str} -v _name_=#{task.stem} \
    -f #{fname} | tee #{fname}.log
  mv #{fname}.log #{task.name}
  )
end

#sh_cmd(scope) ⇒ Object

Sometimes we want to use the psql command with bash directly



20
21
22
23
24
# File 'lib/raka/lang/psql/impl.rb', line 20

def sh_cmd(scope)
  c = @conn
  env_vars = "PGOPTIONS='-c search_path=#{scope ? scope + ',' : ''}public' "
  "PGPASSWORD=#{c.password} #{env_vars} psql -h #{c.host} -p #{c.port} -U #{c.user} -d #{c.db} -v ON_ERROR_STOP=1"
end