ridgepole-ext-tidb 0.2.0 → 0.2.1

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: f614666ce88942bff9b8d9c8b28288bdb8caef40baaf858e661217cbe473b36b
4
- data.tar.gz: b807880de067c8bbd4e50bc926ac282b8ffb6fd6f9bcd3b60ae11dd41deadec2
3
+ metadata.gz: b369c3c9f3078db98f28341fe98396425d7f6b995d9bc931b8d48717c2a52335
4
+ data.tar.gz: 78bf0c2a62ea2c22618bfb38a5477c6fb674531e765cbb6f2d835b0f013bb68c
5
5
  SHA512:
6
- metadata.gz: a38dd256520f28c16538e866f94e6230a16c7e30573428233690c0a1782ed2448f4aa073b2d6a68f742844645a4c3087c3dfb0fe09afa2599caca1e93d5c28d0
7
- data.tar.gz: 81deb36f995f80bce6ae820919a2a0db457034ee5f398e9e40bc9c6ee96c6272d0b030df4c860de5fe3064d9f7bf8a8bf9376fcc9c7e2e7f8ca1dc694903ad60
6
+ metadata.gz: ee91cd5d10bb5d601499587ca3d88ecf5ff04b7eac44cecbccb6eeaed69670fe603c4ac5880958b8d636cc92a9ff09dd1f29ea6c9ebebe3fa817aa13f4cb2134
7
+ data.tar.gz: f3956f87de294466ca03cf1b34247afbafdbbbaf8cfe6f7d5081bee0cb12cf6c8670ca7098aabc06bc23829ea8d8af41bdbc92b3fd9da2df8f682817fac8af2a
@@ -3,7 +3,7 @@
3
3
  module Ridgepole
4
4
  module Ext
5
5
  module Tidb
6
- VERSION = '0.2.0'
6
+ VERSION = '0.2.1'
7
7
  end
8
8
  end
9
9
  end
@@ -8,6 +8,8 @@ module Ridgepole
8
8
  def self.setup!
9
9
  # SchemaDumperにもAUTO_RANDOM対応を追加
10
10
  extend_schema_dumper
11
+ # Hash#assert_valid_keysを拡張してauto_randomキーを許可
12
+ extend_hash_assert_valid_keys
11
13
  end # 手動で接続アダプタを拡張するメソッド(外部から呼び出し可能)
12
14
  def self.ensure_connection_extended!
13
15
  return unless ActiveRecord::Base.connected?
@@ -24,6 +26,11 @@ module Ridgepole
24
26
  # 既に拡張済みかチェック
25
27
  return if adapter_class.method_defined?(:tidb?)
26
28
 
29
+ # Hash#assert_valid_keysを拡張してauto_randomキーを許可
30
+ extend_hash_assert_valid_keys
31
+ # TableDefinitionを拡張して:auto_randomオプションをサポート
32
+ extend_table_definition
33
+
27
34
  adapter_class.class_eval do
28
35
  # AUTO_RANDOMカラムの検出
29
36
  def auto_random_column?(table_name, column_name)
@@ -64,7 +71,9 @@ module Ridgepole
64
71
  rescue => e
65
72
  puts "AUTO_RANDOM detection failed: #{e.message}"
66
73
  false
67
- end # TiDBかどうかの判定
74
+ end
75
+
76
+ # TiDBかどうかの判定
68
77
  def tidb?
69
78
  # VERSION()関数でTiDBを検出(キャッシュなし)
70
79
  version_info = select_value('SELECT VERSION()')
@@ -79,27 +88,21 @@ module Ridgepole
79
88
  # CREATE TABLE時のAUTO_RANDOM対応
80
89
  alias_method :create_table_without_auto_random, :create_table
81
90
  def create_table(table_name, **options, &block)
91
+ # :auto_randomキーを処理する前に、idオプションから取り除く
82
92
  if options.dig(:id, :auto_random) && tidb?
83
- # AUTO_RANDOMを含むテーブル作成
84
- sql = build_create_table_sql_with_auto_random(table_name, **options, &block)
85
- execute(sql)
86
- else
87
- create_table_without_auto_random(table_name, **options, &block)
88
- end
89
- end
93
+ # auto_randomフラグを保存
94
+ auto_random_enabled = options[:id].delete(:auto_random)
90
95
 
91
- private
92
-
93
- def build_create_table_sql_with_auto_random(table_name, **options, &block)
94
- # 簡単な実装 - 実際にはより複雑になる
95
- sql = "CREATE TABLE #{quote_table_name(table_name)} ("
96
+ # 通常のcreate_tableを呼び出してテーブル構造を作成
97
+ create_table_without_auto_random(table_name, **options, &block)
96
98
 
97
- if options[:id] && options[:id][:auto_random]
98
- sql += "id BIGINT AUTO_RANDOM PRIMARY KEY"
99
+ # AUTO_RANDOMを有効にするためにALTER TABLEを実行
100
+ if auto_random_enabled
101
+ execute("ALTER TABLE #{quote_table_name(table_name)} MODIFY COLUMN id BIGINT AUTO_RANDOM PRIMARY KEY")
102
+ end
103
+ else
104
+ create_table_without_auto_random(table_name, **options, &block)
99
105
  end
100
-
101
- sql += ") DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
102
- sql
103
106
  end
104
107
  end
105
108
 
@@ -108,6 +111,11 @@ module Ridgepole
108
111
 
109
112
  def self.extend_activerecord_adapters
110
113
  puts "📦 Extending ActiveRecord adapters..."
