ar_firebird_adapter 1.0.3 → 1.0.4

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: d1d31b12f68b28b88b65f3d1dbe9ba2316424758d38f0048db9e6d393325ba48
4
- data.tar.gz: c88dff39a172d01ab3e85544a4d0743c2df121dbe91433bb402043ff00c87cc2
3
+ metadata.gz: af42ea2984ae7dd03414715ca98722150e355b3821777c6dd7c3f2b8f75068ce
4
+ data.tar.gz: f3c313959cdb65c12698c9b2e2914a1cb505ec61c27fc7139b4db79c9bd3a680
5
5
  SHA512:
6
- metadata.gz: 1fe65acaac638e4852c4be5f4bc00d9c86af87d5898af3eb48853ac323a4e81d95a7e05e6742345f45ecb8ec8173665f361c08efcad99809924193f11b18d655
7
- data.tar.gz: a411a7096d1f7337d49da8a1d4b088b3471b55ac8b6b8bd6836daf1ffb186af339e3e707a9dab85e5331225f611215cf4ca9e6fe481ce4e0632ba4e5fed2ff04
6
+ metadata.gz: 78b32a05c9a84554f33a0adca51ca6d8bd12baf83074facfd4ac39473c9b6c3d6bc2af914612151f2d61bc17145d9cdf0865ae953724d15fb434f6946afb4faa
7
+ data.tar.gz: 0d116c295ebf1f8e41df1ee189c3fafd3e977bcf1cf478a5e3c161e1ba4c6b7c0127c1bdab4491675540d2acd1557c914032b9d14d725b2de943d4c2e50491ac
@@ -93,4 +93,7 @@ module ActiveRecord::ConnectionAdapters::ArFirebird::DatabaseStatements
93
93
  @connection.query("SELECT NEXT VALUE FOR #{sequence_name} FROM RDB$DATABASE")[0][0]
94
94
  end
95
95
 
96
+ def remove_column(table_name, column_name, type = nil, options = {})
97
+ execute "ALTER TABLE #{table_name} DROP #{column_name}"
98
+ end
96
99
  end
@@ -29,6 +29,14 @@ module ActiveRecord
29
29
  def quoted_date(value)
30
30
  super.sub(/(\.\d{6})\z/, $1.to_s.first(5))
31
31
  end
32
+
33
+ def quote_column_name(column_name)
34
+ if column_name.is_a?(String) || column_name.is_a?(Symbol)
35
+ "\"#{column_name.upcase}\""
36
+ else
37
+ column_name
38
+ end
39
+ end
32
40
  end
33
41
  end
34
42
  end
