Class: PgConn::SessionMethods
- Inherits:
-
Object
- Object
- PgConn::SessionMethods
- Defined in:
- lib/pg_conn/session_methods.rb
Overview
Schema methods
Instance Attribute Summary collapse
-
#conn ⇒ Object
readonly
Returns the value of attribute conn.
Instance Method Summary collapse
-
#disable(database) ⇒ Object
Ensure connections to the given database are disabled.
-
#disable_triggers ⇒ Object
Disable session triggers.
-
#enable(database) ⇒ Object
Ensure connections to the given database are enabled.
-
#enable_triggers ⇒ Object
Enable session triggers.
-
#enabled?(database) ⇒ Boolean
Return true if the given database accepts connections.
-
#exclusive(database, &block) ⇒ Object
Run block without any connected users.
-
#initialize(conn) ⇒ SessionMethods
constructor
A new instance of SessionMethods.
-
#list(database) ⇒ Object
Returns a list of users connected to the given database.
-
#terminate(database, *users) ⇒ Object
Terminate sessions in the database of the given users or of all users if nil.
-
#triggers(on_off, &block) ⇒ Object
Execute block with session triggers on or off.
-
#triggers? ⇒ Boolean
Return true if session triggers are enabled.
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
#conn ⇒ Object (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_triggers ⇒ Object
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_triggers ⇒ Object
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
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
87 |
# File 'lib/pg_conn/session_methods.rb', line 87 def triggers?() conn.value "select current_setting('session_replication_role') <> 'replica'" end |