114
+ # Hash#assert_valid_keysを拡張してauto_randomキーを許可
115
+ extend_hash_assert_valid_keys
116
+ # TableDefinitionを拡張して:auto_randomオプションをサポート
117
+ extend_table_definition
118
+
111
119
  # MySQL系アダプタにAUTO_RANDOMサポートを追加
112
120
  extend_adapter('ActiveRecord::ConnectionAdapters::Mysql2Adapter')
113
121
  extend_adapter('ActiveRecord::ConnectionAdapters::TrilogyAdapter')
@@ -129,6 +137,11 @@ module Ridgepole
129
137
  return
130
138
  end
131
139
 
140
+ # Hash#assert_valid_keysを拡張してauto_randomキーを許可
141
+ extend_hash_assert_valid_keys
142
+ # TableDefinitionを拡張して:auto_randomオプションをサポート
143
+ extend_table_definition
144
+
132
145
  # 一時的にputsを外して動作確認
133
146
  adapter_class.class_eval do
134
147
  # AUTO_RANDOMカラムの検出
@@ -163,27 +176,21 @@ module Ridgepole
163
176
  # CREATE TABLE時のAUTO_RANDOM対応
164
177
  alias_method :create_table_without_auto_random, :create_table
165
178
  def create_table(table_name, **options, &block)
179
+ # :auto_randomキーを処理する前に、idオプションから取り除く
166
180
  if options.dig(:id, :auto_random) && tidb?
167
- # AUTO_RANDOMを含むテーブル作成
168
- sql = build_create_table_sql_with_auto_random(table_name, **options, &block)
169
- execute(sql)
170
- else
171
- create_table_without_auto_random(table_name, **options, &block)
172
- end
173
- end
174
-
175
- private
181
+ # auto_randomフラグを保存
182
+ auto_random_enabled = options[:id].delete(:auto_random)
176
183
 
177
- def build_create_table_sql_with_auto_random(table_name, **options, &block)
178
- # 簡単な実装 - 実際にはより複雑になる
179
- sql = "CREATE TABLE #{quote_table_name(table_name)} ("
184
+ # 通常のcreate_tableを呼び出してテーブル構造を作成
185
+ create_table_without_auto_random(table_name, **options, &block)
180
186
 
181
- if options[:id] && options[:id][:auto_random]
182
- sql += "id BIGINT AUTO_RANDOM PRIMARY KEY"
187
+ # AUTO_RANDOMを有効にするためにALTER TABLEを実行
188
+ if auto_random_enabled
189
+ execute("ALTER TABLE #{quote_table_name(table_name)} MODIFY COLUMN id BIGINT AUTO_RANDOM PRIMARY KEY")
190
+ end
191
+ else
192
+ create_table_without_auto_random(table_name, **options, &block)
183
193
  end
184
-
185
- sql += ") DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
186
- sql
187
194
  end
188
195
  end
189
196
 
@@ -211,6 +218,49 @@ module Ridgepole
211
218
  rescue NameError
212
219
  # SchemaDumperが利用できない場合はスキップ
213
220
  end
221
+
222
+ def self.extend_table_definition
223
+ return unless defined?(ActiveRecord::ConnectionAdapters::TableDefinition)
224
+
225
+ # TableDefinitionを拡張して:auto_randomオプションをサポート
226
+ ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
227
+ # カラム作成時のオプション検証を拡張
228
+ alias_method :column_without_auto_random, :column
229
+ def column(name, type, **options)
230
+ # :auto_randomオプションが含まれている場合は、それを取り除いて後で処理
231
+ if options.key?(:auto_random)
232
+ auto_random_value = options.delete(:auto_random)
233
+ # カラム定義にauto_randomの情報を保存(後でcreate_tableで使用)
234
+ @auto_random_columns ||= {}
235
+ @auto_random_columns[name.to_s] = auto_random_value
236
+ end
237
+ column_without_auto_random(name, type, **options)
238
+ end
239
+
240
+ # auto_randomカラムの情報を取得するメソッド
241
+ def auto_random_columns
242
+ @auto_random_columns ||= {}
243
+ end
244
+ end
245
+ rescue NameError => e
246
+ puts "⚠️ Could not extend TableDefinition: #{e.message}"
247
+ end
248
+
249
+ def self.extend_hash_assert_valid_keys
250
+ # Hashクラスを拡張して、auto_randomキーを有効なキーとして認識させる
251
+ Hash.class_eval do
252
+ alias_method :assert_valid_keys_without_auto_random, :assert_valid_keys
253
+ def assert_valid_keys(*valid_keys)
254
+ # auto_randomキーが含まれている場合は、それを有効なキーとして追加
255
+ if keys.include?(:auto_random) && !valid_keys.include?(:auto_random)
256
+ valid_keys = valid_keys + [:auto_random]
257
+ end
258
+ assert_valid_keys_without_auto_random(*valid_keys)
259
+ end
260
+ end
261
+ rescue NameError => e
262
+ puts "⚠️ Could not extend Hash#assert_valid_keys: #{e.message}"
263
+ end
214
264
  end
215
265
  end
216
266
  end
@@ -1,4 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'ridgepole/ext/tidb'
4
+
5
+ # Ridgepoleが使用される前に拡張を適用
4
6
  Ridgepole::Ext::Tidb.setup!
7
+
8
+ # ActiveRecordアダプタが利用可能になったときに自動拡張を実行
9
+ if defined?(ActiveRecord::Base)
10
+ Ridgepole::Ext::Tidb.extend_activerecord_adapters
11
+ else
12
+ # ActiveRecordが後でロードされる場合に備えてフックを設定
13
+ ActiveSupport.on_load(:active_record) do
14
+ Ridgepole::Ext::Tidb.extend_activerecord_adapters
15
+ end
16
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridgepole-ext-tidb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ikad