activerecord-jdbc-adapter 1.3.17 → 1.3.18
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/.travis.yml +24 -5
- data/History.md +54 -0
- data/lib/arel/visitors/compat.rb +30 -2
- data/lib/arel/visitors/db2.rb +118 -29
- data/lib/arel/visitors/derby.rb +84 -29
- data/lib/arel/visitors/firebird.rb +66 -9
- data/lib/arel/visitors/h2.rb +16 -0
- data/lib/arel/visitors/hsqldb.rb +6 -3
- data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
- data/lib/arel/visitors/sql_server.rb +121 -40
- data/lib/arel/visitors/sql_server/ng42.rb +293 -0
- data/lib/arjdbc.rb +1 -7
- data/lib/arjdbc/db2.rb +1 -0
- data/lib/arjdbc/db2/adapter.rb +118 -18
- data/lib/arjdbc/derby/adapter.rb +29 -8
- data/lib/arjdbc/firebird.rb +1 -0
- data/lib/arjdbc/firebird/adapter.rb +126 -11
- data/lib/arjdbc/hsqldb/adapter.rb +3 -0
- data/lib/arjdbc/informix.rb +1 -0
- data/lib/arjdbc/jdbc.rb +17 -0
- data/lib/arjdbc/jdbc/adapter.rb +28 -3
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/column.rb +7 -3
- data/lib/arjdbc/jdbc/type_cast.rb +2 -0
- data/lib/arjdbc/jdbc/type_converter.rb +28 -15
- data/lib/arjdbc/mimer.rb +1 -0
- data/lib/arjdbc/mssql.rb +2 -1
- data/lib/arjdbc/mssql/adapter.rb +105 -30
- data/lib/arjdbc/mssql/column.rb +30 -7
- data/lib/arjdbc/mssql/limit_helpers.rb +22 -9
- data/lib/arjdbc/mssql/types.rb +343 -0
- data/lib/arjdbc/mssql/utils.rb +25 -2
- data/lib/arjdbc/mysql/adapter.rb +22 -21
- data/lib/arjdbc/oracle.rb +1 -0
- data/lib/arjdbc/oracle/adapter.rb +291 -19
- data/lib/arjdbc/oracle/column.rb +9 -5
- data/lib/arjdbc/oracle/connection_methods.rb +4 -1
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +21 -0
- data/lib/arjdbc/postgresql/adapter.rb +7 -1
- data/lib/arjdbc/postgresql/oid/bytea.rb +3 -0
- data/lib/arjdbc/postgresql/oid_types.rb +2 -1
- data/lib/arjdbc/tasks/database_tasks.rb +3 -0
- data/lib/arjdbc/util/quoted_cache.rb +2 -2
- data/lib/arjdbc/util/serialized_attributes.rb +11 -0
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +1 -1
- data/rakelib/db.rake +3 -1
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +190 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +259 -61
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +13 -2
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +192 -15
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +10 -2
- metadata +9 -4
data/lib/arjdbc.rb
CHANGED
@@ -16,10 +16,4 @@ else
|
|
16
16
|
warn "activerecord-jdbc-adapter is for use with JRuby only"
|
17
17
|
end
|
18
18
|
|
19
|
-
require 'arjdbc/version'
|
20
|
-
|
21
|
-
# TODO: remove this "HINT" once AR 4.2 is working ~ fairly reliable :
|
22
|
-
if ActiveRecord::VERSION::STRING[0, 3] == '4.2' && ENV['AR_JDBC_42'] != 'true'
|
23
|
-
ArJdbc.warn "NOTE: ActiveRecord 4.2 is not (yet) fully supported by AR-JDBC," <<
|
24
|
-
" please help us finish 4.2 support - check http://bit.ly/jruby-42 for starters"
|
25
|
-
end
|
19
|
+
require 'arjdbc/version'
|
data/lib/arjdbc/db2.rb
CHANGED
data/lib/arjdbc/db2/adapter.rb
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
# NOTE: file contains code adapted from **ruby-ibmdb** adapter, license follows
|
2
|
+
=begin
|
3
|
+
Copyright (c) 2006 - 2015 IBM Corporation
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
=end
|
24
|
+
|
1
25
|
ArJdbc.load_java_part :DB2
|
2
26
|
|
3
27
|
require 'arjdbc/db2/column'
|
@@ -111,6 +135,78 @@ module ArJdbc
|
|
111
135
|
#:graphic => { :name => "graphic", :limit => 1 }, # :limit => 127
|
112
136
|
}
|
113
137
|
|
138
|
+
# @override
|
139
|
+
def initialize_type_map(m)
|
140
|
+
register_class_with_limit m, %r(boolean)i, ActiveRecord::Type::Boolean
|
141
|
+
register_class_with_limit m, %r(char)i, ActiveRecord::Type::String
|
142
|
+
register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary
|
143
|
+
register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text
|
144
|
+
register_class_with_limit m, %r(date)i, ActiveRecord::Type::Date
|
145
|
+
register_class_with_limit m, %r(time)i, ActiveRecord::Type::Time
|
146
|
+
register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime
|
147
|
+
register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float
|
148
|
+
register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer
|
149
|
+
|
150
|
+
m.alias_type %r(blob)i, 'binary'
|
151
|
+
m.alias_type %r(clob)i, 'text'
|
152
|
+
m.alias_type %r(timestamp)i, 'datetime'
|
153
|
+
m.alias_type %r(numeric)i, 'decimal'
|
154
|
+
m.alias_type %r(number)i, 'decimal'
|
155
|
+
m.alias_type %r(double)i, 'float'
|
156
|
+
m.alias_type %r(real)i, 'float'
|
157
|
+
|
158
|
+
m.register_type(%r(decimal)i) do |sql_type|
|
159
|
+
scale = extract_scale(sql_type)
|
160
|
+
precision = extract_precision(sql_type)
|
161
|
+
limit = extract_limit(sql_type)
|
162
|
+
if scale == 0
|
163
|
+
ActiveRecord::Type::BigInteger.new(:precision => precision, :limit => limit)
|
164
|
+
else
|
165
|
+
ActiveRecord::Type::Decimal.new(:precision => precision, :scale => scale)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
m.alias_type %r(for bit data)i, 'binary'
|
170
|
+
m.alias_type %r(smallint)i, 'boolean'
|
171
|
+
m.alias_type %r(serial)i, 'int'
|
172
|
+
m.alias_type %r(decfloat)i, 'decimal'
|
173
|
+
#m.alias_type %r(real)i, 'decimal'
|
174
|
+
m.alias_type %r(graphic)i, 'binary'
|
175
|
+
m.alias_type %r(rowid)i, 'int'
|
176
|
+
|
177
|
+
m.register_type(%r(smallint)i) do
|
178
|
+
if DB2.emulate_booleans?
|
179
|
+
ActiveRecord::Type::Boolean.new
|
180
|
+
else
|
181
|
+
ActiveRecord::Type::Integer.new(:limit => 1)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
m.register_type %r(xml)i, XmlType.new
|
186
|
+
end if AR42
|
187
|
+
|
188
|
+
# @private
|
189
|
+
class XmlType < ActiveRecord::Type::String
|
190
|
+
def type; :xml end
|
191
|
+
|
192
|
+
def type_cast_for_database(value)
|
193
|
+
return unless value
|
194
|
+
Data.new(super)
|
195
|
+
end
|
196
|
+
|
197
|
+
class Data
|
198
|
+
def initialize(value)
|
199
|
+
@value = value
|
200
|
+
end
|
201
|
+
def to_s; @value end
|
202
|
+
end
|
203
|
+
end if AR42
|
204
|
+
|
205
|
+
# @override
|
206
|
+
def reset_column_information
|
207
|
+
initialize_type_map(type_map)
|
208
|
+
end if AR42
|
209
|
+
|
114
210
|
# @override
|
115
211
|
def native_database_types
|
116
212
|
# NOTE: currently merging with what JDBC gives us since there's a lot
|
@@ -389,31 +485,35 @@ module ArJdbc
|
|
389
485
|
# @note Only used with (non-AREL) ActiveRecord **2.3**.
|
390
486
|
# @see Arel::Visitors::DB2
|
391
487
|
def add_limit_offset!(sql, options)
|
392
|
-
|
488
|
+
limit = options[:limit]
|
489
|
+
replace_limit_offset!(sql, limit, options[:offset]) if limit
|
393
490
|
end if ::ActiveRecord::VERSION::MAJOR < 3
|
394
491
|
|
395
492
|
# @private shared with {Arel::Visitors::DB2}
|
396
|
-
def replace_limit_offset!(sql, limit, offset)
|
397
|
-
return sql unless limit
|
398
|
-
|
493
|
+
def replace_limit_offset!(sql, limit, offset, orders = nil)
|
399
494
|
limit = limit.to_i
|
400
|
-
|
401
|
-
|
495
|
+
|
496
|
+
if offset # && limit
|
497
|
+
over_order_by = nil # NOTE: orders matching got reverted as it was not complete and there were no case covering it ...
|
498
|
+
|
499
|
+
start_sql = "SELECT B.* FROM (SELECT A.*, row_number() OVER (#{over_order_by}) AS internal$rownum FROM (SELECT"
|
500
|
+
end_sql = ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset.to_i}"
|
501
|
+
|
502
|
+
if sql.is_a?(String)
|
503
|
+
sql.sub!(/SELECT/i, start_sql)
|
504
|
+
sql << end_sql
|
505
|
+
else # AR 4.2 sql.class ... Arel::Collectors::Bind
|
506
|
+
sql.parts[0] = start_sql # sql.sub! /SELECT/i
|
507
|
+
sql.parts[ sql.parts.length ] = end_sql
|
508
|
+
end
|
402
509
|
else
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
510
|
+
limit_sql = limit == 1 ? " FETCH FIRST ROW ONLY" : " FETCH FIRST #{limit} ROWS ONLY"
|
511
|
+
if sql.is_a?(String)
|
512
|
+
sql << limit_sql
|
513
|
+
else # AR 4.2 sql.class ... Arel::Collectors::Bind
|
514
|
+
sql.parts[ sql.parts.length ] = limit_sql
|
407
515
|
end
|
408
|
-
sql
|
409
516
|
end
|
410
|
-
end
|
411
|
-
|
412
|
-
# @private used from {Arel::Visitors::DB2}
|
413
|
-
def replace_limit_offset_with_ordering!(sql, limit, offset, orders = nil)
|
414
|
-
over_order_by = nil # NOTE: orders matching got reverted as it was not complete and there were no case covering it ...
|
415
|
-
sql.sub!(/SELECT/i, "SELECT B.* FROM (SELECT A.*, row_number() OVER (#{over_order_by}) AS internal$rownum FROM (SELECT")
|
416
|
-
sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
|
417
517
|
sql
|
418
518
|
end
|
419
519
|
|
data/lib/arjdbc/derby/adapter.rb
CHANGED
@@ -138,16 +138,16 @@ module ArJdbc
|
|
138
138
|
:primary_key => "int GENERATED BY DEFAULT AS identity NOT NULL PRIMARY KEY",
|
139
139
|
:string => { :name => "varchar", :limit => 255 }, # 32672
|
140
140
|
:text => { :name => "clob" }, # 2,147,483,647
|
141
|
-
:char => { :name => "char", :limit => 254 }, # JDBC limit
|
141
|
+
:char => { :name => "char", :limit => 254 }, # JDBC :limit => 254
|
142
142
|
:binary => { :name => "blob" }, # 2,147,483,647
|
143
143
|
:float => { :name => "float", :limit => 8 }, # DOUBLE PRECISION
|
144
|
-
:real => { :name => "real", :limit => 4 }, # JDBC limit
|
145
|
-
:double => { :name => "double", :limit => 8 }, # JDBC limit
|
146
|
-
:decimal => { :name => "decimal", :precision => 5, :scale => 0 }, # JDBC limit
|
147
|
-
:numeric => { :name => "decimal", :precision => 5, :scale => 0 }, # JDBC limit
|
148
|
-
:integer => { :name => "integer", :limit => 4 }, # JDBC limit
|
149
|
-
:smallint => { :name => "smallint", :limit => 2 }, # JDBC limit
|
150
|
-
:bigint => { :name => "bigint", :limit => 8 }, # JDBC limit
|
144
|
+
:real => { :name => "real", :limit => 4 }, # JDBC :limit => 23
|
145
|
+
:double => { :name => "double", :limit => 8 }, # JDBC :limit => 52
|
146
|
+
:decimal => { :name => "decimal", :precision => 5, :scale => 0 }, # JDBC :limit => 31
|
147
|
+
:numeric => { :name => "decimal", :precision => 5, :scale => 0 }, # JDBC :limit => 31
|
148
|
+
:integer => { :name => "integer", :limit => 4 }, # JDBC :limit => 10
|
149
|
+
:smallint => { :name => "smallint", :limit => 2 }, # JDBC :limit => 5
|
150
|
+
:bigint => { :name => "bigint", :limit => 8 }, # JDBC :limit => 19
|
151
151
|
:date => { :name => "date" },
|
152
152
|
:time => { :name => "time" },
|
153
153
|
:datetime => { :name => "timestamp" },
|
@@ -157,6 +157,23 @@ module ArJdbc
|
|
157
157
|
:object => { :name => "object" },
|
158
158
|
}
|
159
159
|
|
160
|
+
# @private
|
161
|
+
def initialize_type_map(m)
|
162
|
+
super
|
163
|
+
m.register_type(%r(smallint)i) do |sql_type|
|
164
|
+
if Derby.emulate_booleans?
|
165
|
+
ActiveRecord::Type::Boolean.new
|
166
|
+
else
|
167
|
+
ActiveRecord::Type::Integer.new(:limit => 1)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
m.alias_type %r(real)i, 'float'
|
171
|
+
end if AR42
|
172
|
+
|
173
|
+
def reset_column_information
|
174
|
+
initialize_type_map(type_map)
|
175
|
+
end if AR42
|
176
|
+
|
160
177
|
# @override
|
161
178
|
def native_database_types
|
162
179
|
NATIVE_DATABASE_TYPES
|
@@ -171,6 +188,7 @@ module ArJdbc
|
|
171
188
|
|
172
189
|
# @override
|
173
190
|
def quote(value, column = nil)
|
191
|
+
return super if column && ArJdbc::AR42 && column.cast_type.is_a?(ActiveRecord::Type::Serialized)
|
174
192
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
175
193
|
return value if sql_literal?(value)
|
176
194
|
return 'NULL' if value.nil?
|
@@ -415,6 +433,9 @@ module ArJdbc
|
|
415
433
|
@connection.tables(nil, current_schema)
|
416
434
|
end
|
417
435
|
|
436
|
+
# @override
|
437
|
+
def supports_foreign_keys?; true end
|
438
|
+
|
418
439
|
def truncate(table_name, name = nil)
|
419
440
|
execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
|
420
441
|
end
|
data/lib/arjdbc/firebird.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
ArJdbc.load_java_part :Firebird
|
2
|
+
|
1
3
|
module ArJdbc
|
2
4
|
module Firebird
|
3
5
|
|
@@ -15,6 +17,11 @@ module ArJdbc
|
|
15
17
|
Util::SerializedAttributes.setup /blob/i
|
16
18
|
end
|
17
19
|
|
20
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
21
|
+
def self.jdbc_connection_class
|
22
|
+
::ActiveRecord::ConnectionAdapters::FirebirdJdbcConnection
|
23
|
+
end
|
24
|
+
|
18
25
|
# @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
|
19
26
|
def self.column_selector
|
20
27
|
[ /firebird/i, lambda { |cfg, column| column.extend(Column) } ]
|
@@ -52,6 +59,9 @@ module ArJdbc
|
|
52
59
|
|
53
60
|
end
|
54
61
|
|
62
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
|
63
|
+
def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::FirebirdColumn end
|
64
|
+
|
55
65
|
# @see ArJdbc::ArelHelper::ClassMethods#arel_visitor_type
|
56
66
|
def self.arel_visitor_type(config = nil)
|
57
67
|
require 'arel/visitors/firebird'; ::Arel::Visitors::Firebird
|
@@ -120,6 +130,68 @@ module ArJdbc
|
|
120
130
|
NATIVE_DATABASE_TYPES
|
121
131
|
end
|
122
132
|
|
133
|
+
def initialize_type_map(m)
|
134
|
+
register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary
|
135
|
+
register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text
|
136
|
+
|
137
|
+
register_class_with_limit m, %r(date(?:\(.*?\))?$)i, DateType
|
138
|
+
register_class_with_limit m, %r(time(?:\(.*?\))?$)i, ActiveRecord::Type::Time
|
139
|
+
|
140
|
+
register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float
|
141
|
+
register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer
|
142
|
+
|
143
|
+
m.alias_type %r(blob)i, 'binary'
|
144
|
+
m.alias_type %r(clob)i, 'text'
|
145
|
+
m.alias_type %r(double)i, 'float'
|
146
|
+
|
147
|
+
m.register_type(%r(decimal)i) do |sql_type|
|
148
|
+
scale = extract_scale(sql_type)
|
149
|
+
precision = extract_precision(sql_type)
|
150
|
+
if scale == 0
|
151
|
+
ActiveRecord::Type::Integer.new(precision: precision)
|
152
|
+
else
|
153
|
+
ActiveRecord::Type::Decimal.new(precision: precision, scale: scale)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
m.alias_type %r(numeric)i, 'decimal'
|
157
|
+
|
158
|
+
register_class_with_limit m, %r(varchar)i, ActiveRecord::Type::String
|
159
|
+
|
160
|
+
m.register_type(%r(^char)i) do |sql_type|
|
161
|
+
precision = extract_precision(sql_type)
|
162
|
+
if Firebird.emulate_booleans? && precision == 1
|
163
|
+
ActiveRecord::Type::Boolean.new
|
164
|
+
else
|
165
|
+
ActiveRecord::Type::String.new(:precision => precision)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime
|
170
|
+
register_class_with_limit m, %r(timestamp)i, TimestampType
|
171
|
+
end if AR42
|
172
|
+
|
173
|
+
def clear_cache!
|
174
|
+
super
|
175
|
+
reload_type_map
|
176
|
+
end if AR42
|
177
|
+
|
178
|
+
# @private
|
179
|
+
class DateType < ActiveRecord::Type::Date
|
180
|
+
# NOTE: quote still gets called ...
|
181
|
+
#def type_cast_for_database(value)
|
182
|
+
# if value.acts_like?(:date)
|
183
|
+
# "'#{value.strftime("%Y-%m-%d")}'"
|
184
|
+
# else
|
185
|
+
# super
|
186
|
+
# end
|
187
|
+
#end
|
188
|
+
end if AR42
|
189
|
+
|
190
|
+
# @private
|
191
|
+
class TimestampType < ActiveRecord::Type::DateTime
|
192
|
+
def type; :timestamp end
|
193
|
+
end if AR42
|
194
|
+
|
123
195
|
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
124
196
|
case type
|
125
197
|
when :integer
|
@@ -176,21 +248,31 @@ module ArJdbc
|
|
176
248
|
end
|
177
249
|
|
178
250
|
def add_limit_offset!(sql, options)
|
179
|
-
if options[:limit]
|
180
|
-
|
181
|
-
limit_string << " SKIP #{options[:offset]}" if options[:offset]
|
182
|
-
sql.sub!(/\A(\s*SELECT\s)/i, '\&' + limit_string + ' ')
|
251
|
+
if limit = options[:limit]
|
252
|
+
insert_limit_offset!(sql, limit, options[:offset])
|
183
253
|
end
|
184
254
|
end
|
185
255
|
|
256
|
+
# @private
|
257
|
+
SELECT_RE = /\A(\s*SELECT\s)/i
|
258
|
+
|
259
|
+
def insert_limit_offset!(sql, limit, offset)
|
260
|
+
lim_off = ''
|
261
|
+
lim_off << "FIRST #{limit}" if limit
|
262
|
+
lim_off << " SKIP #{offset}" if offset
|
263
|
+
lim_off.strip!
|
264
|
+
|
265
|
+
sql.sub!(SELECT_RE, "\\&#{lim_off} ") unless lim_off.empty?
|
266
|
+
end
|
267
|
+
|
186
268
|
# Should primary key values be selected from their corresponding
|
187
269
|
# sequence before the insert statement?
|
188
270
|
# @see #next_sequence_value
|
189
271
|
# @override
|
190
272
|
def prefetch_primary_key?(table_name = nil)
|
191
273
|
return true if table_name.nil?
|
192
|
-
table_name
|
193
|
-
columns(table_name).count { |column| column.primary } == 1
|
274
|
+
primary_keys(table_name.to_s).size == 1
|
275
|
+
# columns(table_name).count { |column| column.primary } == 1
|
194
276
|
end
|
195
277
|
|
196
278
|
IDENTIFIER_LENGTH = 31 # usual DB meta-identifier: 31 chars maximum
|
@@ -201,8 +283,8 @@ module ArJdbc
|
|
201
283
|
def column_name_length; IDENTIFIER_LENGTH; end
|
202
284
|
|
203
285
|
def default_sequence_name(table_name, column = nil)
|
204
|
-
|
205
|
-
|
286
|
+
len = IDENTIFIER_LENGTH - 4
|
287
|
+
table_name.to_s.gsub (/(^|\.)([\w$-]{1,#{len}})([\w$-]*)$/), '\1\2_seq'
|
206
288
|
end
|
207
289
|
|
208
290
|
# Set the sequence to the max value of the table's column.
|
@@ -217,17 +299,18 @@ module ArJdbc
|
|
217
299
|
|
218
300
|
def create_table(name, options = {})
|
219
301
|
super(name, options)
|
220
|
-
execute "CREATE GENERATOR #{name}
|
302
|
+
execute "CREATE GENERATOR #{default_sequence_name(name)}"
|
221
303
|
end
|
222
304
|
|
223
305
|
def rename_table(name, new_name)
|
224
306
|
execute "RENAME #{name} TO #{new_name}"
|
225
|
-
|
307
|
+
name_seq, new_name_seq = default_sequence_name(name), default_sequence_name(new_name)
|
308
|
+
execute_quietly "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name_seq}' WHERE RDB$GENERATOR_NAME='#{name_seq}'"
|
226
309
|
end
|
227
310
|
|
228
311
|
def drop_table(name, options = {})
|
229
312
|
super(name)
|
230
|
-
|
313
|
+
execute_quietly "DROP GENERATOR #{default_sequence_name(name)}"
|
231
314
|
end
|
232
315
|
|
233
316
|
def change_column(table_name, column_name, type, options = {})
|
@@ -326,3 +409,35 @@ module ArJdbc
|
|
326
409
|
end
|
327
410
|
FireBird = Firebird
|
328
411
|
end
|
412
|
+
|
413
|
+
require 'arjdbc/util/quoted_cache'
|
414
|
+
|
415
|
+
module ActiveRecord::ConnectionAdapters
|
416
|
+
|
417
|
+
remove_const(:FirebirdAdapter) if const_defined?(:FirebirdAdapter)
|
418
|
+
|
419
|
+
class FirebirdAdapter < JdbcAdapter
|
420
|
+
include ::ArJdbc::Firebird
|
421
|
+
include ::ArJdbc::Util::QuotedCache
|
422
|
+
|
423
|
+
# By default, the FirebirdAdapter will consider all columns of type
|
424
|
+
# <tt>char(1)</tt> as boolean. If you wish to disable this :
|
425
|
+
#
|
426
|
+
# ActiveRecord::ConnectionAdapters::FirebirdAdapter.emulate_booleans = false
|
427
|
+
#
|
428
|
+
def self.emulate_booleans?; ::ArJdbc::Firebird.emulate_booleans?; end
|
429
|
+
def self.emulate_booleans; ::ArJdbc::Firebird.emulate_booleans?; end # oracle-enhanced
|
430
|
+
def self.emulate_booleans=(emulate); ::ArJdbc::Firebird.emulate_booleans = emulate; end
|
431
|
+
|
432
|
+
def initialize(*args)
|
433
|
+
::ArJdbc::Firebird.initialize!
|
434
|
+
super
|
435
|
+
end
|
436
|
+
|
437
|
+
end
|
438
|
+
|
439
|
+
class FirebirdColumn < JdbcColumn
|
440
|
+
include ::ArJdbc::Firebird::Column
|
441
|
+
end
|
442
|
+
|
443
|
+
end
|