@@ -1,163 +1,168 @@
1
- module ActiveRecord::ConnectionAdapters::ArFirebird::SchemaStatements
2
-
3
- def tables(_name = nil)
4
- @connection.table_names
5
- end
6
-
7
- def views
8
- @connection.view_names
9
- end
10
-
11
- def indexes(table_name)
12
- result = query(<<~SQL, "SCHEMA")
13
- SELECT
14
- rdb$index_name,
15
- rdb$unique_flag
16
- FROM
17
- rdb$indices
18
- WHERE
19
- rdb$relation_name = '#{table_name.upcase}';
20
- SQL
21
-
22
- result.map do |row|
23
- index_name = row[0].strip
24
- unique = row[1] == 1
25
- columns = query_values(<<~SQL, "SCHEMA")
26
- SELECT
27
- rdb$field_name
28
- FROM
29
- rdb$index_segments
30
- WHERE
31
- rdb$index_name = '#{index_name}'
32
- ORDER BY
33
- rdb$field_position
34
- SQL
35
-
36
- ActiveRecord::ConnectionAdapters::IndexDefinition.new(
37
- table_name.downcase,
38
- index_name.downcase,
39
- unique,
40
- columns.map(&:strip).map(&:downcase),
41
- )
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module ArFirebird
4
+ module SchemaStatements
5
+
6
+ def tables(_name = nil)
7
+ @connection.table_names
8
+ end
9
+
10
+ def views
11
+ @connection.view_names
12
+ end
13
+
14
+ def indexes(table_name)
15
+ result = query(<<~SQL, "SCHEMA")
16
+ SELECT
17
+ rdb$index_name,
18
+ rdb$unique_flag
19
+ FROM
20
+ rdb$indices
21
+ WHERE
22
+ rdb$relation_name = '#{table_name.upcase}';
23
+ SQL
24
+
25
+ result.map do |row|
26
+ index_name = row[0].strip
27
+ unique = row[1] == 1
28
+ columns = query_values(<<~SQL, "SCHEMA")
29
+ SELECT
30
+ rdb$field_name
31
+ FROM
32
+ rdb$index_segments
33
+ WHERE
34
+ rdb$index_name = '#{index_name}'
35
+ ORDER BY
36
+ rdb$field_position
37
+ SQL
38
+
39
+ ActiveRecord::ConnectionAdapters::IndexDefinition.new(
40
+ table_name.downcase,
41
+ index_name.downcase,
42
+ unique,
43
+ columns.map(&:strip).map(&:downcase),
44
+ )
45
+ end
46
+ end
47
+
48
+ def remove_index(table_name, options = {})
49
+ index_name = index_name_for_remove(table_name, options)
50
+ execute "DROP INDEX #{quote_column_name(index_name)}"
51
+ end
52
+
53
+ def foreign_keys(table_name)
54
+ result = query(<<~SQL, "SCHEMA")
55
+ WITH FK_FIELDS AS (
56
+ SELECT
57
+ AA2.RDB$RELATION_NAME,
58
+ AA2.RDB$CONSTRAINT_NAME,
59
+ BB2.RDB$CONST_NAME_UQ AS LINK_UK_OR_PK,
60
+ EE2.RDB$RELATION_NAME AS REFERENCE_TABLE,
61
+ CC2.RDB$FIELD_NAME,
62
+ AA2.RDB$CONSTRAINT_TYPE
63
+ FROM
64
+ RDB$RELATION_CONSTRAINTS AA2
65
+ LEFT JOIN RDB$REF_CONSTRAINTS BB2 ON BB2.RDB$CONSTRAINT_NAME = AA2.RDB$CONSTRAINT_NAME
66
+ LEFT JOIN RDB$INDEX_SEGMENTS CC2 ON CC2.RDB$INDEX_NAME = AA2.RDB$INDEX_NAME
67
+ LEFT JOIN RDB$RELATION_FIELDS DD2 ON DD2.RDB$FIELD_NAME = CC2.RDB$FIELD_NAME AND DD2.RDB$RELATION_NAME = AA2.RDB$RELATION_NAME
68
+ LEFT JOIN RDB$RELATION_CONSTRAINTS EE2 ON EE2.RDB$CONSTRAINT_NAME = BB2.RDB$CONST_NAME_UQ
69
+ )
70
+ SELECT
71
+ AA.RDB$CONSTRAINT_NAME,
72
+ BB.REFERENCE_TABLE,
73
+ BB.FIELDS,
74
+ BB.REFERENCE_FIELDS
75
+ FROM
76
+ RDB$RELATION_CONSTRAINTS AA
77
+ LEFT JOIN (
78
+ SELECT
79
+ AA1.RDB$RELATION_NAME,
80
+ AA1.RDB$CONSTRAINT_NAME,
81
+ AA1.LINK_UK_OR_PK,
82
+ AA1.REFERENCE_TABLE,
83
+ (
84
+ SELECT LIST(TRIM(AA3.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA3 WHERE AA3.RDB$CONSTRAINT_NAME = AA1.RDB$CONSTRAINT_NAME ROWS 1
85
+ ) AS FIELDS,
86
+ (
87
+ SELECT LIST(TRIM(AA4.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA4 WHERE AA4.RDB$CONSTRAINT_NAME = AA1.LINK_UK_OR_PK ROWS 1
88
+ ) AS REFERENCE_FIELDS
89
+ FROM
90
+ FK_FIELDS AA1
91
+ GROUP BY
92
+ AA1.RDB$RELATION_NAME,
93
+ AA1.RDB$CONSTRAINT_NAME,
94
+ AA1.REFERENCE_TABLE,
95
+ AA1.LINK_UK_OR_PK
96
+ ) BB ON BB.RDB$RELATION_NAME = AA.RDB$RELATION_NAME AND BB.RDB$CONSTRAINT_NAME = AA.RDB$CONSTRAINT_NAME
97
+ WHERE
98
+ AA.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
99
+ AND AA.RDB$RELATION_NAME = '#{table_name.upcase}';
100
+ SQL
101
+
102
+ result.map do |row|
103
+ options = {
104
+ column: row[2].downcase,
105
+ name: row[0].strip.downcase,
106
+ primary_key: row[3].downcase
107
+ }
108
+
109
+ ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row[1].strip.downcase, options)
110
+ end
111
+ end
112
+
113
+ def change_column(table_name, column_name, type, options = {}) #:nodoc:
114
+ clear_cache!
115
+ type = type_to_sql(type)
116
+ column = column_definitions(table_name.to_sym).find {|column| column["name"] == column_name.to_s }
117
+ if options[:limit]
118
+ type = "#{type.gsub(/\(.*\)/,'')}(#{options[:limit]})"
119
+ end
120
+
121
+ sql = []
122
+ if type != column["sql_type"]
123
+ sql << "ALTER COLUMN #{column["name"]} TYPE #{type}"
124
+ end
125
+ execute "ALTER TABLE #{table_name} #{sql.join(', ')}" if sql.any?
126
+ end
127
+
128
+ private
129
+
130
+ def column_definitions(table_name)
131
+ @connection.columns(table_name)
132
+ end
133
+
134
+ def new_column_from_field(table_name, field)
135
+ type_metadata = fetch_type_metadata(field["sql_type"], field)
136
+ ActiveRecord::ConnectionAdapters::ArFirebird::FbColumn.new(
137
+ field["name"],
138
+ field["default"],
139
+ type_metadata,
140
+ field["nullable"],
141
+ table_name,
142
+ nil,
143
+ nil,
144
+ nil,
145
+ field
146
+ )
147
+ end
148
+
149
+ def fetch_type_metadata(sql_type, field = "")
150
+ if field['domain'] == ActiveRecord::ConnectionAdapters::ArFirebirdAdapter.boolean_domain[:name]
151
+ cast_type = lookup_cast_type("boolean")
152
+ else
153
+ cast_type = lookup_cast_type(sql_type)
154
+ end
155
+ ActiveRecord::ConnectionAdapters::ArFirebird::SqlTypeMetadata.new(
156
+ sql_type: sql_type,
157
+ type: cast_type.type,
158
+ precision: cast_type.precision,
159
+ scale: cast_type.scale,
160
+ limit: cast_type.limit,
161
+ field: field
162
+ )
163
+ end
164
+
165
+ end
42
166
  end
43
167
  end
44
-
45
- def remove_index(table_name, options = {})
46
- index_name = index_name_for_remove(table_name, options)
47
- execute "DROP INDEX #{quote_column_name(index_name)}"
48
- end
49
-
50
- def foreign_keys(table_name)
51
- result = query(<<~SQL, "SCHEMA")
52
- WITH FK_FIELDS AS (
53
- SELECT
54
- AA2.RDB$RELATION_NAME,
55
- AA2.RDB$CONSTRAINT_NAME,
56
- BB2.RDB$CONST_NAME_UQ AS LINK_UK_OR_PK,
57
- EE2.RDB$RELATION_NAME AS REFERENCE_TABLE,
58
- CC2.RDB$FIELD_NAME,
59
- AA2.RDB$CONSTRAINT_TYPE
60
- FROM
61
- RDB$RELATION_CONSTRAINTS AA2
62
- LEFT JOIN RDB$REF_CONSTRAINTS BB2 ON BB2.RDB$CONSTRAINT_NAME = AA2.RDB$CONSTRAINT_NAME
63
- LEFT JOIN RDB$INDEX_SEGMENTS CC2 ON CC2.RDB$INDEX_NAME = AA2.RDB$INDEX_NAME
64
- LEFT JOIN RDB$RELATION_FIELDS DD2 ON DD2.RDB$FIELD_NAME = CC2.RDB$FIELD_NAME AND DD2.RDB$RELATION_NAME = AA2.RDB$RELATION_NAME
65
- LEFT JOIN RDB$RELATION_CONSTRAINTS EE2 ON EE2.RDB$CONSTRAINT_NAME = BB2.RDB$CONST_NAME_UQ
66
- )
67
- SELECT
68
- AA.RDB$CONSTRAINT_NAME,
69
- BB.REFERENCE_TABLE,
70
- BB.FIELDS,
71
- BB.REFERENCE_FIELDS
72
- FROM
73
- RDB$RELATION_CONSTRAINTS AA
74
- LEFT JOIN (
75
- SELECT
76
- AA1.RDB$RELATION_NAME,
77
- AA1.RDB$CONSTRAINT_NAME,
78
- AA1.LINK_UK_OR_PK,
79
- AA1.REFERENCE_TABLE,
80
- (
81
- SELECT LIST(TRIM(AA3.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA3 WHERE AA3.RDB$CONSTRAINT_NAME = AA1.RDB$CONSTRAINT_NAME ROWS 1
82
- ) AS FIELDS,
83
- (
84
- SELECT LIST(TRIM(AA4.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA4 WHERE AA4.RDB$CONSTRAINT_NAME = AA1.LINK_UK_OR_PK ROWS 1
85
- ) AS REFERENCE_FIELDS
86
- FROM
87
- FK_FIELDS AA1
88
- GROUP BY
89
- AA1.RDB$RELATION_NAME,
90
- AA1.RDB$CONSTRAINT_NAME,
91
- AA1.REFERENCE_TABLE,
92
- AA1.LINK_UK_OR_PK
93
- ) BB ON BB.RDB$RELATION_NAME = AA.RDB$RELATION_NAME AND BB.RDB$CONSTRAINT_NAME = AA.RDB$CONSTRAINT_NAME
94
- WHERE
95
- AA.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
96
- AND AA.RDB$RELATION_NAME = '#{table_name.upcase}';
97
- SQL
98
-
99
- result.map do |row|
100
- options = {
101
- column: row[2].downcase,
102
- name: row[0].strip.downcase,
103
- primary_key: row[3].downcase
104
- }
105
-
106
- ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row[1].strip.downcase, options)
107
- end
108
- end
109
-
110
- def change_column(table_name, column_name, type, options = {}) #:nodoc:
111
- clear_cache!
112
- type = type_to_sql(type)
113
- column = column_definitions(table_name.to_sym).find {|column| column["name"] == column_name.to_s }
114
- if options[:limit]
115
- type = "#{type.gsub(/\(.*\)/,'')}(#{options[:limit]})"
116
- end
117
-
118
- sql = []
119
- if type != column["sql_type"]
120
- sql << "ALTER COLUMN #{column["name"]} TYPE #{type}"
121
- end
122
- execute "ALTER TABLE #{table_name} #{sql.join(', ')}" if sql.any?
123
- end
124
-
125
- private
126
-
127
- def column_definitions(table_name)
128
- @connection.columns(table_name)
129
- end
130
-
131
- def new_column_from_field(table_name, field)
132
- type_metadata = fetch_type_metadata(field["sql_type"], field)
133
- ActiveRecord::ConnectionAdapters::ArFirebird::FbColumn.new(
134
- field["name"],
135
- field["default"],
136
- type_metadata,
137
- field["nullable"],
138
- table_name,
139
- nil,
140
- nil,
141
- nil,
142
- field
143
- )
144
- end
145
-
146
- def fetch_type_metadata(sql_type, field = "")
147
- if field['domain'] == ActiveRecord::ConnectionAdapters::ArFirebirdAdapter.boolean_domain[:name]
148
- cast_type = lookup_cast_type("boolean")
149
- else
150
- cast_type = lookup_cast_type(sql_type)
151
- end
152
- ActiveRecord::ConnectionAdapters::ArFirebird::SqlTypeMetadata.new(
153
- sql_type: sql_type,
154
- type: cast_type.type,
155
- precision: cast_type.precision,
156
- scale: cast_type.scale,
157
- limit: cast_type.limit,
158
- field: field
159
- )
160
- end
161
-
162
-
163
168
  end
@@ -18,7 +18,7 @@ class Arel::Visitors::ArFirebird < Arel::Visitors::ToSql
18
18
  collector << ' ORDER BY '
19
19
  o.orders.each_with_index do |x, i|
20
20
  collector << ', ' unless i == 0
21
- collector = visit(x, collector)
21
+ collector = visit(quote_column_name(x), collector)
22
22
  end
23
23
  end
24
24
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_firebird_adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fábio Rodrigues
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-01-29 00:00:00.000000000 Z
12
+ date: 2020-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fb