rails-crud-tools 0.4.3 → 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 +6 -0
- data/lib/rails/crud/tools/crud_notifications.rb +100 -25
- data/lib/rails/crud/tools/version.rb +1 -1
- metadata +2 -2
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,3 +1,9 @@
|
|
1
|
+
## [0.6.0] - 2025-01-08
|
2
|
+
- Support for select insert, select update, and select delete
|
3
|
+
|
4
|
+
## [0.5.0] - 2025-01-07
|
5
|
+
- Multiple table support
|
6
|
+
|
1
7
|
## [0.4.3] - 2025-01-07
|
2
8
|
- Refactored `crud_notifications.rb`.
|
3
9
|
- Modified to not execute the `setup` method in `tools.rb` when running commands.
|
@@ -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,41 +23,115 @@ 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
|
-
operation = case ::Regexp.last_match(1)
|
28
|
-
when "INSERT" then "C"
|
29
|
-
when "SELECT" then "R"
|
30
|
-
when "UPDATE" then "U"
|
31
|
-
when "DELETE" then "D"
|
32
|
-
else "Unknown"
|
33
|
-
end
|
29
|
+
return unless data[:sql] =~ /\A\s*(INSERT|UPDATE|DELETE|SELECT)/i
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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]}"
|
39
56
|
return
|
40
57
|
end
|
41
58
|
|
42
|
-
|
43
|
-
|
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
|
+
|
44
70
|
key, method = determine_key_and_method
|
45
71
|
if key.nil? || method.nil?
|
46
72
|
CrudLogger.logger.warn "Request not found. #{data[:name]} - #{data[:sql]}"
|
47
73
|
return
|
48
74
|
end
|
49
75
|
|
50
|
-
CrudOperations.instance.add_operation(method, key,
|
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
|
51
81
|
|
52
|
-
|
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
|
53
86
|
|
54
|
-
|
55
|
-
|
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
|
56
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
|
57
97
|
end
|
58
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
|
110
|
+
end
|
111
|
+
|
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
|
118
|
+
if table_names.empty?
|
119
|
+
# テーブル名が見つからない場合は警告を出力
|
120
|
+
CrudLogger.logger.warn "Table name not found in SQL: #{data[:sql]}"
|
121
|
+
return
|
122
|
+
end
|
123
|
+
|
124
|
+
key, method = determine_key_and_method
|
125
|
+
if key.nil? || method.nil?
|
126
|
+
CrudLogger.logger.warn "Request not found. #{data[:name]} - #{data[:sql]}"
|
127
|
+
return
|
128
|
+
end
|
129
|
+
|
130
|
+
# テーブル名を取得して CRUD 操作に追加
|
131
|
+
table_names.each do |table_name|
|
132
|
+
CrudOperations.instance.add_operation(method, key, table_name, operation)
|
133
|
+
end
|
134
|
+
end
|
59
135
|
# キーとメソッドを決定する
|
60
136
|
def self.determine_key_and_method
|
61
137
|
request = Thread.current[:crud_request]
|
@@ -63,8 +139,8 @@ module Rails
|
|
63
139
|
|
64
140
|
if request
|
65
141
|
method = request.request_method
|
66
|
-
controller = request.params[
|
67
|
-
action = request.params[
|
142
|
+
controller = request.params["controller"]
|
143
|
+
action = request.params["action"]
|
68
144
|
key = "#{controller}##{action}"
|
69
145
|
elsif sidekiq_job_class
|
70
146
|
key = sidekiq_job_class
|
@@ -75,7 +151,6 @@ module Rails
|
|
75
151
|
|
76
152
|
[key, method]
|
77
153
|
end
|
78
|
-
|
79
154
|
end
|
80
155
|
end
|
81
|
-
end
|
156
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-crud-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yhijikata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|