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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '008fdf2673bcbae231ccc376ca9fdf1c7647ea2df3a3a5037e6beb60d4b67728'
4
- data.tar.gz: c8006b6be02b313626f05cf021a3264a555ed54314f60c3e349aabdc680e28b4
3
+ metadata.gz: 829b5130856f1c43f416f97ed0055335696762ae8acf59f5047bd22139bef5cd
4
+ data.tar.gz: b8de3520453d467c6abe1d780a0fcf85cf6fc4ff3131ad9d5db273e70a90e700
5
5
  SHA512:
6
- metadata.gz: 5f7b3dd252dad14b4e262d33e6f7c79fb784e791739ba0d74adb33fb6187f473d84d314c342f897ea97670b215bd8811a36195b070642252990f9f26d6adb142
7
- data.tar.gz: fe6df88290d5132775d2e796e9a2b80f01ec3409f5ffc1b7c9438b4993f16681bd5e4c06e63cc91d46e4b31f8f5a8f8e7c707d9acfbde428d4f3faa4637773a5
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
- require 'active_support/notifications'
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 |name, started, finished, unique_id, data|
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] =~ /(INSERT|UPDATE|DELETE|SELECT)/
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
- match_data = data[:sql].match(/(?:INSERT INTO|UPDATE|DELETE FROM|FROM)\s+`?(\w+)`?/i)
36
- unless match_data
37
- # テーブル名が見つからない場合は警告を出力
38
- CrudLogger.logger.warn "Table name not found in SQL: #{data[:sql]}"
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
- # テーブル名を取得して CRUD 操作に追加
43
- table_name = match_data[1]
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, table_name, operation)
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
- return unless CrudConfig.instance.sql_logging_enabled
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
- # SQL ログを出力
55
- CrudLogger.logger.info "#{data[:name]} - #{data[:sql]}"
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['controller']
67
- action = request.params['action']
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
@@ -3,7 +3,7 @@
3
3
  module Rails
4
4
  module Crud
5
5
  module Tools
6
- VERSION = "0.4.3"
6
+ VERSION = "0.6.0"
7
7
  end
8
8
  end
9
9
  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.3
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-06 00:00:00.000000000 Z
11
+ date: 2025-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord