activerecord_sqlserver_crm 4.2.10 → 4.2.11
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/config/initializers/schema_statements.rb +156 -0
- data/lib/activerecord_sqlserver_crm/version.rb +1 -1
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37cc057428329e3fb1237f1865b2467eb345c1ab
|
4
|
+
data.tar.gz: c8543c1bd36bc079c045864c922267225279538f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41768daa59810f26010bc8841078e4b7f6512e560a10f7aab88dd338dcbb2fca3db33a4d3f1193311749d7fa30d33c73a0bf6819d173dab7875b8faaad48015f
|
7
|
+
data.tar.gz: 19290167d84ba6f6448826a771f77c0990b1e88ec5fbf6c71e353af223262c718af14a0067cab73b2acd027bf1a233adea2e17a9139c9cdf2722a1a293e1d314
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module SchemaStatements
|
5
|
+
|
6
|
+
SCHEMA_EXPIRES_IN = 1.day
|
7
|
+
|
8
|
+
def views_real_column_name(table_name, column_name)
|
9
|
+
view_definition = Rails.cache.fetch("sqlserver_table_view_info_#{table_name}", expires_in: SCHEMA_EXPIRES_IN) do
|
10
|
+
schema_cache.view_information(table_name)[:VIEW_DEFINITION]
|
11
|
+
end
|
12
|
+
return column_name unless view_definition
|
13
|
+
# match_data = view_definition.match(/([\w-]*)\s+as\s+#{column_name}/im)
|
14
|
+
# ret = match_data ? match_data[1] : column_name
|
15
|
+
ret = column_name
|
16
|
+
ret
|
17
|
+
end
|
18
|
+
|
19
|
+
def column_definitions(table_name)
|
20
|
+
col_defn = Rails.cache.fetch("sqlserver_col_defns_#{table_name}", expires_in: SCHEMA_EXPIRES_IN) do
|
21
|
+
identifier = if database_prefix_remote_server?
|
22
|
+
SQLServer::Utils.extract_identifiers("#{database_prefix}#{table_name}")
|
23
|
+
else
|
24
|
+
SQLServer::Utils.extract_identifiers(table_name)
|
25
|
+
end
|
26
|
+
database = identifier.fully_qualified_database_quoted
|
27
|
+
view_exists = schema_cache.view_exists?(table_name)
|
28
|
+
view_tblnm = table_name_or_views_table_name(table_name) if view_exists
|
29
|
+
sql = %{
|
30
|
+
SELECT DISTINCT
|
31
|
+
#{lowercase_schema_reflection_sql('columns.TABLE_NAME')} AS table_name,
|
32
|
+
#{lowercase_schema_reflection_sql('columns.COLUMN_NAME')} AS name,
|
33
|
+
columns.DATA_TYPE AS type,
|
34
|
+
columns.COLUMN_DEFAULT AS default_value,
|
35
|
+
columns.NUMERIC_SCALE AS numeric_scale,
|
36
|
+
columns.NUMERIC_PRECISION AS numeric_precision,
|
37
|
+
columns.DATETIME_PRECISION AS datetime_precision,
|
38
|
+
columns.COLLATION_NAME AS collation,
|
39
|
+
columns.ordinal_position,
|
40
|
+
CASE
|
41
|
+
WHEN columns.DATA_TYPE IN ('nchar','nvarchar','char','varchar') THEN columns.CHARACTER_MAXIMUM_LENGTH
|
42
|
+
ELSE COL_LENGTH('#{database}.'+columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME, columns.COLUMN_NAME)
|
43
|
+
END AS [length],
|
44
|
+
CASE
|
45
|
+
WHEN columns.IS_NULLABLE = 'YES' THEN 1
|
46
|
+
ELSE NULL
|
47
|
+
END AS [is_nullable],
|
48
|
+
CASE
|
49
|
+
WHEN KCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
|
50
|
+
ELSE NULL
|
51
|
+
END AS [is_primary],
|
52
|
+
c.is_identity AS [is_identity]
|
53
|
+
FROM #{database}.INFORMATION_SCHEMA.COLUMNS columns
|
54
|
+
LEFT OUTER JOIN #{database}.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
|
55
|
+
ON TC.TABLE_NAME = columns.TABLE_NAME
|
56
|
+
AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
|
57
|
+
LEFT OUTER JOIN #{database}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
|
58
|
+
ON KCU.COLUMN_NAME = columns.COLUMN_NAME
|
59
|
+
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
|
60
|
+
AND KCU.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG
|
61
|
+
AND KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
|
62
|
+
INNER JOIN #{database}.sys.schemas AS s
|
63
|
+
ON s.name = columns.TABLE_SCHEMA
|
64
|
+
AND s.schema_id = s.schema_id
|
65
|
+
INNER JOIN #{database}.sys.objects AS o
|
66
|
+
ON s.schema_id = o.schema_id
|
67
|
+
AND o.is_ms_shipped = 0
|
68
|
+
AND o.type IN ('U', 'V')
|
69
|
+
AND o.name = columns.TABLE_NAME
|
70
|
+
INNER JOIN #{database}.sys.columns AS c
|
71
|
+
ON o.object_id = c.object_id
|
72
|
+
AND c.name = columns.COLUMN_NAME
|
73
|
+
WHERE columns.TABLE_NAME = @0
|
74
|
+
AND columns.TABLE_SCHEMA = #{identifier.schema.blank? ? 'schema_name()' : '@1'}
|
75
|
+
ORDER BY columns.ordinal_position
|
76
|
+
}.gsub(/[ \t\r\n]+/, ' ')
|
77
|
+
binds = [[info_schema_table_name_column, identifier.object]]
|
78
|
+
binds << [info_schema_table_schema_column, identifier.schema] unless identifier.schema.blank?
|
79
|
+
results = sp_executesql(sql, 'SCHEMA', binds)
|
80
|
+
ret = results.map do |ci|
|
81
|
+
ci = ci.symbolize_keys
|
82
|
+
ci[:_type] = ci[:type]
|
83
|
+
ci[:table_name] = view_tblnm || table_name
|
84
|
+
ci[:type] = case ci[:type]
|
85
|
+
when /^bit|image|text|ntext|datetime$/
|
86
|
+
ci[:type]
|
87
|
+
when /^datetime2|datetimeoffset$/i
|
88
|
+
"#{ci[:type]}(#{ci[:datetime_precision]})"
|
89
|
+
when /^time$/i
|
90
|
+
"#{ci[:type]}(#{ci[:datetime_precision]})"
|
91
|
+
when /^numeric|decimal$/i
|
92
|
+
"#{ci[:type]}(#{ci[:numeric_precision]},#{ci[:numeric_scale]})"
|
93
|
+
when /^float|real$/i
|
94
|
+
"#{ci[:type]}"
|
95
|
+
when /^char|nchar|varchar|nvarchar|binary|varbinary|bigint|int|smallint$/
|
96
|
+
ci[:length].to_i == -1 ? "#{ci[:type]}(max)" : "#{ci[:type]}(#{ci[:length]})"
|
97
|
+
else
|
98
|
+
ci[:type]
|
99
|
+
end
|
100
|
+
ci[:default_value],
|
101
|
+
ci[:default_function] = begin
|
102
|
+
default = ci[:default_value]
|
103
|
+
if default.nil? && view_exists
|
104
|
+
default = column_default(database, view_tblnm, views_real_column_name(table_name, ci[:name]))
|
105
|
+
end
|
106
|
+
case default
|
107
|
+
when nil
|
108
|
+
[nil, nil]
|
109
|
+
when /\A\((\w+\(\))\)\Z/
|
110
|
+
default_function = Regexp.last_match[1]
|
111
|
+
[nil, default_function]
|
112
|
+
when /\A\(N'(.*)'\)\Z/m
|
113
|
+
string_literal = SQLServer::Utils.unquote_string(Regexp.last_match[1])
|
114
|
+
[string_literal, nil]
|
115
|
+
when /CREATE DEFAULT/mi
|
116
|
+
[nil, nil]
|
117
|
+
else
|
118
|
+
type = case ci[:type]
|
119
|
+
when /smallint|int|bigint/ then ci[:_type]
|
120
|
+
else ci[:type]
|
121
|
+
end
|
122
|
+
value = default.match(/\A\((.*)\)\Z/m)[1]
|
123
|
+
value = select_value "SELECT CAST(#{value} AS #{type}) AS value", 'SCHEMA'
|
124
|
+
[value, nil]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
ci[:null] = ci[:is_nullable].to_i == 1
|
128
|
+
ci.delete(:is_nullable)
|
129
|
+
ci[:is_primary] = ci[:is_primary].to_i == 1
|
130
|
+
ci[:is_identity] = ci[:is_identity].to_i == 1 unless [TrueClass, FalseClass].include?(ci[:is_identity].class)
|
131
|
+
ci
|
132
|
+
end
|
133
|
+
ret
|
134
|
+
end
|
135
|
+
col_defn
|
136
|
+
end
|
137
|
+
|
138
|
+
def column_default(database, table_name, col_name)
|
139
|
+
columns = Rails.cache.fetch("sqlserver_def_col_#{database}_#{table_name}", expires_in: SCHEMA_EXPIRES_IN) do
|
140
|
+
result = select "
|
141
|
+
SELECT c.COLUMN_NAME, c.COLUMN_DEFAULT
|
142
|
+
FROM #{database}.INFORMATION_SCHEMA.COLUMNS c
|
143
|
+
WHERE c.TABLE_NAME = '#{table_name}'".squish, 'SCHEMA'
|
144
|
+
default_column_values = {}
|
145
|
+
result.each do |row|
|
146
|
+
default_column_values[row["COLUMN_NAME"]] = row["COLUMN_DEFAULT"]
|
147
|
+
end
|
148
|
+
default_column_values
|
149
|
+
end
|
150
|
+
columns[col_name]
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_sqlserver_crm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rolf Lawrenz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -55,6 +55,9 @@ dependencies:
|
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
57
|
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.0'
|
60
|
+
- - ">="
|
58
61
|
- !ruby/object:Gem::Version
|
59
62
|
version: 1.0.4
|
60
63
|
type: :runtime
|
@@ -62,6 +65,9 @@ dependencies:
|
|
62
65
|
version_requirements: !ruby/object:Gem::Requirement
|
63
66
|
requirements:
|
64
67
|
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
70
|
+
- - ">="
|
65
71
|
- !ruby/object:Gem::Version
|
66
72
|
version: 1.0.4
|
67
73
|
- !ruby/object:Gem::Dependency
|
@@ -69,6 +75,9 @@ dependencies:
|
|
69
75
|
requirement: !ruby/object:Gem::Requirement
|
70
76
|
requirements:
|
71
77
|
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.1'
|
80
|
+
- - ">="
|
72
81
|
- !ruby/object:Gem::Version
|
73
82
|
version: 1.1.0
|
74
83
|
type: :runtime
|
@@ -76,6 +85,9 @@ dependencies:
|
|
76
85
|
version_requirements: !ruby/object:Gem::Requirement
|
77
86
|
requirements:
|
78
87
|
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.1'
|
90
|
+
- - ">="
|
79
91
|
- !ruby/object:Gem::Version
|
80
92
|
version: 1.1.0
|
81
93
|
- !ruby/object:Gem::Dependency
|
@@ -140,6 +152,7 @@ files:
|
|
140
152
|
- app/models/crm/user.rb
|
141
153
|
- config/initializers/01_constants.rb
|
142
154
|
- config/initializers/extensions.rb
|
155
|
+
- config/initializers/schema_statements.rb
|
143
156
|
- config/routes.rb
|
144
157
|
- lib/active_record_extension.rb
|
145
158
|
- lib/activerecord_sqlserver_crm.rb
|