ar_firebird_adapter 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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