Class: PgConn::SessionMethods

Inherits:
Object
  • Object
show all
Defined in:
lib/pg_conn/session_methods.rb

Overview

Schema methods

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(conn) ⇒ SessionMethods

Returns a new instance of SessionMethods.



6
7
8
# File 'lib/pg_conn/session_methods.rb', line 6

def initialize(conn)
  @conn = conn
end

Instance Attribute Details

#connObject (readonly)

Returns the value of attribute conn.



4
5
6
# File 'lib/pg_conn/session_methods.rb', line 4

def conn
  @conn
end

Instance Method Details

#disable(database) ⇒ Object

Ensure connections to the given database are disabled



38
39
40
41
# File 'lib/pg_conn/session_methods.rb', line 38

def disable(database)
  !database.nil? or raise ArgumentError
  conn.execute "alter database #{database} allow_connections = false"
end

#disable_triggersObject

Disable session triggers



95
96
97
# File 'lib/pg_conn/session_methods.rb', line 95

def disable_triggers()
  conn.execute "set session session_replication_role = replica"
end

#enable(database) ⇒ Object

Ensure connections to the given database are enabled



32
33
34
35
# File 'lib/pg_conn/session_methods.rb', line 32

def enable(database)
  !database.nil? or raise ArgumentError
  conn.execute "alter database #{database} allow_connections = true"
end

#enable_triggersObject

Enable session triggers



90
91
92
# File 'lib/pg_conn/session_methods.rb', line 90

def enable_triggers()
  conn.execute "set session session_replication_role = DEFAULT"
end

#enabled?(database) ⇒ Boolean

Return true if the given database accepts connections

Returns:

  • (Boolean)


26
27
28
29
# File 'lib/pg_conn/session_methods.rb', line 26

def enabled?(database) 
  !database.nil? or raise ArgumentError
  conn.value "select datallowconn from pg_catalog.pg_database where datname = '#{database}'"
end

#exclusive(database, &block) ⇒ Object

Run block without any connected users. Existing sessions are terminated



74
75
76
77
78
79
80
81
82
83
# File 'lib/pg_conn/session_methods.rb', line 74

def exclusive(database, &block) 
  !database.nil? or raise ArgumentError
  begin
    disable(database)
    terminate(database, nil)
    yield
  ensure
    enable(database)
  end
end

#list(database) ⇒ Object

Returns a list of users connected to the given database. If database is nil, it returns a list of database/username tuples for all connected users



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/pg_conn/session_methods.rb', line 13

def list(database)
  if database
    conn.values "select usename from pg_stat_activity where datname = '#{database}'"
  else
    conn.tuples %(
      select datname, usename
      from pg_stat_activity 
      where datname is not null and usename is not null
    )
  end
end

#terminate(database, *users) ⇒ Object

Terminate sessions in the database of the given users or of all users if nil. Note that ‘terminate(database)’ is a nop because the absent users argument defaults to an empty list

TODO: Make is possible to terminate a single session of a user with

multiple sessions (is this ever relevant?)


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/pg_conn/session_methods.rb', line 52

def terminate(database, *users)
  !database.nil? or raise ArgumentError
  enabled = self.enabled?(database)

  case users
    when []; 
      return
    when [nil]
      self.disable(database) if enabled
      users = self.list(database)
    else 
      users = Array(users).flatten
  end
  pids = self.pids(database, users)
  if !pids.empty?
    pids_sql = pids.map { |pid| "(#{pid})" }.join(", ")
    conn.execute "select pg_terminate_backend(pid) from ( values #{pids_sql} ) as x(pid)"
  end
  self.enable(database) if self.enabled?(database) != enabled
end

#triggers(on_off, &block) ⇒ Object

Execute block with session triggers on or off



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/pg_conn/session_methods.rb', line 100

def triggers(on_off, &block)
  begin
    active = triggers?
    if on_off && !active
      enable_triggers
    elsif !on_off && active
      disable_triggers
    end
    yield
  ensure
    case active
      when true; enable_triggers if !triggers?
      when false; disable_triggers if triggers?
    end
  end
end

#triggers?Boolean

Return true if session triggers are enabled. Triggers are enabled by default by Postgres

Returns:

  • (Boolean)


87
# File 'lib/pg_conn/session_methods.rb', line 87

def triggers?() conn.value "select current_setting('session_replication_role') <> 'replica'" end