activerecord-jdbc-adapter 1.3.17 → 1.3.18
Sign up to get free protection for your applications and to get access to all the features.
- 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
|