pg_rls 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/pg_rls/install_generator.rb +12 -0
- data/lib/pg_rls/multi_tenancy.rb +0 -14
- data/lib/pg_rls/tenant.rb +21 -23
- data/lib/pg_rls/version.rb +1 -1
- data/lib/pg_rls.rb +23 -19
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e0133ebb0867d0bfeeea122f6ddef47f861c6b17e2b8b65a07acdca4768c66a
|
4
|
+
data.tar.gz: 5bd700b9dd72150b01e72086f07795772cbb3f3b512e7106dbf58b2850713414
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af0c6529cd940354cbaf1432c7086e1ae336f0d160df036108820873f31699c580833b7b153956e1b599b26946de15e8bfd5eda2dc94e10fa8b0b757fc94bcf1
|
7
|
+
data.tar.gz: 04feda60ca3f7fa0e98f096246db9ba2d4eecac158af08f719631e7f078b224e5dc33b660e92129a6eb70e217bb7e550fdf74843015b1df988272954d756192c
|
@@ -16,6 +16,8 @@ module PgRls
|
|
16
16
|
end
|
17
17
|
super
|
18
18
|
end
|
19
|
+
ENVIRONMENT_PATH = 'config/environment.rb'
|
20
|
+
|
19
21
|
APPLICATION_LINE = 'class Application < Rails::Application'
|
20
22
|
APPLICATION_PATH = 'config/application.rb'
|
21
23
|
|
@@ -50,6 +52,12 @@ module PgRls
|
|
50
52
|
template 'pg_rls.rb.tt', 'config/initializers/pg_rls.rb'
|
51
53
|
end
|
52
54
|
|
55
|
+
def inject_include_to_environment
|
56
|
+
return if environment_already_included?
|
57
|
+
|
58
|
+
prepend_to_file(ENVIRONMENT_PATH, "\nrequire_relative 'initializers/pg_rls'\n")
|
59
|
+
end
|
60
|
+
|
53
61
|
def inject_include_to_application
|
54
62
|
return if aplication_already_included?
|
55
63
|
|
@@ -74,6 +82,10 @@ module PgRls
|
|
74
82
|
File.readlines(APPLICATION_PATH).grep(/config.active_record.schema_format = :sql/).any?
|
75
83
|
end
|
76
84
|
|
85
|
+
def environment_already_included?
|
86
|
+
File.readlines(ENVIRONMENT_PATH).grep(/require_relative 'initializers\/pg_rls'/).any?
|
87
|
+
end
|
88
|
+
|
77
89
|
def initialize_error_text
|
78
90
|
<<~ERROR
|
79
91
|
TO DO
|
data/lib/pg_rls/multi_tenancy.rb
CHANGED
@@ -28,19 +28,5 @@ module PgRls
|
|
28
28
|
session[:_tenant] = nil
|
29
29
|
raise PgRls::Errors::TenantNotFound, 'No tenant was found'
|
30
30
|
end
|
31
|
-
|
32
|
-
def switch_tenant_by_resource!(resource = nil)
|
33
|
-
Tenant.switch!(resource)
|
34
|
-
session[:_tenant] = resource
|
35
|
-
rescue PgRls::Errors::TenantNotFound
|
36
|
-
Tenant.switch(session[:_tenant])
|
37
|
-
rescue NoMethodError
|
38
|
-
session[:tenant] = nil
|
39
|
-
redirect_to '/'
|
40
|
-
end
|
41
|
-
|
42
|
-
def tenant_match_session_cookies?
|
43
|
-
session[:_tenant] == request.subdomain
|
44
|
-
end
|
45
31
|
end
|
46
32
|
end
|
data/lib/pg_rls/tenant.rb
CHANGED
@@ -4,15 +4,9 @@ module PgRls
|
|
4
4
|
# Tenant Controller
|
5
5
|
module Tenant
|
6
6
|
class << self
|
7
|
-
attr_reader :tenant
|
8
|
-
|
9
7
|
def switch(resource)
|
10
|
-
|
11
|
-
|
12
|
-
"RLS changed to '#{tenant.id}'"
|
13
|
-
rescue StandardError => e
|
14
|
-
Rails.logger.info('connection was not made')
|
15
|
-
Rails.logger.info(e)
|
8
|
+
switch!(resource)
|
9
|
+
rescue PgRls::Errors::TenantNotFound
|
16
10
|
nil
|
17
11
|
end
|
18
12
|
|
@@ -22,15 +16,18 @@ module PgRls
|
|
22
16
|
"RLS changed to '#{tenant.id}'"
|
23
17
|
rescue StandardError => e
|
24
18
|
Rails.logger.info('connection was not made')
|
25
|
-
raise
|
19
|
+
raise PgRls::Errors::TenantNotFound
|
26
20
|
end
|
27
21
|
|
22
|
+
|
28
23
|
def with_tenant!(resource)
|
29
|
-
|
24
|
+
PgRls.main_model.connection_pool.with_connection do
|
25
|
+
tenant = switch_tenant!(resource)
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
yield(tenant).presence if block_given?
|
28
|
+
ensure
|
29
|
+
reset_rls! unless PgRls.test_inline_tenant == true
|
30
|
+
end
|
34
31
|
end
|
35
32
|
|
36
33
|
def fetch
|
@@ -39,19 +36,15 @@ module PgRls
|
|
39
36
|
nil
|
40
37
|
end
|
41
38
|
|
42
|
-
def
|
43
|
-
|
39
|
+
def fetch!
|
40
|
+
PgRls.main_model.find_by!(
|
44
41
|
tenant_id: PgRls.connection_class.connection.execute(
|
45
42
|
"SELECT current_setting('rls.tenant_id')"
|
46
43
|
).getvalue(0, 0)
|
47
44
|
)
|
48
45
|
end
|
49
|
-
alias fetch! tenant!
|
50
46
|
|
51
47
|
def reset_rls!
|
52
|
-
return if @tenant.blank?
|
53
|
-
|
54
|
-
@tenant = nil
|
55
48
|
PgRls.execute_rls_in_shards do |connection_class|
|
56
49
|
connection_class.transaction do
|
57
50
|
connection_class.connection.execute('RESET rls.tenant_id')
|
@@ -68,7 +61,7 @@ module PgRls
|
|
68
61
|
PgRls.main_model.ignored_columns = []
|
69
62
|
# rubocop: enable Rails/IgnoredColumnsAssignment
|
70
63
|
|
71
|
-
find_tenant(resource)
|
64
|
+
tenant = find_tenant(resource)
|
72
65
|
|
73
66
|
PgRls.execute_rls_in_shards do |connection_class|
|
74
67
|
connection_class.transaction do
|
@@ -78,6 +71,8 @@ module PgRls
|
|
78
71
|
end
|
79
72
|
|
80
73
|
tenant
|
74
|
+
rescue NoMethodError
|
75
|
+
raise PgRls::Errors::TenantNotFound
|
81
76
|
end
|
82
77
|
|
83
78
|
def find_tenant(resource)
|
@@ -85,14 +80,17 @@ module PgRls
|
|
85
80
|
|
86
81
|
reset_rls!
|
87
82
|
|
83
|
+
tenant = nil
|
84
|
+
|
88
85
|
PgRls.search_methods.each do |method|
|
89
|
-
break if
|
86
|
+
break if tenant.present?
|
90
87
|
|
91
|
-
|
92
|
-
@tenant = find_tenant_by_method(resource, method)
|
88
|
+
tenant = find_tenant_by_method(resource, method)
|
93
89
|
end
|
94
90
|
|
95
91
|
raise PgRls::Errors::TenantNotFound if tenant.blank?
|
92
|
+
|
93
|
+
tenant
|
96
94
|
end
|
97
95
|
|
98
96
|
def find_tenant_by_method(resource, method)
|
data/lib/pg_rls/version.rb
CHANGED
data/lib/pg_rls.rb
CHANGED
@@ -62,20 +62,19 @@ module PgRls
|
|
62
62
|
|
63
63
|
def admin_execute(query = nil, &)
|
64
64
|
current_tenant = PgRls::Tenant.fetch
|
65
|
-
|
66
|
-
self.as_db_admin = true
|
67
|
-
establish_new_connection!
|
65
|
+
establish_new_connection!(admin: true)
|
68
66
|
|
69
67
|
return ensure_block_execution(&) if block_given?
|
70
68
|
|
71
69
|
execute(query)
|
72
70
|
ensure
|
73
|
-
self.as_db_admin = false
|
74
71
|
establish_new_connection!
|
75
72
|
PgRls::Tenant.switch(current_tenant) if current_tenant.present?
|
76
73
|
end
|
77
74
|
|
78
|
-
def establish_new_connection!
|
75
|
+
def establish_new_connection!(admin: false)
|
76
|
+
self.as_db_admin = admin
|
77
|
+
|
79
78
|
execute_rls_in_shards do |connection_class, pool|
|
80
79
|
connection_class.remove_connection
|
81
80
|
connection_class.establish_connection(pool.db_config)
|
@@ -87,24 +86,20 @@ module PgRls
|
|
87
86
|
end
|
88
87
|
|
89
88
|
def on_each_tenant(&)
|
90
|
-
|
89
|
+
with_rls_connection do
|
90
|
+
result = []
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
Tenant.switch tenant.send(allowed_search_fields.first)
|
96
|
-
|
97
|
-
result << { tenant:, result: ensure_block_execution(tenant, &) }
|
98
|
-
end
|
92
|
+
main_model.find_each do |tenant|
|
93
|
+
allowed_search_fields = search_methods.map(&:to_s).intersection(main_model.column_names)
|
94
|
+
Tenant.switch tenant.send(allowed_search_fields.first)
|
99
95
|
|
100
|
-
|
96
|
+
result << { tenant:, result: ensure_block_execution(tenant, &) }
|
97
|
+
end
|
101
98
|
|
102
|
-
|
103
|
-
end
|
99
|
+
PgRls::Tenant.reset_rls!
|
104
100
|
|
105
|
-
|
106
|
-
|
107
|
-
establish_new_connection!
|
101
|
+
result
|
102
|
+
end
|
108
103
|
end
|
109
104
|
|
110
105
|
def execute_rls_in_shards
|
@@ -138,6 +133,15 @@ module PgRls
|
|
138
133
|
|
139
134
|
attr_writer :as_db_admin
|
140
135
|
|
136
|
+
def with_rls_connection(&)
|
137
|
+
reset_connection = admin_connection?
|
138
|
+
|
139
|
+
establish_new_connection! if reset_connection
|
140
|
+
ensure_block_execution(&)
|
141
|
+
ensure
|
142
|
+
establish_new_connection!(admin: true) if reset_connection
|
143
|
+
end
|
144
|
+
|
141
145
|
def ensure_block_execution(*, **)
|
142
146
|
yield(*, **).presence
|
143
147
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_rls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Laloush
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,7 +85,7 @@ licenses:
|
|
85
85
|
- MIT
|
86
86
|
metadata:
|
87
87
|
rubygems_mfa_required: 'true'
|
88
|
-
post_install_message:
|
88
|
+
post_install_message:
|
89
89
|
rdoc_options: []
|
90
90
|
require_paths:
|
91
91
|
- lib
|
@@ -100,8 +100,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
100
|
- !ruby/object:Gem::Version
|
101
101
|
version: '0'
|
102
102
|
requirements: []
|
103
|
-
rubygems_version: 3.
|
104
|
-
signing_key:
|
103
|
+
rubygems_version: 3.3.7
|
104
|
+
signing_key:
|
105
105
|
specification_version: 4
|
106
106
|
summary: Write a short summary, because RubyGems requires one.
|
107
107
|
test_files: []
|