class Bricolage::PSQLDataSource
Attributes
database[R]
host[R]
port[R]
sql_log_level[R]
user[R]
Public Class Methods
new( host: 'localhost', port: 5439, database: 'dev', username: ENV['LOGNAME'], password: nil, pgpass: nil, encoding: nil, psql: 'psql', sql_log_level: Logger::INFO, tmpdir: Dir.tmpdir)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 18 def initialize( host: 'localhost', port: 5439, database: 'dev', username: ENV['LOGNAME'], password: nil, pgpass: nil, encoding: nil, psql: 'psql', sql_log_level: Logger::INFO, tmpdir: Dir.tmpdir) @host = host @port = port @database = database @user = username @password = password @pgpass = pgpass @encoding = encoding @psql = psql @sql_log_level = Logger.intern_severity(sql_log_level) @tmpdir = tmpdir raise ParameterError, "missing psql host" unless @host raise ParameterError, "missing psql port" unless @port raise ParameterError, "missing psql database" unless @database raise ParameterError, "missing psql username" unless @user unless @pgpass or @password raise ParameterError, "missing psql password" end end
Public Instance Methods
analyze(table)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 145 def analyze(table) open {|conn| conn.analyze(table) } end
drop_table(name)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 119 def drop_table(name) open {|conn| conn.drop_table(name) } end
drop_table_force(name)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 123 def drop_table_force(name) open {|conn| conn.drop_table_force(name) } end
execute(source, options = [])
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 64 def execute(source, options = []) make_tmpfile(source, tmpdir: @tmpdir) {|path| st = command @psql, "--no-psqlrc", "--host=#{@host}", "--port=#{@port}", "--username=#{@user}", @database, '--echo-all', '-v', 'ON_ERROR_STOP=true', '-f', path, '--no-password', *options, env: get_psql_env unless st.success? begin msg = LogLocator.slice_last_stderr(/^psql:.*?:\d+: ERROR: (.*)/, 1) rescue IOError => ex # slice_last_stderr may fail if stderr is not a file logger.error ex.message msg = nil end end JobResult.for_process_status(st, msg) } end
get_psql_env()
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 87 def get_psql_env env = {} if @pgpass env["PGPASSFILE"] = @pgpass elsif @password env["PGPASSWORD"] = @password end env end
new_task()
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 55 def new_task PSQLTask.new(self) end
open(&block)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 111 def open(&block) PostgresConnection.open_data_source(self, &block) end
open_for_batch() { || ... }
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 59 def open_for_batch # do not call #open yield end
password()
click to toggle source
Ruby Library Interface
# File lib/bricolage/psqldatasource.rb, line 101 def password # FIXME: same user must not exist @password ||= read_password_from_pgpass(@pgpass, @user) end
query_batch(query, batch_size = 5000, &block)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 115 def query_batch(query, batch_size = 5000, &block) open {|conn| conn.query_batch(query, batch_size, &block) } end
read_password_from_pgpass(path, user)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 106 def read_password_from_pgpass(path, user) File.read(path).slice(/:#{user}:([^:\r\n]+)$/, 1) or raise ParameterError, "could not read password: #{path}, #{user}" end
select(table, &block)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 127 def select(table, &block) open {|conn| conn.select(table, &block) } end
vacuum(table)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 133 def vacuum(table) serialize_vacuum { open {|conn| conn.vacuum(table) } } end
vacuum_sort_only(table)
click to toggle source
# File lib/bricolage/psqldatasource.rb, line 139 def vacuum_sort_only(table) serialize_vacuum { open {|conn| conn.vacuum_sort_only(table) } } end