activerecord-jdbc-adapter 1.0.3-java → 50.1-java
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 +7 -0
- data/.gitignore +33 -0
- data/.travis.yml +79 -0
- data/.yardopts +4 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +91 -0
- data/History.md +1191 -0
- data/LICENSE.txt +22 -17
- data/README.md +169 -0
- data/RUNNING_TESTS.md +127 -0
- data/Rakefile +294 -5
- data/Rakefile.jdbc +20 -0
- data/activerecord-jdbc-adapter.gemspec +55 -0
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +0 -5
- data/lib/arel/visitors/compat.rb +60 -0
- data/lib/arel/visitors/db2.rb +128 -6
- data/lib/arel/visitors/derby.rb +103 -10
- data/lib/arel/visitors/firebird.rb +79 -0
- data/lib/arel/visitors/h2.rb +25 -0
- data/lib/arel/visitors/hsqldb.rb +18 -10
- data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
- data/lib/arel/visitors/sql_server.rb +225 -0
- data/lib/arel/visitors/sql_server/ng42.rb +293 -0
- data/lib/arjdbc.rb +11 -21
- data/lib/arjdbc/abstract/connection_management.rb +35 -0
- data/lib/arjdbc/abstract/core.rb +64 -0
- data/lib/arjdbc/abstract/database_statements.rb +64 -0
- data/lib/arjdbc/abstract/statement_cache.rb +58 -0
- data/lib/arjdbc/abstract/transaction_support.rb +86 -0
- data/lib/arjdbc/db2.rb +3 -1
- data/lib/arjdbc/db2/adapter.rb +630 -250
- data/lib/arjdbc/db2/as400.rb +130 -0
- data/lib/arjdbc/db2/column.rb +167 -0
- data/lib/arjdbc/db2/connection_methods.rb +44 -0
- data/lib/arjdbc/derby.rb +1 -5
- data/lib/arjdbc/derby/active_record_patch.rb +13 -0
- data/lib/arjdbc/derby/adapter.rb +409 -217
- data/lib/arjdbc/derby/connection_methods.rb +16 -14
- data/lib/arjdbc/derby/schema_creation.rb +15 -0
- data/lib/arjdbc/discover.rb +62 -50
- data/lib/arjdbc/firebird.rb +3 -1
- data/lib/arjdbc/firebird/adapter.rb +365 -62
- data/lib/arjdbc/firebird/connection_methods.rb +23 -0
- data/lib/arjdbc/h2.rb +2 -3
- data/lib/arjdbc/h2/adapter.rb +273 -6
- data/lib/arjdbc/h2/connection_methods.rb +23 -8
- data/lib/arjdbc/hsqldb.rb +2 -3
- data/lib/arjdbc/hsqldb/adapter.rb +204 -77
- data/lib/arjdbc/hsqldb/connection_methods.rb +24 -10
- data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
- data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
- data/lib/arjdbc/informix.rb +4 -2
- data/lib/arjdbc/informix/adapter.rb +78 -54
- data/lib/arjdbc/informix/connection_methods.rb +8 -9
- data/lib/arjdbc/jdbc.rb +59 -2
- data/lib/arjdbc/jdbc/adapter.rb +356 -166
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +15 -0
- data/lib/arjdbc/jdbc/callbacks.rb +27 -18
- data/lib/arjdbc/jdbc/column.rb +79 -20
- data/lib/arjdbc/jdbc/connection.rb +5 -119
- data/lib/arjdbc/jdbc/connection_methods.rb +32 -4
- data/lib/arjdbc/jdbc/error.rb +65 -0
- data/lib/arjdbc/jdbc/extension.rb +41 -29
- data/lib/arjdbc/jdbc/java.rb +5 -6
- data/lib/arjdbc/jdbc/jdbc.rake +3 -126
- data/lib/arjdbc/jdbc/railtie.rb +2 -9
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
- data/lib/arjdbc/jdbc/type_cast.rb +166 -0
- data/lib/arjdbc/jdbc/type_converter.rb +35 -19
- data/lib/arjdbc/mssql.rb +6 -3
- data/lib/arjdbc/mssql/adapter.rb +630 -298
- data/lib/arjdbc/mssql/column.rb +200 -0
- data/lib/arjdbc/mssql/connection_methods.rb +66 -17
- data/lib/arjdbc/mssql/explain_support.rb +99 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +189 -50
- data/lib/arjdbc/mssql/lock_methods.rb +77 -0
- data/lib/arjdbc/mssql/types.rb +343 -0
- data/lib/arjdbc/mssql/utils.rb +82 -0
- data/lib/arjdbc/mysql.rb +2 -3
- data/lib/arjdbc/mysql/adapter.rb +86 -356
- data/lib/arjdbc/mysql/connection_methods.rb +159 -23
- data/lib/arjdbc/oracle/adapter.rb +714 -263
- data/lib/arjdbc/postgresql.rb +2 -3
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +24 -0
- data/lib/arjdbc/postgresql/adapter.rb +570 -400
- data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
- data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
- data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
- data/lib/arjdbc/postgresql/column.rb +51 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +57 -18
- data/lib/arjdbc/postgresql/name.rb +24 -0
- data/lib/arjdbc/postgresql/oid_types.rb +192 -0
- data/lib/arjdbc/railtie.rb +11 -0
- data/lib/arjdbc/sqlite3.rb +2 -3
- data/lib/arjdbc/sqlite3/adapter.rb +518 -198
- data/lib/arjdbc/sqlite3/connection_methods.rb +49 -24
- data/lib/arjdbc/sybase.rb +2 -2
- data/lib/arjdbc/sybase/adapter.rb +7 -6
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +52 -0
- data/lib/arjdbc/tasks/databases.rake +91 -0
- data/lib/arjdbc/tasks/databases3.rake +215 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
- data/lib/arjdbc/util/quoted_cache.rb +60 -0
- data/lib/arjdbc/util/serialized_attributes.rb +98 -0
- data/lib/arjdbc/util/table_copier.rb +110 -0
- data/lib/arjdbc/version.rb +1 -6
- data/lib/generators/jdbc/USAGE +9 -0
- data/lib/generators/jdbc/jdbc_generator.rb +8 -0
- data/lib/jdbc_adapter.rb +1 -1
- data/lib/jdbc_adapter/rake_tasks.rb +3 -2
- data/lib/jdbc_adapter/version.rb +2 -1
- data/pom.xml +114 -0
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/01-tomcat.rake +51 -0
- data/rakelib/02-test.rake +132 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/compile.rake +67 -22
- data/rakelib/db.rake +61 -0
- data/rakelib/rails.rake +204 -29
- data/src/java/arjdbc/ArJdbcModule.java +286 -0
- data/src/java/arjdbc/db2/DB2Module.java +76 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
- data/src/java/arjdbc/derby/DerbyModule.java +99 -243
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
- data/src/java/arjdbc/{jdbc/JdbcConnectionFactory.java → h2/H2Module.java} +20 -6
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +27 -12
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +7 -6
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +7 -29
- data/src/java/arjdbc/jdbc/Callable.java +44 -0
- data/src/java/arjdbc/jdbc/ConnectionFactory.java +132 -0
- data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +157 -0
- data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
- data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
- data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3622 -948
- data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +181 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +99 -81
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
- data/src/java/arjdbc/oracle/OracleModule.java +80 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +387 -17
- data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
- data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
- data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
- data/src/java/arjdbc/postgresql/PostgreSQLResult.java +184 -0
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +952 -0
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
- data/src/java/arjdbc/util/CallResultSet.java +826 -0
- data/src/java/arjdbc/util/DateTimeUtils.java +580 -0
- data/src/java/arjdbc/util/ObjectSupport.java +65 -0
- data/src/java/arjdbc/util/QuotingUtils.java +138 -0
- data/src/java/arjdbc/util/StringCache.java +63 -0
- data/src/java/arjdbc/util/StringHelper.java +159 -0
- metadata +245 -268
- data/History.txt +0 -369
- data/Manifest.txt +0 -180
- data/README.txt +0 -181
- data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
- data/lib/arel/engines/sql/compilers/db2_compiler.rb +0 -9
- data/lib/arel/engines/sql/compilers/derby_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/h2_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +0 -15
- data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +0 -46
- data/lib/arel/visitors/mssql.rb +0 -44
- data/lib/arjdbc/jdbc/compatibility.rb +0 -51
- data/lib/arjdbc/jdbc/core_ext.rb +0 -24
- data/lib/arjdbc/jdbc/discover.rb +0 -18
- data/lib/arjdbc/jdbc/driver.rb +0 -44
- data/lib/arjdbc/jdbc/missing_functionality_helper.rb +0 -87
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +0 -28
- data/lib/arjdbc/jdbc/require_driver.rb +0 -16
- data/lib/arjdbc/mimer.rb +0 -2
- data/lib/arjdbc/mimer/adapter.rb +0 -142
- data/lib/arjdbc/mssql/tsql_helper.rb +0 -61
- data/lib/arjdbc/oracle.rb +0 -3
- data/lib/arjdbc/oracle/connection_methods.rb +0 -11
- data/lib/pg.rb +0 -4
- data/rakelib/package.rake +0 -92
- data/rakelib/test.rake +0 -81
- data/src/java/arjdbc/jdbc/SQLBlock.java +0 -48
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +0 -127
- data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +0 -57
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +0 -64
- data/test/abstract_db_create.rb +0 -117
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -31
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +0 -25
- data/test/db/db2.rb +0 -11
- data/test/db/derby.rb +0 -12
- data/test/db/h2.rb +0 -11
- data/test/db/hsqldb.rb +0 -13
- data/test/db/informix.rb +0 -11
- data/test/db/jdbc.rb +0 -11
- data/test/db/jndi_config.rb +0 -40
- data/test/db/logger.rb +0 -3
- data/test/db/mssql.rb +0 -9
- data/test/db/mysql.rb +0 -10
- data/test/db/oracle.rb +0 -34
- data/test/db/postgres.rb +0 -9
- data/test/db/sqlite3.rb +0 -11
- data/test/db2_simple_test.rb +0 -66
- data/test/derby_migration_test.rb +0 -68
- data/test/derby_multibyte_test.rb +0 -12
- data/test/derby_simple_test.rb +0 -99
- data/test/generic_jdbc_connection_test.rb +0 -29
- data/test/h2_simple_test.rb +0 -41
- data/test/has_many_through.rb +0 -79
- data/test/helper.rb +0 -5
- data/test/hsqldb_simple_test.rb +0 -6
- data/test/informix_simple_test.rb +0 -48
- data/test/jdbc_common.rb +0 -25
- data/test/jndi_callbacks_test.rb +0 -40
- data/test/jndi_test.rb +0 -25
- data/test/manualTestDatabase.rb +0 -191
- data/test/models/add_not_null_column_to_table.rb +0 -12
- data/test/models/auto_id.rb +0 -18
- data/test/models/data_types.rb +0 -28
- data/test/models/entry.rb +0 -43
- data/test/models/mixed_case.rb +0 -25
- data/test/models/reserved_word.rb +0 -18
- data/test/models/string_id.rb +0 -18
- data/test/models/validates_uniqueness_of_string.rb +0 -19
- data/test/mssql_db_create_test.rb +0 -26
- data/test/mssql_identity_insert_test.rb +0 -19
- data/test/mssql_legacy_types_test.rb +0 -58
- data/test/mssql_limit_offset_test.rb +0 -136
- data/test/mssql_multibyte_test.rb +0 -18
- data/test/mssql_simple_test.rb +0 -55
- data/test/mysql_db_create_test.rb +0 -27
- data/test/mysql_info_test.rb +0 -113
- data/test/mysql_multibyte_test.rb +0 -10
- data/test/mysql_nonstandard_primary_key_test.rb +0 -42
- data/test/mysql_simple_test.rb +0 -49
- data/test/oracle_simple_test.rb +0 -18
- data/test/oracle_specific_test.rb +0 -83
- data/test/pick_rails_version.rb +0 -3
- data/test/postgres_db_create_test.rb +0 -32
- data/test/postgres_drop_db_test.rb +0 -16
- data/test/postgres_mixed_case_test.rb +0 -29
- data/test/postgres_nonseq_pkey_test.rb +0 -38
- data/test/postgres_reserved_test.rb +0 -22
- data/test/postgres_schema_search_path_test.rb +0 -44
- data/test/postgres_simple_test.rb +0 -51
- data/test/postgres_table_alias_length_test.rb +0 -15
- data/test/simple.rb +0 -546
- data/test/sqlite3_simple_test.rb +0 -233
- data/test/sybase_jtds_simple_test.rb +0 -28
|
@@ -1,47 +1,59 @@
|
|
|
1
1
|
module ArJdbc
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
# ActiveRecord::ConnectionAdapters::AbstractAdapter.
|
|
6
|
-
# declare your extension, you provide a block that detects when a
|
|
7
|
-
# database configured to use the extension is present and loads the
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# instance of it with your extension module.
|
|
2
|
+
|
|
3
|
+
# Defines an AR-JDBC extension. An extension consists of a declaration using
|
|
4
|
+
# this method and an ArJdbc::XYZ module that contains implementation and
|
|
5
|
+
# overrides for methods in ActiveRecord::ConnectionAdapters::AbstractAdapter.
|
|
6
|
+
# When you declare your extension, you provide a block that detects when a
|
|
7
|
+
# database configured to use the extension is present and loads the necessary
|
|
8
|
+
# code for it. AR-JDBC will patch the code into the base JdbcAdapter by
|
|
9
|
+
# extending an instance of it with your extension module.
|
|
11
10
|
#
|
|
12
|
-
# +name+
|
|
13
|
-
# defined under the +ArJdbc+ module.
|
|
11
|
+
# +name+ the name of a module to be defined under the +ArJdbc+ module.
|
|
14
12
|
#
|
|
15
|
-
# +block+ should be a one- or two-arity block that receives the
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# argument.
|
|
13
|
+
# +block+ should be a one- or two-arity block that receives the dialect name
|
|
14
|
+
# or driver class name as the first argument, and optionally the whole
|
|
15
|
+
# database configuration hash as a second argument
|
|
19
16
|
#
|
|
20
17
|
# Example:
|
|
21
18
|
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
# true
|
|
27
|
-
# end
|
|
19
|
+
# ArJdbc.extension :FRoB do |name|
|
|
20
|
+
# if name =~ /frob/i
|
|
21
|
+
# require 'arjdbc/frob' # contains ArJdbc::FRoB
|
|
22
|
+
# true
|
|
28
23
|
# end
|
|
29
|
-
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
def self.extension(name, &block)
|
|
30
27
|
if const_defined?(name)
|
|
31
28
|
mod = const_get(name)
|
|
32
29
|
else
|
|
33
30
|
mod = const_set(name, Module.new)
|
|
34
31
|
end
|
|
35
32
|
(class << mod; self; end).instance_eval do
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
block.call(name, config) ? mod : false
|
|
42
|
-
end
|
|
33
|
+
define_method :adapter_matcher do |_name, config|
|
|
34
|
+
if block.arity == 1
|
|
35
|
+
block.call(_name) ? mod : false
|
|
36
|
+
else
|
|
37
|
+
block.call(_name, config) ? mod : false
|
|
43
38
|
end
|
|
44
39
|
end
|
|
40
|
+
end unless mod.respond_to?(:adapter_matcher)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
def self.discover_extensions
|
|
45
|
+
if defined?(Gem) && Gem.respond_to?(:find_files)
|
|
46
|
+
files = Gem.find_files('arjdbc/discover')
|
|
47
|
+
else
|
|
48
|
+
files = $LOAD_PATH.map do |path|
|
|
49
|
+
discover = File.join(path, 'arjdbc', 'discover.rb')
|
|
50
|
+
File.exist?(discover) ? discover : nil
|
|
51
|
+
end.compact
|
|
52
|
+
end
|
|
53
|
+
files.each do |file|
|
|
54
|
+
puts "Loading AR-JDBC extension #{file}" if $DEBUG
|
|
55
|
+
require file
|
|
45
56
|
end
|
|
46
57
|
end
|
|
58
|
+
|
|
47
59
|
end
|
data/lib/arjdbc/jdbc/java.rb
CHANGED
|
@@ -4,11 +4,10 @@ require 'arjdbc/jdbc/adapter_java'
|
|
|
4
4
|
module ActiveRecord
|
|
5
5
|
module ConnectionAdapters
|
|
6
6
|
module Jdbc
|
|
7
|
-
|
|
8
|
-
DriverManager =
|
|
9
|
-
|
|
7
|
+
# @private
|
|
8
|
+
DriverManager = ::Java::JavaSql::DriverManager
|
|
9
|
+
# @private
|
|
10
|
+
Types = ::Java::JavaSql::Types
|
|
10
11
|
end
|
|
11
|
-
|
|
12
|
-
java_import "arjdbc.jdbc.JdbcConnectionFactory"
|
|
13
12
|
end
|
|
14
|
-
end
|
|
13
|
+
end
|
data/lib/arjdbc/jdbc/jdbc.rake
CHANGED
|
@@ -1,127 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
task_name = Hash === args.first ? args.first.keys[0] : args.first
|
|
3
|
-
existing_task = Rake.application.lookup task_name
|
|
4
|
-
if existing_task
|
|
5
|
-
class << existing_task
|
|
6
|
-
public :instance_variable_set
|
|
7
|
-
attr_reader :actions
|
|
8
|
-
end
|
|
9
|
-
existing_task.instance_variable_set "@prerequisites", FileList[]
|
|
10
|
-
existing_task.actions.shift
|
|
11
|
-
enhancements = existing_task.actions
|
|
12
|
-
existing_task.instance_variable_set "@actions", []
|
|
13
|
-
end
|
|
14
|
-
redefined_task = task(*args, &block)
|
|
15
|
-
enhancements.each {|enhancement| redefined_task.actions << enhancement}
|
|
16
|
-
end
|
|
1
|
+
load 'arjdbc/tasks.rb'
|
|
17
2
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
namespace :db do
|
|
23
|
-
redefine_task :create => :rails_env do
|
|
24
|
-
create_database(ActiveRecord::Base.configurations[rails_env])
|
|
25
|
-
end
|
|
26
|
-
task :create => :load_config if Rake.application.lookup(:load_config)
|
|
27
|
-
|
|
28
|
-
redefine_task :drop => :environment do
|
|
29
|
-
config = ActiveRecord::Base.configurations[rails_env]
|
|
30
|
-
begin
|
|
31
|
-
db = find_database_name(config)
|
|
32
|
-
ActiveRecord::Base.connection.drop_database(db)
|
|
33
|
-
rescue
|
|
34
|
-
drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
task :drop => :load_config if Rake.application.lookup(:load_config)
|
|
38
|
-
|
|
39
|
-
namespace :create do
|
|
40
|
-
task :all => :rails_env
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
namespace :drop do
|
|
44
|
-
task :all => :environment
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
class << self
|
|
48
|
-
alias_method :previous_create_database, :create_database
|
|
49
|
-
alias_method :previous_drop_database, :drop_database
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def find_database_name(config)
|
|
53
|
-
db = config['database']
|
|
54
|
-
if config['adapter'] =~ /postgresql/i
|
|
55
|
-
config = config.dup
|
|
56
|
-
if config['url']
|
|
57
|
-
db = config['url'][/\/([^\/]*)$/, 1]
|
|
58
|
-
config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
|
|
59
|
-
else
|
|
60
|
-
db = config['database']
|
|
61
|
-
config['database'] = 'postgres'
|
|
62
|
-
end
|
|
63
|
-
ActiveRecord::Base.establish_connection(config)
|
|
64
|
-
else
|
|
65
|
-
ActiveRecord::Base.establish_connection(config)
|
|
66
|
-
db = ActiveRecord::Base.connection.database_name
|
|
67
|
-
end
|
|
68
|
-
db
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def create_database(config)
|
|
72
|
-
begin
|
|
73
|
-
ActiveRecord::Base.establish_connection(config)
|
|
74
|
-
ActiveRecord::Base.connection
|
|
75
|
-
rescue
|
|
76
|
-
begin
|
|
77
|
-
if url = config['url'] && url =~ /^(.*(?<!\/)\/)(?=\w)/
|
|
78
|
-
url = $1
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
|
|
82
|
-
ActiveRecord::Base.connection.create_database(config['database'])
|
|
83
|
-
ActiveRecord::Base.establish_connection(config)
|
|
84
|
-
rescue => e
|
|
85
|
-
raise e unless config['adapter'] =~ /mysql|postgresql|sqlite/
|
|
86
|
-
previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def drop_database(config)
|
|
92
|
-
previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
namespace :structure do
|
|
96
|
-
redefine_task :dump => :environment do
|
|
97
|
-
abcs = ActiveRecord::Base.configurations
|
|
98
|
-
ActiveRecord::Base.establish_connection(abcs[rails_env])
|
|
99
|
-
File.open("db/#{rails_env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
|
|
100
|
-
if ActiveRecord::Base.connection.supports_migrations?
|
|
101
|
-
File.open("db/#{rails_env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
namespace :test do
|
|
107
|
-
redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
|
108
|
-
abcs = ActiveRecord::Base.configurations
|
|
109
|
-
abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
|
|
110
|
-
ActiveRecord::Base.establish_connection(abcs["test"])
|
|
111
|
-
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
|
|
112
|
-
IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
|
|
113
|
-
begin
|
|
114
|
-
ActiveRecord::Base.connection.execute(ddl.chomp(';'))
|
|
115
|
-
rescue Exception => ex
|
|
116
|
-
puts ex.message
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
redefine_task :purge => :environment do
|
|
122
|
-
abcs = ActiveRecord::Base.configurations
|
|
123
|
-
db = find_database_name(abcs['test'])
|
|
124
|
-
ActiveRecord::Base.connection.recreate_database(db)
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
3
|
+
require 'arjdbc'
|
|
4
|
+
ArJdbc.deprecate "load 'arjdbc/tasks.rb' (or 'arjdbc/tasks/database.rake') instead of 'arjdbc/jdbc/jdbc.rake'"
|
data/lib/arjdbc/jdbc/railtie.rb
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
require '
|
|
2
|
-
|
|
3
|
-
module ::ArJdbc
|
|
4
|
-
class Railtie < ::Rails::Railtie
|
|
5
|
-
rake_tasks do
|
|
6
|
-
load File.expand_path('../rake_tasks.rb', __FILE__)
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
1
|
+
require 'arjdbc/railtie'
|
|
2
|
+
ArJdbc.deprecate "require 'arjdbc/railtie' instead of 'arjdbc/jdbc/railtie'"
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# rails tasks already defined; load the override tasks now
|
|
5
|
-
load jdbc_rakefile
|
|
6
|
-
else
|
|
7
|
-
# rails tasks not loaded yet; load as an import
|
|
8
|
-
Rake.application.add_import(jdbc_rakefile)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
1
|
+
load 'arjdbc/tasks.rb'
|
|
2
|
+
|
|
3
|
+
ArJdbc.deprecate "load 'arjdbc/tasks.rb' instead of 'arjdbc/jdbc/rake_tasks.rb'"
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'active_record/connection_adapters/column'
|
|
2
|
+
|
|
3
|
+
module ActiveRecord::ConnectionAdapters
|
|
4
|
+
module Jdbc
|
|
5
|
+
# Type casting methods taken from AR 4.1's Column class.
|
|
6
|
+
# @private Simply to quickly "hack-in" 4.2 compatibility.
|
|
7
|
+
module TypeCast
|
|
8
|
+
TRUE_VALUES = Column::TRUE_VALUES if Column.const_defined?(:TRUE_VALUES)
|
|
9
|
+
FALSE_VALUES = if defined?(ActiveModel::Type::Boolean::FALSE_VALUES)
|
|
10
|
+
ActiveModel::Type::Boolean::FALSE_VALUES
|
|
11
|
+
else
|
|
12
|
+
Column::FALSE_VALUES
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
#module Format
|
|
16
|
+
ISO_DATE = if defined?(ActiveModel::Type::Date::ISO_DATE)
|
|
17
|
+
ActiveModel::Type::Date::ISO_DATE
|
|
18
|
+
else
|
|
19
|
+
Column::Format::ISO_DATE
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
ISO_DATETIME = if defined?(ActiveModel::Type::Helpers::TimeValue::ISO_DATETIME)
|
|
23
|
+
ActiveModel::Type::Helpers::TimeValue::ISO_DATETIME
|
|
24
|
+
else
|
|
25
|
+
Column::Format::ISO_DATETIME
|
|
26
|
+
end
|
|
27
|
+
#end
|
|
28
|
+
|
|
29
|
+
# Used to convert from BLOBs to Strings
|
|
30
|
+
def binary_to_string(value)
|
|
31
|
+
value
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def value_to_date(value)
|
|
35
|
+
if value.is_a?(String)
|
|
36
|
+
return nil if value.empty?
|
|
37
|
+
fast_string_to_date(value) || fallback_string_to_date(value)
|
|
38
|
+
elsif value.respond_to?(:to_date)
|
|
39
|
+
value.to_date
|
|
40
|
+
else
|
|
41
|
+
value
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def string_to_time(string)
|
|
46
|
+
return string unless string.is_a?(String)
|
|
47
|
+
return nil if string.empty?
|
|
48
|
+
return string if string =~ /^-?infinity$/.freeze
|
|
49
|
+
|
|
50
|
+
fast_string_to_time(string) || fallback_string_to_time(string)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def string_to_dummy_time(string)
|
|
54
|
+
return string unless string.is_a?(String)
|
|
55
|
+
return nil if string.empty?
|
|
56
|
+
|
|
57
|
+
dummy_time_string = "2000-01-01 #{string}"
|
|
58
|
+
|
|
59
|
+
fast_string_to_time(dummy_time_string) || begin
|
|
60
|
+
time_hash = Date._parse(dummy_time_string)
|
|
61
|
+
return nil if time_hash[:hour].nil?
|
|
62
|
+
new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# convert something to a boolean
|
|
67
|
+
def value_to_boolean(value)
|
|
68
|
+
if value.is_a?(String) && value.empty?
|
|
69
|
+
nil
|
|
70
|
+
else
|
|
71
|
+
TRUE_VALUES.include?(value)
|
|
72
|
+
end
|
|
73
|
+
end if const_defined?(:TRUE_VALUES) # removed on AR 5.0
|
|
74
|
+
|
|
75
|
+
# convert something to a boolean
|
|
76
|
+
def value_to_boolean(value)
|
|
77
|
+
if value.is_a?(String) && value.empty?
|
|
78
|
+
nil
|
|
79
|
+
else
|
|
80
|
+
! FALSE_VALUES.include?(value)
|
|
81
|
+
end
|
|
82
|
+
end unless const_defined?(:TRUE_VALUES)
|
|
83
|
+
|
|
84
|
+
# Used to convert values to integer.
|
|
85
|
+
# handle the case when an integer column is used to store boolean values
|
|
86
|
+
def value_to_integer(value)
|
|
87
|
+
case value
|
|
88
|
+
when TrueClass, FalseClass
|
|
89
|
+
value ? 1 : 0
|
|
90
|
+
else
|
|
91
|
+
value.to_i rescue nil
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# convert something to a BigDecimal
|
|
96
|
+
def value_to_decimal(value)
|
|
97
|
+
# Using .class is faster than .is_a? and
|
|
98
|
+
# subclasses of BigDecimal will be handled
|
|
99
|
+
# in the else clause
|
|
100
|
+
if value.class == BigDecimal
|
|
101
|
+
value
|
|
102
|
+
elsif value.respond_to?(:to_d)
|
|
103
|
+
value.to_d
|
|
104
|
+
else
|
|
105
|
+
value.to_s.to_d
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
protected
|
|
110
|
+
# '0.123456' -> 123456
|
|
111
|
+
# '1.123456' -> 123456
|
|
112
|
+
def microseconds(time)
|
|
113
|
+
time[:sec_fraction] ? (time[:sec_fraction] * 1_000_000).to_i : 0
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def new_date(year, mon, mday)
|
|
117
|
+
if year && year != 0
|
|
118
|
+
Date.new(year, mon, mday) rescue nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def new_time(year, mon, mday, hour, min, sec, microsec, offset = nil)
|
|
123
|
+
# Treat 0000-00-00 00:00:00 as nil.
|
|
124
|
+
return nil if year.nil? || (year == 0 && mon == 0 && mday == 0)
|
|
125
|
+
|
|
126
|
+
if offset
|
|
127
|
+
time = Time.utc(year, mon, mday, hour, min, sec, microsec) rescue nil
|
|
128
|
+
return nil unless time
|
|
129
|
+
|
|
130
|
+
time -= offset
|
|
131
|
+
ActiveRecord::Base.default_timezone == :utc ? time : time.getlocal
|
|
132
|
+
else
|
|
133
|
+
timezone = ActiveRecord::Base.default_timezone
|
|
134
|
+
Time.public_send(timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def fast_string_to_date(string)
|
|
139
|
+
if string =~ ISO_DATE
|
|
140
|
+
new_date $1.to_i, $2.to_i, $3.to_i
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Doesn't handle time zones.
|
|
145
|
+
def fast_string_to_time(string)
|
|
146
|
+
if string =~ ISO_DATETIME
|
|
147
|
+
microsec = ($7.to_r * 1_000_000).to_i
|
|
148
|
+
new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def fallback_string_to_date(string)
|
|
153
|
+
new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def fallback_string_to_time(string)
|
|
157
|
+
time_hash = Date._parse(string)
|
|
158
|
+
time_hash[:sec_fraction] = microseconds(time_hash)
|
|
159
|
+
time_hash[:year] *= -1 if time_hash[:zone] == 'BC'
|
|
160
|
+
|
|
161
|
+
new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction, :offset))
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -5,10 +5,23 @@ module ActiveRecord
|
|
|
5
5
|
# but apparently a database driver can return multiple types for a given
|
|
6
6
|
# java.sql.Types constant. So this type converter uses some heuristics to try to pick
|
|
7
7
|
# the best (most common) type to use. It's not great, it would be better to just
|
|
8
|
-
# delegate to each database's
|
|
8
|
+
# delegate to each database's existing AR adapter's native_database_types method, but I
|
|
9
9
|
# wanted to try to do this in a way that didn't pull in all the other adapters as
|
|
10
|
-
# dependencies.
|
|
10
|
+
# dependencies. Improvements appreciated.
|
|
11
11
|
class JdbcTypeConverter
|
|
12
|
+
|
|
13
|
+
# @private
|
|
14
|
+
TEXT_TYPES = [ Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB ]
|
|
15
|
+
private_constant :TEXT_TYPES if respond_to? :private_constant
|
|
16
|
+
|
|
17
|
+
# @private
|
|
18
|
+
FLOAT_TYPES = [ Jdbc::Types::FLOAT, Jdbc::Types::DOUBLE, Jdbc::Types::REAL ]
|
|
19
|
+
private_constant :FLOAT_TYPES if respond_to? :private_constant
|
|
20
|
+
|
|
21
|
+
# @private
|
|
22
|
+
BINARY_TYPES = [ Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB ]
|
|
23
|
+
private_constant :BINARY_TYPES if respond_to? :private_constant
|
|
24
|
+
|
|
12
25
|
# The basic ActiveRecord types, mapped to an array of procs that are used to #select
|
|
13
26
|
# the best type. The procs are used as selectors in order until there is only one
|
|
14
27
|
# type left. If all the selectors are applied and there is still more than one
|
|
@@ -18,7 +31,7 @@ module ActiveRecord
|
|
|
18
31
|
lambda {|r| r['type_name'] =~ /^varchar/i},
|
|
19
32
|
lambda {|r| r['type_name'] =~ /^varchar$/i},
|
|
20
33
|
lambda {|r| r['type_name'] =~ /varying/i}],
|
|
21
|
-
:text => [ lambda {|r|
|
|
34
|
+
:text => [ lambda {|r| TEXT_TYPES.include?(r['data_type'].to_i)},
|
|
22
35
|
lambda {|r| r['type_name'] =~ /^text$/i}, # For Informix
|
|
23
36
|
lambda {|r| r['type_name'] =~ /sub_type 1$/i}, # For FireBird
|
|
24
37
|
lambda {|r| r['type_name'] =~ /^(text|clob)$/i},
|
|
@@ -34,8 +47,8 @@ module ActiveRecord
|
|
|
34
47
|
lambda {|r| r['type_name'] =~ /^number$/i},
|
|
35
48
|
lambda {|r| r['type_name'] =~ /^real$/i},
|
|
36
49
|
lambda {|r| r['precision'] == '38'},
|
|
37
|
-
lambda {|r| r['data_type'] ==
|
|
38
|
-
:float => [ lambda {|r|
|
|
50
|
+
lambda {|r| r['data_type'].to_i == Jdbc::Types::DECIMAL}],
|
|
51
|
+
:float => [ lambda {|r| FLOAT_TYPES.include?(r['data_type'].to_i)},
|
|
39
52
|
lambda {|r| r['data_type'].to_i == Jdbc::Types::REAL}, #Prefer REAL to DOUBLE for Postgresql
|
|
40
53
|
lambda {|r| r['type_name'] =~ /^float/i},
|
|
41
54
|
lambda {|r| r['type_name'] =~ /^double$/i},
|
|
@@ -44,30 +57,34 @@ module ActiveRecord
|
|
|
44
57
|
:datetime => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
|
|
45
58
|
lambda {|r| r['type_name'] =~ /^datetime$/i},
|
|
46
59
|
lambda {|r| r['type_name'] =~ /^timestamp$/i},
|
|
60
|
+
lambda {|r| r['type_name'] =~ /^datetime.+/i},
|
|
47
61
|
lambda {|r| r['type_name'] =~ /^date/i},
|
|
48
62
|
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
|
49
63
|
:timestamp => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
|
|
50
64
|
lambda {|r| r['type_name'] =~ /^timestamp$/i},
|
|
51
|
-
lambda {|r| r['type_name'] =~ /^datetime
|
|
65
|
+
lambda {|r| r['type_name'] =~ /^datetime$/i},
|
|
66
|
+
lambda {|r| r['type_name'] =~ /^datetime.+/i},
|
|
52
67
|
lambda {|r| r['type_name'] =~ /^date/i},
|
|
53
68
|
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
|
54
69
|
:time => [ lambda {|r| Jdbc::Types::TIME == r['data_type'].to_i},
|
|
55
70
|
lambda {|r| r['type_name'] =~ /^time$/i},
|
|
56
|
-
lambda {|r| r['type_name'] =~ /^datetime
|
|
71
|
+
lambda {|r| r['type_name'] =~ /^datetime$/i},
|
|
72
|
+
lambda {|r| r['type_name'] =~ /^datetime.+/i}, # For Informix
|
|
57
73
|
lambda {|r| r['type_name'] =~ /^date/i},
|
|
58
74
|
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
|
59
75
|
:date => [ lambda {|r| Jdbc::Types::DATE == r['data_type'].to_i},
|
|
60
76
|
lambda {|r| r['type_name'] =~ /^date$/i},
|
|
61
77
|
lambda {|r| r['type_name'] =~ /^date/i},
|
|
62
78
|
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver3
|
|
63
|
-
:binary => [ lambda {|r|
|
|
79
|
+
:binary => [ lambda {|r| BINARY_TYPES.include?(r['data_type'].to_i)},
|
|
64
80
|
lambda {|r| r['type_name'] =~ /^blob/i},
|
|
65
81
|
lambda {|r| r['type_name'] =~ /sub_type 0$/i}, # For FireBird
|
|
66
82
|
lambda {|r| r['type_name'] =~ /^varbinary$/i}, # We want this sucker for Mimer
|
|
67
83
|
lambda {|r| r['type_name'] =~ /^binary$/i}, ],
|
|
68
|
-
:boolean => [ lambda {|r|
|
|
84
|
+
:boolean => [ lambda {|r| Jdbc::Types::BIT == r['data_type'].to_i && r['precision'].to_i == 1},
|
|
85
|
+
lambda {|r| Jdbc::Types::TINYINT == r['data_type'].to_i},
|
|
69
86
|
lambda {|r| r['type_name'] =~ /^bool/i},
|
|
70
|
-
lambda {|r| r['data_type'] ==
|
|
87
|
+
lambda {|r| r['data_type'].to_i == Jdbc::Types::BIT},
|
|
71
88
|
lambda {|r| r['type_name'] =~ /^tinyint$/i},
|
|
72
89
|
lambda {|r| r['type_name'] =~ /^decimal$/i},
|
|
73
90
|
lambda {|r| r['type_name'] =~ /^integer$/i}]
|
|
@@ -87,25 +104,24 @@ module ActiveRecord
|
|
|
87
104
|
set_limit_to_nonzero_precision(type_map[k], row)
|
|
88
105
|
end
|
|
89
106
|
|
|
90
|
-
AR_TO_JDBC_TYPES.keys.each do |
|
|
91
|
-
typerow = choose_type(
|
|
92
|
-
type_map[
|
|
93
|
-
case
|
|
107
|
+
AR_TO_JDBC_TYPES.keys.each do |ar_type|
|
|
108
|
+
typerow = choose_type(ar_type)
|
|
109
|
+
type_map[ar_type] = { :name => typerow['type_name'].downcase }
|
|
110
|
+
case ar_type
|
|
94
111
|
when :integer, :string, :decimal
|
|
95
|
-
set_limit_to_nonzero_precision(type_map[
|
|
112
|
+
set_limit_to_nonzero_precision(type_map[ar_type], typerow)
|
|
96
113
|
when :boolean
|
|
97
|
-
type_map[
|
|
114
|
+
type_map[ar_type][:limit] = 1
|
|
98
115
|
end
|
|
99
116
|
end
|
|
100
117
|
type_map
|
|
101
118
|
end
|
|
102
119
|
|
|
103
120
|
def choose_type(ar_type)
|
|
104
|
-
procs = AR_TO_JDBC_TYPES[ar_type]
|
|
105
121
|
types = @types
|
|
106
|
-
|
|
122
|
+
AR_TO_JDBC_TYPES[ar_type].each do |proc|
|
|
107
123
|
new_types = types.reject {|r| r["data_type"].to_i == Jdbc::Types::OTHER}
|
|
108
|
-
new_types = new_types.select(&
|
|
124
|
+
new_types = new_types.select(&proc)
|
|
109
125
|
new_types = new_types.inject([]) do |typs,t|
|
|
110
126
|
typs << t unless typs.detect {|el| el['type_name'] == t['type_name']}
|
|
111
127
|
typs
|