rails-crud-tools 0.5.0 → 0.6.0
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/CHANGELOG.md +3 -0
- data/lib/rails/crud/tools/crud_notifications.rb +96 -22
- data/lib/rails/crud/tools/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 829b5130856f1c43f416f97ed0055335696762ae8acf59f5047bd22139bef5cd
|
4
|
+
data.tar.gz: b8de3520453d467c6abe1d780a0fcf85cf6fc4ff3131ad9d5db273e70a90e700
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4372a30ad4b7f7a26ec2409a3bd642999695f986b75890dabe95c424c1d9a2bc1975b17d69e26c13505aecf890e8d05818cc9d30f7768991bc51d52d2d930f77
|
7
|
+
data.tar.gz: ac731ed49cbcb4e118cd4e97fed91138b618d5af1288dfff0e9a62968d9c4991885f6fa0a09ef6d50c8059f45a013d854f7f2d9b736e4031af1f85ab04f2f31d
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/notifications"
|
2
4
|
|
3
5
|
# Notification を使用して SQL クエリを監視するためのモジュール
|
4
6
|
module Rails
|
@@ -12,7 +14,7 @@ module Rails
|
|
12
14
|
|
13
15
|
if CrudConfig.instance.enabled
|
14
16
|
# SQL クエリを監視する
|
15
|
-
ActiveSupport::Notifications.subscribe(/sql.active_record/) do |
|
17
|
+
ActiveSupport::Notifications.subscribe(/sql.active_record/) do |_name, _started, _finished, _unique_id, data|
|
16
18
|
process_sql(data)
|
17
19
|
end
|
18
20
|
end
|
@@ -21,18 +23,98 @@ module Rails
|
|
21
23
|
@subscribed = true
|
22
24
|
end
|
23
25
|
|
26
|
+
OPERATION_UNKNOWN = "Unknown"
|
27
|
+
|
24
28
|
def self.process_sql(data)
|
25
|
-
return unless data[:sql] =~
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
return unless data[:sql] =~ /\A\s*(INSERT|UPDATE|DELETE|SELECT)/i
|
30
|
+
|
31
|
+
case data[:sql]
|
32
|
+
when /\bINSERT INTO\b.*\bSELECT\b/i
|
33
|
+
handle_insert_select(data)
|
34
|
+
when /\bUPDATE\b.*\bSET\b.*\bSELECT\b/i
|
35
|
+
handle_update_select(data)
|
36
|
+
when /\bDELETE\b.*\bEXISTS\b.*\bSELECT\b/i
|
37
|
+
handle_delete_select(data)
|
38
|
+
else
|
39
|
+
handle_general_sql(data)
|
40
|
+
end
|
41
|
+
|
42
|
+
return unless CrudConfig.instance.sql_logging_enabled
|
43
|
+
|
44
|
+
# SQL ログを出力
|
45
|
+
CrudLogger.logger.info "#{data[:name]} - #{data[:sql]}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.handle_insert_select(data)
|
49
|
+
# INSERT INTO ... SELECT の特別な処理
|
50
|
+
insert_table = data[:sql].match(/INSERT INTO\s+`?(\w+)`?/i)[1]
|
51
|
+
select_tables = data[:sql].scan(/SELECT .* FROM\s+`?(\w+)`?(?:\s*,\s*`?(\w+)`?)*|JOIN\s+`?(\w+)`?/i).flatten.compact.uniq
|
52
|
+
|
53
|
+
key, method = determine_key_and_method
|
54
|
+
if key.nil? || method.nil?
|
55
|
+
CrudLogger.logger.warn "Request not found. #{data[:name]} - #{data[:sql]}"
|
56
|
+
return
|
57
|
+
end
|
58
|
+
|
59
|
+
CrudOperations.instance.add_operation(method, key, insert_table, "C")
|
60
|
+
select_tables.each do |select_table|
|
61
|
+
CrudOperations.instance.add_operation(method, key, select_table, "R")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.handle_update_select(data)
|
66
|
+
# UPDATE ... SET ... SELECT の特別な処理
|
67
|
+
update_table = data[:sql].match(/UPDATE\s+`?(\w+)`?/i)[1]
|
68
|
+
select_tables = data[:sql].scan(/SELECT .* FROM\s+`?(\w+)`?(?:\s*,\s*`?(\w+)`?)*|JOIN\s+`?(\w+)`?/i).flatten.compact.uniq
|
69
|
+
|
70
|
+
key, method = determine_key_and_method
|
71
|
+
if key.nil? || method.nil?
|
72
|
+
CrudLogger.logger.warn "Request not found. #{data[:name]} - #{data[:sql]}"
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
CrudOperations.instance.add_operation(method, key, update_table, "U")
|
77
|
+
select_tables.each do |select_table|
|
78
|
+
CrudOperations.instance.add_operation(method, key, select_table, "R")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.handle_delete_select(data)
|
83
|
+
# DELETE ... WHERE EXISTS ... SELECT の特別な処理
|
84
|
+
delete_table = data[:sql].match(/DELETE FROM\s+`?(\w+)`?/i)[1]
|
85
|
+
select_tables = data[:sql].scan(/SELECT .* FROM\s+`?(\w+)`?(?:\s*,\s*`?(\w+)`?)*|JOIN\s+`?(\w+)`?/i).flatten.compact.uniq
|
86
|
+
|
87
|
+
key, method = determine_key_and_method
|
88
|
+
if key.nil? || method.nil?
|
89
|
+
CrudLogger.logger.warn "Request not found. #{data[:name]} - #{data[:sql]}"
|
90
|
+
return
|
91
|
+
end
|
92
|
+
|
93
|
+
CrudOperations.instance.add_operation(method, key, delete_table, "D")
|
94
|
+
select_tables.each do |select_table|
|
95
|
+
CrudOperations.instance.add_operation(method, key, select_table, "R")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.handle_general_sql(data)
|
100
|
+
operation = if (match = data[:sql].match(/\A\s*(INSERT|UPDATE|DELETE|SELECT)/i))
|
101
|
+
case match[1].upcase
|
102
|
+
when "INSERT" then "C"
|
103
|
+
when "SELECT" then "R"
|
104
|
+
when "UPDATE" then "U"
|
105
|
+
when "DELETE" then "D"
|
106
|
+
else OPERATION_UNKNOWN
|
107
|
+
end
|
108
|
+
else
|
109
|
+
OPERATION_UNKNOWN
|
33
110
|
end
|
34
111
|
|
35
|
-
|
112
|
+
if operation == OPERATION_UNKNOWN
|
113
|
+
warn "Warning: Unknown SQL operation. #{data[:name]} - #{data[:sql]}"
|
114
|
+
return
|
115
|
+
end
|
116
|
+
|
117
|
+
table_names = data[:sql].scan(/(?:INSERT INTO|UPDATE|DELETE FROM|FROM|JOIN)\s+`?(\w+)`?(?:\s*,\s*`?(\w+)`?)*/i).flatten.compact.uniq
|
36
118
|
if table_names.empty?
|
37
119
|
# テーブル名が見つからない場合は警告を出力
|
38
120
|
CrudLogger.logger.warn "Table name not found in SQL: #{data[:sql]}"
|
@@ -49,14 +131,7 @@ module Rails
|
|
49
131
|
table_names.each do |table_name|
|
50
132
|
CrudOperations.instance.add_operation(method, key, table_name, operation)
|
51
133
|
end
|
52
|
-
|
53
|
-
return unless CrudConfig.instance.sql_logging_enabled
|
54
|
-
|
55
|
-
# SQL ログを出力
|
56
|
-
CrudLogger.logger.info "#{data[:name]} - #{data[:sql]}"
|
57
|
-
|
58
134
|
end
|
59
|
-
|
60
135
|
# キーとメソッドを決定する
|
61
136
|
def self.determine_key_and_method
|
62
137
|
request = Thread.current[:crud_request]
|
@@ -64,8 +139,8 @@ module Rails
|
|
64
139
|
|
65
140
|
if request
|
66
141
|
method = request.request_method
|
67
|
-
controller = request.params[
|
68
|
-
action = request.params[
|
142
|
+
controller = request.params["controller"]
|
143
|
+
action = request.params["action"]
|
69
144
|
key = "#{controller}##{action}"
|
70
145
|
elsif sidekiq_job_class
|
71
146
|
key = sidekiq_job_class
|
@@ -76,7 +151,6 @@ module Rails
|
|
76
151
|
|
77
152
|
[key, method]
|
78
153
|
end
|
79
|
-
|
80
154
|
end
|
81
155
|
end
|
82
|
-
end
|
156
|
+
end
|