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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5f67e7e466a9b26e7ddf8a539d276694c0ad188117fc6b6719739b923a3577e
4
- data.tar.gz: e684b41c0054a02162343721f290e3c77bd5d73a48302faed1858716a4c14fa7
3
+ metadata.gz: 829b5130856f1c43f416f97ed0055335696762ae8acf59f5047bd22139bef5cd
4
+ data.tar.gz: b8de3520453d467c6abe1d780a0fcf85cf6fc4ff3131ad9d5db273e70a90e700
5
5
  SHA512:
6
- metadata.gz: e7dbb6a30981ee535a3656a80e88281d899d0b4271580e2920aedf670bfa846a2a4c0f4cb739a31ff016cb763bf6a491ceae34125a4b69b4885135b408a59091
7
- data.tar.gz: db890338796f0430d4502a198c8f9ecb54184188b189ecdbefc4a4cb194b61761ca4c68e4e949cdff1801ecab103af135ffd918ad76439edb9f0c7b3365a75a8
6
+ metadata.gz: 4372a30ad4b7f7a26ec2409a3bd642999695f986b75890dabe95c424c1d9a2bc1975b17d69e26c13505aecf890e8d05818cc9d30f7768991bc51d52d2d930f77
7
+ data.tar.gz: ac731ed49cbcb4e118cd4e97fed91138b618d5af1288dfff0e9a62968d9c4991885f6fa0a09ef6d50c8059f45a013d854f7f2d9b736e4031af1f85ab04f2f31d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## [0.6.0] - 2025-01-08
2
+ - Support for select insert, select update, and select delete
3
+
1
4
  ## [0.5.0] - 2025-01-07
2
5
  - Multiple table support
3
6
 
@@ -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,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] =~ /(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"
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
- table_names = data[:sql].scan(/(?:INSERT INTO|UPDATE|DELETE FROM|FROM|JOIN)\s+`?(\w+)`?(?:\s*,\s*`?(\w+)`?)*/i).flatten.compact
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['controller']
68
- action = request.params['action']
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
@@ -3,7 +3,7 @@
3
3
  module Rails
4
4
  module Crud
5
5
  module Tools
6
- VERSION = "0.5.0"
6
+ VERSION = "0.6.0"
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-crud-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yhijikata