dameng-rails 0.1.0 → 0.1.2

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: 31605a94e92ed817c32ec8f0e40382a994e4b0d3dbab66e4ea0deeb9559561bb
4
- data.tar.gz: 0adae4275c6fb981fa04c620ff388bf748db5ea74aa39d5fc17eaee71ff0ac31
3
+ metadata.gz: df58b701f21045bf213bcb68f55f666f438392f5f3dc98f4288f4446cf4ed19c
4
+ data.tar.gz: aca1b8c49c32adec34ef0991b945e50924325d9b53da25da4c75966a52d89cd0
5
5
  SHA512:
6
- metadata.gz: a13c115aaab33f595051b3be0f964900983c8f48c11fd1aedc0d4270d8d95c9f3eba900b21325fe063622087a8462d0603d4cf3e9f6b53000893457a78367a95
7
- data.tar.gz: f20958ce3fbbceed43683e2d4d206f001fa82a5b53f2a4e01d93aea47c2a4d8e3d645f305d21bab0837cc6f8f519787ebfe5e0737b7f93f670811321fa2878f4
6
+ metadata.gz: dcdde8463487934af0b6ca03c593b34e5bc129c440f6e2bf7640b77da63ba18d421f13c9de0bf017fb82dcfdc6322092c1ffe99c5c86d4f12c47757b9a917bc1
7
+ data.tar.gz: 7bf19ae686f0c53a9869e81c764ccad859bbbb479bf8aaded99dca0e568e9bfaa7068f848c69c4f10624e7e44f8fca4a5ed365add652bac8483e9853ed6d4e3f
@@ -9,11 +9,14 @@ module DmRails
9
9
  # 表清单用代理可自答的 SHOW TABLES。
10
10
  module Introspection
11
11
  def column_definitions(table_name)
12
+ tbl = table_name.to_s.downcase
13
+ json_cols = DmRails.json_columns.fetch(tbl, [])
12
14
  sql = "SELECT fld, ctype, is_null, key_kind, def_val, extra_str FROM #{DmRails.view_name} " \
13
- "WHERE tbl = #{quote(table_name.to_s.downcase)} ORDER BY col_order"
15
+ "WHERE tbl = #{quote(tbl)} ORDER BY col_order"
14
16
  execute(sql, "SCHEMA").to_a.map do |row|
15
17
  vals = row.is_a?(Hash) ? row.values : row
16
- { Field: vals[0], Type: vals[1], Collation: "", Null: vals[2],
18
+ ctype = json_cols.include?(vals[0]) ? "json" : vals[1]
19
+ { Field: vals[0], Type: ctype, Collation: "", Null: vals[2],
17
20
  Key: vals[3].to_s, Default: dm_rails_normalize_default(vals[4]), Extra: vals[5].to_s,
18
21
  Privileges: "", Comment: "" }
19
22
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DmRails
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/dm_rails.rb CHANGED
@@ -19,6 +19,18 @@ module DmRails
19
19
  ENV.fetch("DM_RAILS_VIEW", "dm_rails_columns")
20
20
  end
21
21
 
22
+ # MySQL 原生 JSON 类型列(迁达梦后落为 TEXT,需向 AR 上报 json 类型以恢复 Hash 自动序列化)。
23
+ # 通过 ENV["DM_RAILS_JSON_COLUMNS"] 配置,格式:"table.col,table2.col2";
24
+ # 也可在应用初始化时直接赋值 DmRails.json_columns = { "table" => ["col"] }
25
+ attr_writer :json_columns
26
+
27
+ def json_columns
28
+ @json_columns ||= ENV.fetch("DM_RAILS_JSON_COLUMNS", "").split(",").each_with_object({}) do |pair, h|
29
+ tbl, col = pair.strip.split(".", 2)
30
+ (h[tbl] ||= []) << col if tbl && col
31
+ end
32
+ end
33
+
22
34
  # 达梦侧辅助视图的建视图 SQL(用达梦客户端在业务 schema 下执行,勿经代理执行)
23
35
  def view_sql
24
36
  File.read(File.expand_path("../sql/dm_rails_columns.sql", __dir__))
@@ -1,4 +1,5 @@
1
1
  -- dm-rails 辅助视图:为 ActiveRecord 提供 MySQL 风格的列结构信息
2
+ -- 主键用预聚合 LEFT JOIN,勿改回相关子查询(后者在达梦上可慢 3 个数量级)
2
3
  -- 在达梦业务 schema 下用达梦客户端执行(勿经代理执行);视图名可通过 DM_RAILS_VIEW 环境变量对应调整
3
4
  CREATE OR REPLACE VIEW dm_rails_columns AS
4
5
  SELECT LOWER(c.TABLE_NAME) AS tbl,
@@ -22,9 +23,13 @@ SELECT LOWER(c.TABLE_NAME) AS tbl,
22
23
  ELSE 'varchar(255)'
23
24
  END AS ctype,
24
25
  CASE c.NULLABLE WHEN 'Y' THEN 'YES' ELSE 'NO' END AS is_null,
25
- NVL((SELECT 'PRI' FROM USER_CONS_COLUMNS cu JOIN USER_CONSTRAINTS uc ON cu.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
26
- WHERE uc.CONSTRAINT_TYPE = 'P' AND cu.TABLE_NAME = c.TABLE_NAME AND cu.COLUMN_NAME = c.COLUMN_NAME AND ROWNUM <= 1), '') AS key_kind,
26
+ CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRI' ELSE '' END AS key_kind,
27
27
  c.DATA_DEFAULT AS def_val,
28
28
  CASE WHEN LOWER(c.COLUMN_NAME) = 'id' THEN 'auto_increment' ELSE '' END AS extra_str,
29
29
  c.COLUMN_ID AS col_order
30
- FROM USER_TAB_COLUMNS c;
30
+ FROM USER_TAB_COLUMNS c
31
+ LEFT JOIN (SELECT DISTINCT cu.TABLE_NAME, cu.COLUMN_NAME
32
+ FROM USER_CONS_COLUMNS cu
33
+ JOIN USER_CONSTRAINTS uc ON cu.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
34
+ WHERE uc.CONSTRAINT_TYPE = 'P') pk
35
+ ON pk.TABLE_NAME = c.TABLE_NAME AND pk.COLUMN_NAME = c.COLUMN_NAME;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dameng-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - qinyuanmao