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 +4 -4
- data/lib/ridgepole/ext/tidb/version.rb +1 -1
- data/lib/ridgepole/ext/tidb.rb +85 -35
- data/lib/ridgepole-ext-tidb.rb +12 -0
- 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: b369c3c9f3078db98f28341fe98396425d7f6b995d9bc931b8d48717c2a52335
|
4
|
+
data.tar.gz: 78bf0c2a62ea2c22618bfb38a5477c6fb674531e765cbb6f2d835b0f013bb68c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee91cd5d10bb5d601499587ca3d88ecf5ff04b7eac44cecbccb6eeaed69670fe603c4ac5880958b8d636cc92a9ff09dd1f29ea6c9ebebe3fa817aa13f4cb2134
|
7
|
+
data.tar.gz: f3956f87de294466ca03cf1b34247afbafdbbbaf8cfe6f7d5081bee0cb12cf6c8670ca7098aabc06bc23829ea8d8af41bdbc92b3fd9da2df8f682817fac8af2a
|
data/lib/ridgepole/ext/tidb.rb
CHANGED
@@ -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
|
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
|
-
#
|
84
|
-
|
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
|
-
|
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
|
-
|
98
|
-
|
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
|
-
#
|
168
|
-
|
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
|
-
|
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
|
-
|
182
|
-
|
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
|
data/lib/ridgepole-ext-tidb.rb
CHANGED
@@ -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
|