activerecord-oracle_enhanced-adapter 1.4.2.rc1 → 1.4.2.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.md +13 -0
- data/README.md +3 -1
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +35 -39
- data/lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb +4 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_column.rb +7 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +3 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb +8 -5
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +40 -9
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +5 -3
- data/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +12 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +2 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +105 -1
- metadata +31 -31
data/History.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
### 1.4.2.rc2 / 2013-03-01
|
2
|
+
|
3
|
+
* Bug fixes:
|
4
|
+
* Do not consider the numeric attribute as changed if the old value is zero and the new value is not a string [#247]
|
5
|
+
* Removed table_name_prefix and table_name_suffix when schema dumper executed [#248]
|
6
|
+
* Remove_column should raise an ArgumentError when no columns are passed [#246]
|
7
|
+
* Don't dump type for NUMBER virtual columns [#256]
|
8
|
+
* Address :returning_id column should be of type Column [#274]
|
9
|
+
* Migrated versions should be dumped in order [#277]
|
10
|
+
* Always write serialized LOB columns [#275]
|
11
|
+
* Truncate the schema_migrations index [#276]
|
12
|
+
* Split paths on windows machines in the right way [#231]
|
13
|
+
|
1
14
|
### 1.4.2.rc1 / 2012-11-13
|
2
15
|
|
3
16
|
* Enhancements:
|
data/README.md
CHANGED
@@ -113,6 +113,8 @@ If you deploy JRuby on Rails application in Java application server that support
|
|
113
113
|
adapter: oracle_enhanced
|
114
114
|
jndi: "jdbc/jndi_connection_name"
|
115
115
|
|
116
|
+
To use jndi with Tomcat you need to set the accessToUnderlyingConnectionAllowed to true property on the pool. See the [Tomcat Documentation](http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html) for reference.
|
117
|
+
|
116
118
|
You can find other available database.yml connection parameters in [oracle_enhanced_adapter.rb](/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb). There are many NLS settings as well as some other Oracle session settings.
|
117
119
|
|
118
120
|
### Adapter settings
|
@@ -257,7 +259,7 @@ And you can even create index on multiple tables by providing SELECT statements
|
|
257
259
|
Post.contains(:all_text, "aaa within title")
|
258
260
|
Post.contains(:all_text, "bbb within comment_author")
|
259
261
|
|
260
|
-
### Oracle virtual
|
262
|
+
### Oracle virtual columns support
|
261
263
|
|
262
264
|
Since version R11G1 Oracle database allows adding computed [Virtual Columns](http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php) to the table.
|
263
265
|
They can be used as normal fields in the queries, in the foreign key contstraints and to partitioning data.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.2.
|
1
|
+
1.4.2.rc2
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{activerecord-oracle_enhanced-adapter}
|
8
|
-
s.version = "1.4.2.
|
8
|
+
s.version = "1.4.2.rc2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Raimonds Simanovskis}]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2013-03-01}
|
13
13
|
s.description = %q{Oracle "enhanced" ActiveRecord adapter contains useful additional methods for working with new and legacy Oracle databases.
|
14
14
|
This adapter is superset of original ActiveRecord Oracle adapter.
|
15
15
|
}
|
@@ -46,7 +46,7 @@ module ActiveRecord
|
|
46
46
|
# Oracle enhanced adapter will work with both
|
47
47
|
# Ruby 1.8/1.9 ruby-oci8 gem (which provides interface to Oracle OCI client)
|
48
48
|
# or with JRuby and Oracle JDBC driver.
|
49
|
-
#
|
49
|
+
#
|
50
50
|
# It should work with Oracle 9i, 10g and 11g databases.
|
51
51
|
# Limited set of functionality should work on Oracle 8i as well but several features
|
52
52
|
# rely on newer functionality in Oracle database.
|
@@ -71,9 +71,9 @@ module ActiveRecord
|
|
71
71
|
# * <tt>:username</tt>
|
72
72
|
# * <tt>:password</tt>
|
73
73
|
# * <tt>:database</tt> - either TNS alias or connection string for OCI client or database name in JDBC connection string
|
74
|
-
#
|
74
|
+
#
|
75
75
|
# Optional parameters:
|
76
|
-
#
|
76
|
+
#
|
77
77
|
# * <tt>:host</tt> - host name for JDBC connection, defaults to "localhost"
|
78
78
|
# * <tt>:port</tt> - port number for JDBC connection, defaults to 1521
|
79
79
|
# * <tt>:privilege</tt> - set "SYSDBA" if you want to connect with this privilege
|
@@ -82,11 +82,10 @@ module ActiveRecord
|
|
82
82
|
# * <tt>:cursor_sharing</tt> - cursor sharing mode to minimize amount of unique statements, defaults to "force"
|
83
83
|
# * <tt>:time_zone</tt> - database session time zone
|
84
84
|
# (it is recommended to set it using ENV['TZ'] which will be then also used for database session time zone)
|
85
|
-
#
|
85
|
+
#
|
86
86
|
# Optionals NLS parameters:
|
87
|
-
#
|
87
|
+
#
|
88
88
|
# * <tt>:nls_calendar</tt>
|
89
|
-
# * <tt>:nls_characterset</tt>
|
90
89
|
# * <tt>:nls_comp</tt>
|
91
90
|
# * <tt>:nls_currency</tt>
|
92
91
|
# * <tt>:nls_date_format</tt> - format for :date columns, defaults to <tt>YYYY-MM-DD HH24:MI:SS</tt>
|
@@ -96,7 +95,6 @@ module ActiveRecord
|
|
96
95
|
# * <tt>:nls_language</tt>
|
97
96
|
# * <tt>:nls_length_semantics</tt> - semantics of size of VARCHAR2 and CHAR columns, defaults to <tt>CHAR</tt>
|
98
97
|
# (meaning that size specifies number of characters and not bytes)
|
99
|
-
# * <tt>:nls_nchar_characterset</tt>
|
100
98
|
# * <tt>:nls_nchar_conv_excp</tt>
|
101
99
|
# * <tt>:nls_numeric_characters</tt>
|
102
100
|
# * <tt>:nls_sort</tt>
|
@@ -105,7 +103,7 @@ module ActiveRecord
|
|
105
103
|
# * <tt>:nls_timestamp_tz_format</tt>
|
106
104
|
# * <tt>:nls_time_format</tt>
|
107
105
|
# * <tt>:nls_time_tz_format</tt>
|
108
|
-
#
|
106
|
+
#
|
109
107
|
class OracleEnhancedAdapter < AbstractAdapter
|
110
108
|
|
111
109
|
##
|
@@ -126,12 +124,12 @@ module ActiveRecord
|
|
126
124
|
# to Date then you can add the following line to your initializer file:
|
127
125
|
#
|
128
126
|
# ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates = true
|
129
|
-
#
|
127
|
+
#
|
130
128
|
# As this option can have side effects when unnecessary typecasting is done it is recommended
|
131
129
|
# that Date columns are explicily defined with +set_date_columns+ method.
|
132
130
|
cattr_accessor :emulate_dates
|
133
131
|
self.emulate_dates = false
|
134
|
-
|
132
|
+
|
135
133
|
##
|
136
134
|
# :singleton-method:
|
137
135
|
# OracleEnhancedAdapter will use the default tablespace, but if you want specific types of
|
@@ -139,7 +137,7 @@ module ActiveRecord
|
|
139
137
|
#
|
140
138
|
# ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces =
|
141
139
|
# {:clob => 'TS_LOB', :blob => 'TS_LOB', :index => 'TS_INDEX', :table => 'TS_DATA'}
|
142
|
-
#
|
140
|
+
#
|
143
141
|
# Using the :tablespace option where available (e.g create_table) will take precedence
|
144
142
|
# over these settings.
|
145
143
|
cattr_accessor :default_tablespaces
|
@@ -153,7 +151,7 @@ module ActiveRecord
|
|
153
151
|
# to Date then you can add the following line to your initializer file:
|
154
152
|
#
|
155
153
|
# ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
|
156
|
-
#
|
154
|
+
#
|
157
155
|
# As this option can have side effects when unnecessary typecasting is done it is recommended
|
158
156
|
# that Date columns are explicily defined with +set_date_columns+ method.
|
159
157
|
cattr_accessor :emulate_dates_by_column_name
|
@@ -212,7 +210,7 @@ module ActiveRecord
|
|
212
210
|
return true if ["CHAR(1)","VARCHAR2(1)"].include?(field_type)
|
213
211
|
field_type =~ /^VARCHAR2/ && (name =~ /_flag$/i || name =~ /_yn$/i)
|
214
212
|
end
|
215
|
-
|
213
|
+
|
216
214
|
# How boolean value should be quoted to String.
|
217
215
|
# Used if +emulate_booleans_from_strings+ option is set to +true+.
|
218
216
|
def self.boolean_to_string(bool)
|
@@ -222,15 +220,15 @@ module ActiveRecord
|
|
222
220
|
##
|
223
221
|
# :singleton-method:
|
224
222
|
# Specify non-default date format that should be used when assigning string values to :date columns, e.g.:
|
225
|
-
#
|
223
|
+
#
|
226
224
|
# ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.string_to_date_format = “%d.%m.%Y”
|
227
225
|
cattr_accessor :string_to_date_format
|
228
226
|
self.string_to_date_format = nil
|
229
|
-
|
227
|
+
|
230
228
|
##
|
231
229
|
# :singleton-method:
|
232
230
|
# Specify non-default time format that should be used when assigning string values to :datetime columns, e.g.:
|
233
|
-
#
|
231
|
+
#
|
234
232
|
# ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.string_to_time_format = “%d.%m.%Y %H:%M:%S”
|
235
233
|
cattr_accessor :string_to_time_format
|
236
234
|
self.string_to_time_format = nil
|
@@ -279,7 +277,7 @@ module ActiveRecord
|
|
279
277
|
end
|
280
278
|
|
281
279
|
ADAPTER_NAME = 'OracleEnhanced'.freeze
|
282
|
-
|
280
|
+
|
283
281
|
def adapter_name #:nodoc:
|
284
282
|
ADAPTER_NAME
|
285
283
|
end
|
@@ -299,7 +297,6 @@ module ActiveRecord
|
|
299
297
|
#:stopdoc:
|
300
298
|
DEFAULT_NLS_PARAMETERS = {
|
301
299
|
:nls_calendar => nil,
|
302
|
-
:nls_characterset => nil,
|
303
300
|
:nls_comp => nil,
|
304
301
|
:nls_currency => nil,
|
305
302
|
:nls_date_format => 'YYYY-MM-DD HH24:MI:SS',
|
@@ -308,7 +305,6 @@ module ActiveRecord
|
|
308
305
|
:nls_iso_currency => nil,
|
309
306
|
:nls_language => nil,
|
310
307
|
:nls_length_semantics => 'CHAR',
|
311
|
-
:nls_nchar_characterset => nil,
|
312
308
|
:nls_nchar_conv_excp => nil,
|
313
309
|
:nls_numeric_characters => nil,
|
314
310
|
:nls_sort => nil,
|
@@ -418,12 +414,12 @@ module ActiveRecord
|
|
418
414
|
# Names must be from 1 to 30 bytes long with these exceptions:
|
419
415
|
# * Names of databases are limited to 8 bytes.
|
420
416
|
# * Names of database links can be as long as 128 bytes.
|
421
|
-
#
|
417
|
+
#
|
422
418
|
# Nonquoted identifiers cannot be Oracle Database reserved words
|
423
|
-
#
|
419
|
+
#
|
424
420
|
# Nonquoted identifiers must begin with an alphabetic character from
|
425
421
|
# your database character set
|
426
|
-
#
|
422
|
+
#
|
427
423
|
# Nonquoted identifiers can contain only alphanumeric characters from
|
428
424
|
# your database character set and the underscore (_), dollar sign ($),
|
429
425
|
# and pound sign (#). Database links can also contain periods (.) and
|
@@ -438,7 +434,7 @@ module ActiveRecord
|
|
438
434
|
# can be prefixed with schema name
|
439
435
|
# CamelCase table names should be quoted
|
440
436
|
def self.valid_table_name?(name) #:nodoc:
|
441
|
-
name = name.to_s
|
437
|
+
name = name.to_s
|
442
438
|
name =~ VALID_TABLE_NAME && !(name =~ /[A-Z]/ && name =~ /[a-z]/) ? true : false
|
443
439
|
end
|
444
440
|
|
@@ -446,7 +442,7 @@ module ActiveRecord
|
|
446
442
|
name = name.to_s
|
447
443
|
@quoted_table_names[name] ||= name.split('.').map{|n| n.split('@').map{|m| quote_column_name(m)}.join('@')}.join('.')
|
448
444
|
end
|
449
|
-
|
445
|
+
|
450
446
|
def quote_string(s) #:nodoc:
|
451
447
|
s.gsub(/'/, "''")
|
452
448
|
end
|
@@ -696,17 +692,16 @@ module ActiveRecord
|
|
696
692
|
def sql_for_insert(sql, pk, id_value, sequence_name, binds)
|
697
693
|
unless id_value || pk.nil? || (defined?(CompositePrimaryKeys) && pk.kind_of?(CompositePrimaryKeys::CompositeKeys))
|
698
694
|
sql = "#{sql} RETURNING #{quote_column_name(pk)} INTO :returning_id"
|
699
|
-
|
695
|
+
returning_id_col = OracleEnhancedColumn.new("returning_id", nil, "number", true, "dual", :integer, true, true)
|
696
|
+
(binds = binds.dup) << [returning_id_col, nil]
|
700
697
|
end
|
701
698
|
[sql, binds]
|
702
699
|
end
|
703
700
|
|
704
|
-
EXEC_INSERT_RESULT_COLUMNS = %w(returning_id) #:nodoc:
|
705
|
-
|
706
701
|
# New method in ActiveRecord 3.1
|
707
702
|
def exec_insert(sql, name, binds)
|
708
703
|
log(sql, name, binds) do
|
709
|
-
returning_id_index = nil
|
704
|
+
returning_id_col = returning_id_index = nil
|
710
705
|
cursor = if @statements.key?(sql)
|
711
706
|
@statements[sql]
|
712
707
|
else
|
@@ -715,7 +710,8 @@ module ActiveRecord
|
|
715
710
|
|
716
711
|
binds.each_with_index do |bind, i|
|
717
712
|
col, val = bind
|
718
|
-
if col
|
713
|
+
if col.returning_id?
|
714
|
+
returning_id_col = [col]
|
719
715
|
returning_id_index = i + 1
|
720
716
|
cursor.bind_returning_param(returning_id_index, Integer)
|
721
717
|
else
|
@@ -730,7 +726,7 @@ module ActiveRecord
|
|
730
726
|
returning_id = cursor.get_returning_param(returning_id_index, Integer)
|
731
727
|
rows << [returning_id]
|
732
728
|
end
|
733
|
-
ActiveRecord::Result.new(
|
729
|
+
ActiveRecord::Result.new(returning_id_col || [], rows)
|
734
730
|
end
|
735
731
|
end
|
736
732
|
|
@@ -977,7 +973,7 @@ module ActiveRecord
|
|
977
973
|
current_index = row['index_name']
|
978
974
|
end
|
979
975
|
|
980
|
-
# Functional index columns and virtual columns both get stored as column expressions,
|
976
|
+
# Functional index columns and virtual columns both get stored as column expressions,
|
981
977
|
# but re-creating a virtual column index as an expression (instead of using the virtual column's name)
|
982
978
|
# results in a ORA-54018 error. Thus, we only want the column expression value returned
|
983
979
|
# when the column is not virtual.
|
@@ -1003,12 +999,12 @@ module ActiveRecord
|
|
1003
999
|
@@ignore_table_columns[table_name] += args.map{|a| a.to_s.downcase}
|
1004
1000
|
@@ignore_table_columns[table_name].uniq!
|
1005
1001
|
end
|
1006
|
-
|
1002
|
+
|
1007
1003
|
def ignored_table_columns(table_name) #:nodoc:
|
1008
1004
|
@@ignore_table_columns ||= {}
|
1009
1005
|
@@ignore_table_columns[table_name]
|
1010
1006
|
end
|
1011
|
-
|
1007
|
+
|
1012
1008
|
# used just in tests to clear ignored table columns
|
1013
1009
|
def clear_ignored_table_columns #:nodoc:
|
1014
1010
|
@@ignore_table_columns = nil
|
@@ -1024,7 +1020,7 @@ module ActiveRecord
|
|
1024
1020
|
@@table_column_type[table_name][col.to_s.downcase] = column_type
|
1025
1021
|
end
|
1026
1022
|
end
|
1027
|
-
|
1023
|
+
|
1028
1024
|
def get_type_for_column(table_name, column_name) #:nodoc:
|
1029
1025
|
@@table_column_type && @@table_column_type[table_name] && @@table_column_type[table_name][column_name.to_s.downcase]
|
1030
1026
|
end
|
@@ -1111,7 +1107,7 @@ module ActiveRecord
|
|
1111
1107
|
if row['data_default'] && !is_virtual
|
1112
1108
|
row['data_default'].sub!(/^(.*?)\s*$/, '\1')
|
1113
1109
|
|
1114
|
-
# If a default contains a newline these cleanup regexes need to
|
1110
|
+
# If a default contains a newline these cleanup regexes need to
|
1115
1111
|
# match newlines.
|
1116
1112
|
row['data_default'].sub!(/^'(.*)'$/m, '\1')
|
1117
1113
|
row['data_default'] = nil if row['data_default'] =~ /^(null|empty_[bc]lob\(\))$/i
|
@@ -1150,7 +1146,7 @@ module ActiveRecord
|
|
1150
1146
|
cattr_accessor :default_sequence_start_value
|
1151
1147
|
self.default_sequence_start_value = 10000
|
1152
1148
|
|
1153
|
-
# Find a table's primary key and sequence.
|
1149
|
+
# Find a table's primary key and sequence.
|
1154
1150
|
# *Note*: Only primary key is implemented - sequence will be nil.
|
1155
1151
|
def pk_and_sequence_for(table_name, owner=nil, desc_table_name=nil, db_link=nil) #:nodoc:
|
1156
1152
|
if @@cache_columns
|
@@ -1198,7 +1194,7 @@ module ActiveRecord
|
|
1198
1194
|
# Oracle requires the ORDER BY columns to be in the SELECT list for DISTINCT
|
1199
1195
|
# queries. However, with those columns included in the SELECT DISTINCT list, you
|
1200
1196
|
# won't actually get a distinct list of the column you want (presuming the column
|
1201
|
-
# has duplicates with multiple values for the ordered-by columns. So we use the
|
1197
|
+
# has duplicates with multiple values for the ordered-by columns. So we use the
|
1202
1198
|
# FIRST_VALUE function to get a single (first) value for each column, effectively
|
1203
1199
|
# making every row the same.
|
1204
1200
|
#
|
@@ -1296,7 +1292,7 @@ module ActiveRecord
|
|
1296
1292
|
#
|
1297
1293
|
# PL/SQL in Oracle uses dbms_output for logging print statements
|
1298
1294
|
# These methods stick that output into the Rails log so Ruby and PL/SQL
|
1299
|
-
# code can can be debugged together in a single application
|
1295
|
+
# code can can be debugged together in a single application
|
1300
1296
|
|
1301
1297
|
# Maximum DBMS_OUTPUT buffer size
|
1302
1298
|
DBMS_OUTPUT_BUFFER_SIZE = 10000 # can be 1-1000000
|
@@ -1328,7 +1324,7 @@ module ActiveRecord
|
|
1328
1324
|
ensure
|
1329
1325
|
log_dbms_output if dbms_output_enabled?
|
1330
1326
|
end
|
1331
|
-
|
1327
|
+
|
1332
1328
|
private
|
1333
1329
|
|
1334
1330
|
def set_dbms_output_plsql_connection
|
@@ -75,7 +75,10 @@ module ActiveRecord
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
def record_changed_lobs
|
78
|
-
@changed_lob_columns = self.class.lob_columns.select
|
78
|
+
@changed_lob_columns = self.class.lob_columns.select do |col|
|
79
|
+
self.class.serialized_attributes.keys.include?(col.name) ||
|
80
|
+
(self.send(:"#{col.name}_changed?") && !self.class.readonly_attributes.to_a.include?(col.name))
|
81
|
+
end
|
79
82
|
end
|
80
83
|
private :enhanced_write_lobs
|
81
84
|
private :record_changed_lobs
|
@@ -2,13 +2,14 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters #:nodoc:
|
3
3
|
class OracleEnhancedColumn < Column
|
4
4
|
|
5
|
-
attr_reader :table_name, :forced_column_type, :nchar, :virtual_column_data_default #:nodoc:
|
5
|
+
attr_reader :table_name, :forced_column_type, :nchar, :virtual_column_data_default, :returning_id #:nodoc:
|
6
6
|
|
7
|
-
def initialize(name, default, sql_type = nil, null = true, table_name = nil, forced_column_type = nil, virtual=false) #:nodoc:
|
7
|
+
def initialize(name, default, sql_type = nil, null = true, table_name = nil, forced_column_type = nil, virtual=false, returning_id=false) #:nodoc:
|
8
8
|
@table_name = table_name
|
9
9
|
@forced_column_type = forced_column_type
|
10
10
|
@virtual = virtual
|
11
11
|
@virtual_column_data_default = default.inspect if virtual
|
12
|
+
@returning_id = returning_id
|
12
13
|
default = nil if virtual
|
13
14
|
super(name, default, sql_type, null)
|
14
15
|
# Is column NCHAR or NVARCHAR2 (will need to use N'...' value quoting for these data types)?
|
@@ -26,6 +27,10 @@ module ActiveRecord
|
|
26
27
|
@virtual
|
27
28
|
end
|
28
29
|
|
30
|
+
def returning_id?
|
31
|
+
@returning_id
|
32
|
+
end
|
33
|
+
|
29
34
|
def lob?
|
30
35
|
self.sql_type =~ /LOB$/i
|
31
36
|
end
|
@@ -18,6 +18,8 @@ module ActiveRecord #:nodoc:
|
|
18
18
|
# therefore need to convert empty string value to nil if old value is nil
|
19
19
|
elsif column.type == :string && column.null && old.nil?
|
20
20
|
value = nil if value == ''
|
21
|
+
elsif old == 0 && value.is_a?(String) && value.present? && value != '0'
|
22
|
+
value = nil
|
21
23
|
else
|
22
24
|
value = column.type_cast(value)
|
23
25
|
end
|
@@ -41,4 +43,4 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
41
43
|
alias_method :field_changed?, :_field_changed?
|
42
44
|
end
|
43
45
|
end
|
44
|
-
end
|
46
|
+
end
|
@@ -15,7 +15,7 @@ begin
|
|
15
15
|
|
16
16
|
unless ojdbc_jar.nil? || ENV_JAVA['java.class.path'] =~ Regexp.new(ojdbc_jar)
|
17
17
|
# On Unix environment variable should be PATH, on Windows it is sometimes Path
|
18
|
-
env_path = (ENV["PATH"] || ENV["Path"] || '').split(
|
18
|
+
env_path = (ENV["PATH"] || ENV["Path"] || '').split(File::PATH_SEPARATOR)
|
19
19
|
# Look for JDBC driver at first in lib subdirectory (application specific JDBC file version)
|
20
20
|
# then in Ruby load path and finally in environment PATH
|
21
21
|
if ojdbc_jar_path = ['./lib'].concat($LOAD_PATH).concat(env_path).find{|d| File.exists?(File.join(d,ojdbc_jar))}
|
@@ -13,10 +13,10 @@ module ActiveRecord #:nodoc:
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def ignore_table?(table)
|
16
|
-
[
|
16
|
+
['schema_migrations', ignore_tables].flatten.any? do |ignored|
|
17
17
|
case ignored
|
18
|
-
when String; table == ignored
|
19
|
-
when Regexp; table =~ ignored
|
18
|
+
when String; remove_prefix_and_suffix(table) == ignored
|
19
|
+
when Regexp; remove_prefix_and_suffix(table) =~ ignored
|
20
20
|
else
|
21
21
|
raise StandardError, 'ActiveRecord::SchemaDumper.ignore_tables accepts an array of String and / or Regexp values.'
|
22
22
|
end
|
@@ -177,7 +177,7 @@ module ActiveRecord #:nodoc:
|
|
177
177
|
spec[:name] = column.name.inspect
|
178
178
|
spec[:type] = column.virtual? ? 'virtual' : column.type.to_s
|
179
179
|
spec[:type] = column.virtual? ? 'virtual' : column.type.to_s
|
180
|
-
spec[:virtual_type] = column.type.inspect if column.virtual?
|
180
|
+
spec[:virtual_type] = column.type.inspect if column.virtual? && column.sql_type != 'NUMBER'
|
181
181
|
spec[:limit] = column.limit.inspect if column.limit != @types[column.type][:limit] && column.type != :decimal
|
182
182
|
spec[:precision] = column.precision.inspect if !column.precision.nil?
|
183
183
|
spec[:scale] = column.scale.inspect if !column.scale.nil?
|
@@ -230,7 +230,10 @@ module ActiveRecord #:nodoc:
|
|
230
230
|
|
231
231
|
stream
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
|
+
def remove_prefix_and_suffix(table)
|
235
|
+
table.gsub(/^(#{ActiveRecord::Base.table_name_prefix})(.+)(#{ActiveRecord::Base.table_name_suffix})$/, "\\2")
|
236
|
+
end
|
234
237
|
|
235
238
|
# remove table name prefix and suffix when doing #inspect (which is used in tables method)
|
236
239
|
module TableInspect #:nodoc:
|
@@ -22,11 +22,11 @@ module ActiveRecord
|
|
22
22
|
# end
|
23
23
|
#
|
24
24
|
# Create primary key trigger (so that you can skip primary key value in INSERT statement).
|
25
|
-
# By default trigger name will be "table_name_pkt", you can override the name with
|
25
|
+
# By default trigger name will be "table_name_pkt", you can override the name with
|
26
26
|
# :trigger_name option (but it is not recommended to override it as then this trigger will
|
27
27
|
# not be detected by ActiveRecord model and it will still do prefetching of sequence value).
|
28
28
|
# Example:
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# create_table :users, :primary_key_trigger => true do |t|
|
31
31
|
# # ...
|
32
32
|
# end
|
@@ -37,11 +37,11 @@ module ActiveRecord
|
|
37
37
|
# t.string :first_name, :comment => “Given name”
|
38
38
|
# t.string :last_name, :comment => “Surname”
|
39
39
|
# end
|
40
|
-
|
40
|
+
|
41
41
|
def create_table(name, options = {}, &block)
|
42
42
|
create_sequence = options[:id] != false
|
43
43
|
column_comments = {}
|
44
|
-
|
44
|
+
|
45
45
|
table_definition = TableDefinition.new(self)
|
46
46
|
table_definition.primary_key(options[:primary_key] || Base.get_primary_key(name.to_s.singularize)) unless options[:id] == false
|
47
47
|
|
@@ -87,14 +87,14 @@ module ActiveRecord
|
|
87
87
|
end
|
88
88
|
create_sql << " #{options[:options]}"
|
89
89
|
execute create_sql
|
90
|
-
|
90
|
+
|
91
91
|
create_sequence_and_trigger(name, options) if create_sequence
|
92
|
-
|
92
|
+
|
93
93
|
add_table_comment name, options[:comment]
|
94
94
|
column_comments.each do |column_name, comment|
|
95
95
|
add_comment name, column_name, comment
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
end
|
99
99
|
|
100
100
|
def rename_table(name, new_name) #:nodoc:
|
@@ -116,6 +116,35 @@ module ActiveRecord
|
|
116
116
|
clear_table_columns_cache(name)
|
117
117
|
end
|
118
118
|
|
119
|
+
def initialize_schema_migrations_table
|
120
|
+
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
|
121
|
+
|
122
|
+
unless table_exists?(sm_table)
|
123
|
+
index_name = "#{Base.table_name_prefix}unique_schema_migrations#{Base.table_name_suffix}"
|
124
|
+
if index_name.length > index_name_length
|
125
|
+
truncate_to = index_name_length - index_name.to_s.length - 1
|
126
|
+
truncated_name = "unique_schema_migrations"[0..truncate_to]
|
127
|
+
index_name = "#{Base.table_name_prefix}#{truncated_name}#{Base.table_name_suffix}"
|
128
|
+
end
|
129
|
+
|
130
|
+
create_table(sm_table, :id => false) do |schema_migrations_table|
|
131
|
+
schema_migrations_table.column :version, :string, :null => false
|
132
|
+
end
|
133
|
+
add_index sm_table, :version, :unique => true, :name => index_name
|
134
|
+
|
135
|
+
# Backwards-compatibility: if we find schema_info, assume we've
|
136
|
+
# migrated up to that point:
|
137
|
+
si_table = Base.table_name_prefix + 'schema_info' + Base.table_name_suffix
|
138
|
+
if table_exists?(si_table)
|
139
|
+
ActiveSupport::Deprecation.warn "Usage of the schema table `#{si_table}` is deprecated. Please switch to using `schema_migrations` table"
|
140
|
+
|
141
|
+
old_version = select_value("SELECT version FROM #{quote_table_name(si_table)}").to_i
|
142
|
+
assume_migrated_upto_version(old_version)
|
143
|
+
drop_table(si_table)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
119
148
|
# clear cached indexes when adding new index
|
120
149
|
def add_index(table_name, column_name, options = {}) #:nodoc:
|
121
150
|
column_names = Array(column_name)
|
@@ -166,10 +195,10 @@ module ActiveRecord
|
|
166
195
|
options = {} unless options.is_a?(Hash)
|
167
196
|
identifier_max_length = options[:identifier_max_length] || index_name_length
|
168
197
|
return default_name if default_name.length <= identifier_max_length
|
169
|
-
|
198
|
+
|
170
199
|
# remove 'index', 'on' and 'and' keywords
|
171
200
|
shortened_name = "i_#{table_name}_#{Array(options[:column]) * '_'}"
|
172
|
-
|
201
|
+
|
173
202
|
# leave just first three letters from each word
|
174
203
|
if shortened_name.length > identifier_max_length
|
175
204
|
shortened_name = shortened_name.split('_').map{|w| w[0,3]}.join('_')
|
@@ -271,6 +300,8 @@ module ActiveRecord
|
|
271
300
|
end
|
272
301
|
|
273
302
|
def remove_column(table_name, *column_names) #:nodoc:
|
303
|
+
raise ArgumentError.new("You must specify at least one column name. Example: remove_column(:people, :first_name)") if column_names.empty?
|
304
|
+
|
274
305
|
major, minor = ActiveRecord::VERSION::MAJOR, ActiveRecord::VERSION::MINOR
|
275
306
|
is_deprecated = (major == 3 and minor >= 2) or major > 3
|
276
307
|
|
@@ -94,9 +94,11 @@ module ActiveRecord
|
|
94
94
|
references = options[:references] ? options[:references].first : nil
|
95
95
|
references_sql = quote_column_name(options[:primary_key] || references || "id")
|
96
96
|
end
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
|
98
|
+
table_name = ActiveRecord::Migrator.proper_table_name(to_table)
|
99
|
+
|
100
|
+
sql = "FOREIGN KEY (#{columns_sql}) REFERENCES #{quote_table_name(table_name)}(#{references_sql})"
|
101
|
+
|
100
102
|
case options[:dependent]
|
101
103
|
when :nullify
|
102
104
|
sql << " ON DELETE SET NULL"
|
@@ -136,7 +136,7 @@ module ActiveRecord #:nodoc:
|
|
136
136
|
|
137
137
|
def dump_schema_information #:nodoc:
|
138
138
|
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
|
139
|
-
migrated = select_values("SELECT version FROM #{sm_table}")
|
139
|
+
migrated = select_values("SELECT version FROM #{sm_table} ORDER BY version")
|
140
140
|
join_with_statement_token(migrated.map{|v| "INSERT INTO #{sm_table} (version) VALUES ('#{v}')" })
|
141
141
|
end
|
142
142
|
|
@@ -1052,6 +1052,18 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
1052
1052
|
@employee.reload
|
1053
1053
|
@employee.comments.should == @char_data
|
1054
1054
|
end
|
1055
|
+
|
1056
|
+
it "should keep unchanged serialized data when other columns changed" do
|
1057
|
+
@employee = Test2Employee.create!(
|
1058
|
+
:first_name => "First",
|
1059
|
+
:last_name => "Last",
|
1060
|
+
:comments => "initial serialized data"
|
1061
|
+
)
|
1062
|
+
@employee.first_name = "Steve"
|
1063
|
+
@employee.save
|
1064
|
+
@employee.reload
|
1065
|
+
@employee.comments.should == "initial serialized data"
|
1066
|
+
end
|
1055
1067
|
end
|
1056
1068
|
|
1057
1069
|
describe "OracleEnhancedAdapter handling of BLOB columns" do
|
@@ -355,6 +355,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
355
355
|
t.virtual :full_name, :as => "first_name || ', ' || last_name"
|
356
356
|
t.virtual :short_name, :as => "COALESCE(first_name, last_name)", :type => :string, :limit => 300
|
357
357
|
t.virtual :abbrev_name, :as => "SUBSTR(first_name,1,50) || ' ' || SUBSTR(last_name,1,1) || '.'", :type => "VARCHAR(100)"
|
358
|
+
t.virtual :name_ratio, :as=>'(LENGTH(first_name)*10/LENGTH(last_name)*10)'
|
358
359
|
t.column :full_name_length, :virtual, :as => "length(first_name || ', ' || last_name)", :type => :integer
|
359
360
|
t.virtual :field_with_leading_space, :as => "' ' || first_name || ' '", :limit => 300, :type => :string
|
360
361
|
end
|
@@ -388,6 +389,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
388
389
|
standard_dump.should =~ /t\.virtual "full_name",(\s*):limit => 512,(\s*):as => "\\"FIRST_NAME\\"\|\|', '\|\|\\"LAST_NAME\\"",(\s*):type => :string/
|
389
390
|
standard_dump.should =~ /t\.virtual "short_name",(\s*):limit => 300,(\s*):as =>(.*),(\s*):type => :string/
|
390
391
|
standard_dump.should =~ /t\.virtual "full_name_length",(\s*):precision => 38,(\s*):scale => 0,(\s*):as =>(.*),(\s*):type => :integer/
|
392
|
+
standard_dump.should =~ /t\.virtual "name_ratio",(\s*):as =>(.*)\"$/ # no :type
|
391
393
|
standard_dump.should =~ /t\.virtual "abbrev_name",(\s*):limit => 100,(\s*):as =>(.*),(\s*):type => :string/
|
392
394
|
standard_dump.should =~ /t\.virtual "field_with_leading_space",(\s*):limit => 300,(\s*):as => "' '\|\|\\"FIRST_NAME\\"\|\|' '",(\s*):type => :string/
|
393
395
|
end
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "OracleEnhancedAdapter schema definition" do
|
4
4
|
include SchemaSpecHelper
|
5
|
+
include LoggerSpecHelper
|
5
6
|
|
6
7
|
before(:all) do
|
7
8
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
@@ -186,6 +187,14 @@ describe "OracleEnhancedAdapter schema definition" do
|
|
186
187
|
e = TestEmployee.create!(:first_name => 'Raimonds')
|
187
188
|
@conn.select_value("SELECT test_employees_seq.currval FROM dual").should == e.id
|
188
189
|
end
|
190
|
+
|
191
|
+
it "should not generate NoMethodError for :returning_id:Symbol" do
|
192
|
+
set_logger
|
193
|
+
insert_id = @conn.insert("INSERT INTO test_employees (first_name) VALUES ('Yasuo')", nil, "id")
|
194
|
+
@logger.output(:error).should_not match(/^Could not log "sql.active_record" event. NoMethodError: undefined method `name' for :returning_id:Symbol/)
|
195
|
+
clear_logger
|
196
|
+
end
|
197
|
+
|
189
198
|
end
|
190
199
|
|
191
200
|
describe "with separate creation of primary key trigger" do
|
@@ -313,7 +322,7 @@ describe "OracleEnhancedAdapter schema definition" do
|
|
313
322
|
drop_table :test_employees
|
314
323
|
end
|
315
324
|
Object.send(:remove_const, "TestEmployee")
|
316
|
-
ActiveRecord::Base.table_name_prefix =
|
325
|
+
ActiveRecord::Base.table_name_prefix = ''
|
317
326
|
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
318
327
|
end
|
319
328
|
|
@@ -536,7 +545,12 @@ end
|
|
536
545
|
end
|
537
546
|
|
538
547
|
describe "foreign key constraints" do
|
548
|
+
let(:table_name_prefix) { '' }
|
549
|
+
let(:table_name_suffix) { '' }
|
550
|
+
|
539
551
|
before(:each) do
|
552
|
+
ActiveRecord::Base.table_name_prefix = table_name_prefix
|
553
|
+
ActiveRecord::Base.table_name_suffix = table_name_suffix
|
540
554
|
schema_define do
|
541
555
|
create_table :test_posts, :force => true do |t|
|
542
556
|
t.string :title
|
@@ -562,6 +576,8 @@ end
|
|
562
576
|
drop_table :test_comments rescue nil
|
563
577
|
drop_table :test_posts rescue nil
|
564
578
|
end
|
579
|
+
ActiveRecord::Base.table_name_prefix = ''
|
580
|
+
ActiveRecord::Base.table_name_suffix = ''
|
565
581
|
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
566
582
|
end
|
567
583
|
|
@@ -574,6 +590,34 @@ end
|
|
574
590
|
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.TEST_COMMENTS_TEST_POST_ID_FK/}
|
575
591
|
end
|
576
592
|
|
593
|
+
context "with table_name_prefix" do
|
594
|
+
let(:table_name_prefix) { 'xxx_' }
|
595
|
+
|
596
|
+
it "should use table_name_prefix for foreign table" do
|
597
|
+
schema_define do
|
598
|
+
add_foreign_key :test_comments, :test_posts
|
599
|
+
end
|
600
|
+
|
601
|
+
lambda do
|
602
|
+
TestComment.create(:body => "test", :test_post_id => 1)
|
603
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.XXX_TES_COM_TES_POS_ID_FK/}
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
607
|
+
context "with table_name_suffix" do
|
608
|
+
let(:table_name_suffix) { '_xxx' }
|
609
|
+
|
610
|
+
it "should use table_name_suffix for foreign table" do
|
611
|
+
schema_define do
|
612
|
+
add_foreign_key :test_comments, :test_posts
|
613
|
+
end
|
614
|
+
|
615
|
+
lambda do
|
616
|
+
TestComment.create(:body => "test", :test_post_id => 1)
|
617
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.TES_COM_XXX_TES_POS_ID_FK/}
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
577
621
|
it "should add foreign key with name" do
|
578
622
|
schema_define do
|
579
623
|
add_foreign_key :test_comments, :test_posts, :name => "comments_posts_fk"
|
@@ -1276,5 +1320,65 @@ end
|
|
1276
1320
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces.delete(:index)
|
1277
1321
|
@would_execute_sql.should =~ /CREATE +INDEX .* ON .* \(.*\) TABLESPACE #{DATABASE_NON_DEFAULT_TABLESPACE}/
|
1278
1322
|
end
|
1323
|
+
|
1324
|
+
describe "#initialize_schema_migrations_table" do
|
1325
|
+
# In Rails 2.3 to 3.2.x the index name for the migrations
|
1326
|
+
# table is hard-coded. We can modify the index name here
|
1327
|
+
# so we can support prefixes/suffixes that would
|
1328
|
+
# cause the index to be too long.
|
1329
|
+
#
|
1330
|
+
# Rails 4 can use this solution as well.
|
1331
|
+
after(:each) do
|
1332
|
+
ActiveRecord::Base.table_name_prefix = ''
|
1333
|
+
ActiveRecord::Base.table_name_suffix = ''
|
1334
|
+
end
|
1335
|
+
|
1336
|
+
def add_schema_migrations_index
|
1337
|
+
schema_define do
|
1338
|
+
initialize_schema_migrations_table
|
1339
|
+
end
|
1340
|
+
end
|
1341
|
+
|
1342
|
+
context "without prefix or suffix" do
|
1343
|
+
it "should not truncate the index name" do
|
1344
|
+
add_schema_migrations_index
|
1345
|
+
|
1346
|
+
@would_execute_sql.should include('CREATE UNIQUE INDEX "UNIQUE_SCHEMA_MIGRATIONS" ON "SCHEMA_MIGRATIONS" ("VERSION")')
|
1347
|
+
end
|
1348
|
+
end
|
1349
|
+
|
1350
|
+
context "with prefix" do
|
1351
|
+
before { ActiveRecord::Base.table_name_prefix = 'toolong_' }
|
1352
|
+
|
1353
|
+
it "should truncate the 'unique_schema_migrations' portion of the index name to fit the prefix within the limit" do
|
1354
|
+
add_schema_migrations_index
|
1355
|
+
|
1356
|
+
@would_execute_sql.should include('CREATE UNIQUE INDEX "TOOLONG_UNIQUE_SCHEMA_MIGRATIO" ON "TOOLONG_SCHEMA_MIGRATIONS" ("VERSION")')
|
1357
|
+
end
|
1358
|
+
end
|
1359
|
+
|
1360
|
+
context "with suffix" do
|
1361
|
+
before { ActiveRecord::Base.table_name_suffix = '_toolong' }
|
1362
|
+
|
1363
|
+
it "should truncate the 'unique_schema_migrations' portion of the index name to fit the suffix within the limit" do
|
1364
|
+
add_schema_migrations_index
|
1365
|
+
|
1366
|
+
@would_execute_sql.should include('CREATE UNIQUE INDEX "UNIQUE_SCHEMA_MIGRATIO_TOOLONG" ON "SCHEMA_MIGRATIONS_TOOLONG" ("VERSION")')
|
1367
|
+
end
|
1368
|
+
end
|
1369
|
+
|
1370
|
+
context "with prefix and suffix" do
|
1371
|
+
before do
|
1372
|
+
ActiveRecord::Base.table_name_prefix = 'begin_'
|
1373
|
+
ActiveRecord::Base.table_name_suffix = '_end'
|
1374
|
+
end
|
1375
|
+
|
1376
|
+
it "should truncate the 'unique_schema_migrations' portion of the index name to fit the suffix within the limit" do
|
1377
|
+
add_schema_migrations_index
|
1378
|
+
|
1379
|
+
@would_execute_sql.should include('CREATE UNIQUE INDEX "BEGIN_UNIQUE_SCHEMA_MIGRAT_END" ON "BEGIN_SCHEMA_MIGRATIONS_END" ("VERSION")')
|
1380
|
+
end
|
1381
|
+
end
|
1382
|
+
end
|
1279
1383
|
end
|
1280
1384
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-oracle_enhanced-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.2.
|
4
|
+
version: 1.4.2.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
+
type: :development
|
15
16
|
name: jeweler
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
@@ -19,15 +20,15 @@ dependencies:
|
|
19
20
|
- - ~>
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 1.5.1
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
23
|
version_requirements: !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
28
|
version: 1.5.1
|
29
|
+
prerelease: false
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
+
type: :development
|
31
32
|
name: rspec
|
32
33
|
requirement: !ruby/object:Gem::Requirement
|
33
34
|
none: false
|
@@ -35,15 +36,15 @@ dependencies:
|
|
35
36
|
- - ~>
|
36
37
|
- !ruby/object:Gem::Version
|
37
38
|
version: '2.4'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
39
|
version_requirements: !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
41
|
requirements:
|
43
42
|
- - ~>
|
44
43
|
- !ruby/object:Gem::Version
|
45
44
|
version: '2.4'
|
45
|
+
prerelease: false
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
+
type: :development
|
47
48
|
name: rdoc
|
48
49
|
requirement: !ruby/object:Gem::Requirement
|
49
50
|
none: false
|
@@ -51,79 +52,79 @@ dependencies:
|
|
51
52
|
- - ! '>='
|
52
53
|
- !ruby/object:Gem::Version
|
53
54
|
version: '0'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
55
|
version_requirements: !ruby/object:Gem::Requirement
|
57
56
|
none: false
|
58
57
|
requirements:
|
59
58
|
- - ! '>='
|
60
59
|
- !ruby/object:Gem::Version
|
61
60
|
version: '0'
|
61
|
+
prerelease: false
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
+
type: :development
|
63
64
|
name: activerecord
|
64
65
|
requirement: !ruby/object:Gem::Requirement
|
65
66
|
none: false
|
66
67
|
requirements:
|
67
68
|
- - '='
|
68
69
|
- !ruby/object:Gem::Version
|
69
|
-
version: 3.2.
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
70
|
+
version: 3.2.12
|
72
71
|
version_requirements: !ruby/object:Gem::Requirement
|
73
72
|
none: false
|
74
73
|
requirements:
|
75
74
|
- - '='
|
76
75
|
- !ruby/object:Gem::Version
|
77
|
-
version: 3.2.
|
76
|
+
version: 3.2.12
|
77
|
+
prerelease: false
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
+
type: :development
|
79
80
|
name: actionpack
|
80
81
|
requirement: !ruby/object:Gem::Requirement
|
81
82
|
none: false
|
82
83
|
requirements:
|
83
84
|
- - '='
|
84
85
|
- !ruby/object:Gem::Version
|
85
|
-
version: 3.2.
|
86
|
-
type: :development
|
87
|
-
prerelease: false
|
86
|
+
version: 3.2.12
|
88
87
|
version_requirements: !ruby/object:Gem::Requirement
|
89
88
|
none: false
|
90
89
|
requirements:
|
91
90
|
- - '='
|
92
91
|
- !ruby/object:Gem::Version
|
93
|
-
version: 3.2.
|
92
|
+
version: 3.2.12
|
93
|
+
prerelease: false
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
+
type: :development
|
95
96
|
name: activesupport
|
96
97
|
requirement: !ruby/object:Gem::Requirement
|
97
98
|
none: false
|
98
99
|
requirements:
|
99
100
|
- - '='
|
100
101
|
- !ruby/object:Gem::Version
|
101
|
-
version: 3.2.
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
102
|
+
version: 3.2.12
|
104
103
|
version_requirements: !ruby/object:Gem::Requirement
|
105
104
|
none: false
|
106
105
|
requirements:
|
107
106
|
- - '='
|
108
107
|
- !ruby/object:Gem::Version
|
109
|
-
version: 3.2.
|
108
|
+
version: 3.2.12
|
109
|
+
prerelease: false
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
|
+
type: :development
|
111
112
|
name: railties
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
114
|
none: false
|
114
115
|
requirements:
|
115
116
|
- - '='
|
116
117
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.2.
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
118
|
+
version: 3.2.12
|
120
119
|
version_requirements: !ruby/object:Gem::Requirement
|
121
120
|
none: false
|
122
121
|
requirements:
|
123
122
|
- - '='
|
124
123
|
- !ruby/object:Gem::Version
|
125
|
-
version: 3.2.
|
124
|
+
version: 3.2.12
|
125
|
+
prerelease: false
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
+
type: :development
|
127
128
|
name: ruby-plsql
|
128
129
|
requirement: !ruby/object:Gem::Requirement
|
129
130
|
none: false
|
@@ -131,15 +132,15 @@ dependencies:
|
|
131
132
|
- - ! '>='
|
132
133
|
- !ruby/object:Gem::Version
|
133
134
|
version: 0.4.4
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
135
|
version_requirements: !ruby/object:Gem::Requirement
|
137
136
|
none: false
|
138
137
|
requirements:
|
139
138
|
- - ! '>='
|
140
139
|
- !ruby/object:Gem::Version
|
141
140
|
version: 0.4.4
|
141
|
+
prerelease: false
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
|
+
type: :development
|
143
144
|
name: ruby-oci8
|
144
145
|
requirement: !ruby/object:Gem::Requirement
|
145
146
|
none: false
|
@@ -147,14 +148,13 @@ dependencies:
|
|
147
148
|
- - ! '>='
|
148
149
|
- !ruby/object:Gem::Version
|
149
150
|
version: 2.0.4
|
150
|
-
type: :development
|
151
|
-
prerelease: false
|
152
151
|
version_requirements: !ruby/object:Gem::Requirement
|
153
152
|
none: false
|
154
153
|
requirements:
|
155
154
|
- - ! '>='
|
156
155
|
- !ruby/object:Gem::Version
|
157
156
|
version: 2.0.4
|
157
|
+
prerelease: false
|
158
158
|
description: ! 'Oracle "enhanced" ActiveRecord adapter contains useful additional
|
159
159
|
methods for working with new and legacy Oracle databases.
|
160
160
|
|
@@ -223,10 +223,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
223
223
|
requirements:
|
224
224
|
- - ! '>='
|
225
225
|
- !ruby/object:Gem::Version
|
226
|
-
version: '0'
|
227
226
|
segments:
|
228
227
|
- 0
|
229
|
-
|
228
|
+
version: '0'
|
229
|
+
hash: -4155307569324953447
|
230
230
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
231
|
none: false
|
232
232
|
requirements:
|
@@ -235,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
235
|
version: 1.3.1
|
236
236
|
requirements: []
|
237
237
|
rubyforge_project:
|
238
|
-
rubygems_version: 1.8.
|
238
|
+
rubygems_version: 1.8.25
|
239
239
|
signing_key:
|
240
240
|
specification_version: 3
|
241
241
|
summary: Oracle enhanced adapter for ActiveRecord
|