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
data/lib/arjdbc/mysql.rb
CHANGED
data/lib/arjdbc/mysql/adapter.rb
CHANGED
|
@@ -1,402 +1,132 @@
|
|
|
1
|
+
ArJdbc.load_java_part :MySQL
|
|
2
|
+
|
|
3
|
+
require 'bigdecimal'
|
|
4
|
+
require 'active_record/connection_adapters/abstract_mysql_adapter'
|
|
1
5
|
require 'active_record/connection_adapters/abstract/schema_definitions'
|
|
6
|
+
require 'arjdbc/abstract/core'
|
|
7
|
+
require 'arjdbc/abstract/connection_management'
|
|
8
|
+
require 'arjdbc/abstract/database_statements'
|
|
9
|
+
require 'arjdbc/abstract/statement_cache'
|
|
10
|
+
require 'arjdbc/abstract/transaction_support'
|
|
2
11
|
|
|
3
|
-
module
|
|
4
|
-
module
|
|
5
|
-
|
|
6
|
-
|
|
12
|
+
module ActiveRecord
|
|
13
|
+
module ConnectionAdapters
|
|
14
|
+
AbstractMysqlAdapter.class_eval do
|
|
15
|
+
include ArJdbc::Abstract::Core # to have correct initialize() super
|
|
7
16
|
end
|
|
8
17
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
18
|
+
# Remove any vestiges of core/Ruby MySQL adapter
|
|
19
|
+
remove_const(:Mysql2Adapter) if const_defined?(:Mysql2Adapter)
|
|
12
20
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
21
|
+
class Mysql2Adapter < AbstractMysqlAdapter
|
|
22
|
+
ADAPTER_NAME = 'Mysql2'.freeze
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
def extract_default(default)
|
|
19
|
-
if sql_type =~ /blob/i || type == :text
|
|
20
|
-
if default.blank?
|
|
21
|
-
return null ? nil : ''
|
|
22
|
-
else
|
|
23
|
-
raise ArgumentError, "#{type} columns cannot have a default value: #{default.inspect}"
|
|
24
|
-
end
|
|
25
|
-
elsif missing_default_forged_as_empty_string?(default)
|
|
26
|
-
nil
|
|
27
|
-
else
|
|
28
|
-
super
|
|
29
|
-
end
|
|
30
|
-
end
|
|
24
|
+
include Jdbc::ConnectionPoolCallbacks
|
|
31
25
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
include ArJdbc::Abstract::ConnectionManagement
|
|
27
|
+
include ArJdbc::Abstract::DatabaseStatements
|
|
28
|
+
# NOTE: do not include MySQL::DatabaseStatements
|
|
29
|
+
include ArJdbc::Abstract::StatementCache
|
|
30
|
+
include ArJdbc::Abstract::TransactionSupport
|
|
36
31
|
|
|
37
|
-
|
|
38
|
-
return :boolean if field_type =~ /tinyint\(1\)|bit/i
|
|
39
|
-
return :string if field_type =~ /enum/i
|
|
40
|
-
super
|
|
41
|
-
end
|
|
32
|
+
include ArJdbc::MySQL
|
|
42
33
|
|
|
43
|
-
def
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
when /tiny/i
|
|
48
|
-
255
|
|
49
|
-
when /medium/i
|
|
50
|
-
16777215
|
|
51
|
-
when /long/i
|
|
52
|
-
2147483647 # mysql only allows 2^31-1, not 2^32-1, somewhat inconsistently with the tiny/medium/normal cases
|
|
53
|
-
else
|
|
54
|
-
nil # we could return 65535 here, but we leave it undecorated by default
|
|
55
|
-
end
|
|
56
|
-
when /^bigint/i; 8
|
|
57
|
-
when /^int/i; 4
|
|
58
|
-
when /^mediumint/i; 3
|
|
59
|
-
when /^smallint/i; 2
|
|
60
|
-
when /^tinyint/i; 1
|
|
61
|
-
when /^(datetime|date|timestamp)/
|
|
62
|
-
nil
|
|
63
|
-
else
|
|
64
|
-
super
|
|
65
|
-
end
|
|
34
|
+
def initialize(connection, logger, config)
|
|
35
|
+
super(connection, logger, nil, config)
|
|
36
|
+
@prepared_statements = false unless config.key?(:prepared_statements)
|
|
37
|
+
# configure_connection taken care of at ArJdbc::Abstract::Core
|
|
66
38
|
end
|
|
67
39
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# default (string) but we can for others (integer, datetime, boolean,
|
|
71
|
-
# and the rest).
|
|
72
|
-
#
|
|
73
|
-
# Test whether the column has default '', is not null, and is not
|
|
74
|
-
# a type allowing default ''.
|
|
75
|
-
def missing_default_forged_as_empty_string?(default)
|
|
76
|
-
type != :string && !null && default == ''
|
|
40
|
+
def supports_json?
|
|
41
|
+
!mariadb? && version >= '5.7.8'
|
|
77
42
|
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def modify_types(tp)
|
|
81
|
-
tp[:primary_key] = "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
|
|
82
|
-
tp[:integer] = { :name => 'int', :limit => 4 }
|
|
83
|
-
tp[:decimal] = { :name => "decimal" }
|
|
84
|
-
tp[:timestamp] = { :name => "datetime" }
|
|
85
|
-
tp[:datetime][:limit] = nil
|
|
86
|
-
tp
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def adapter_name #:nodoc:
|
|
90
|
-
'MySQL'
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def arel2_visitors
|
|
94
|
-
{'jdbcmysql' => ::Arel::Visitors::MySQL}
|
|
95
|
-
end
|
|
96
43
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key)
|
|
102
|
-
where_sql
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# QUOTING ==================================================
|
|
106
|
-
|
|
107
|
-
def quote(value, column = nil)
|
|
108
|
-
return value.quoted_id if value.respond_to?(:quoted_id)
|
|
109
|
-
|
|
110
|
-
if column && column.type == :primary_key
|
|
111
|
-
value.to_s
|
|
112
|
-
elsif column && String === value && column.type == :binary && column.class.respond_to?(:string_to_binary)
|
|
113
|
-
s = column.class.string_to_binary(value).unpack("H*")[0]
|
|
114
|
-
"x'#{s}'"
|
|
115
|
-
elsif BigDecimal === value
|
|
116
|
-
"'#{value.to_s("F")}'"
|
|
117
|
-
else
|
|
118
|
-
super
|
|
44
|
+
def supports_comments?
|
|
45
|
+
true
|
|
119
46
|
end
|
|
120
|
-
end
|
|
121
47
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def quoted_false
|
|
127
|
-
"0"
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def begin_db_transaction #:nodoc:
|
|
131
|
-
@connection.begin
|
|
132
|
-
rescue Exception
|
|
133
|
-
# Transactions aren't supported
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def commit_db_transaction #:nodoc:
|
|
137
|
-
@connection.commit
|
|
138
|
-
rescue Exception
|
|
139
|
-
# Transactions aren't supported
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def rollback_db_transaction #:nodoc:
|
|
143
|
-
@connection.rollback
|
|
144
|
-
rescue Exception
|
|
145
|
-
# Transactions aren't supported
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def supports_savepoints? #:nodoc:
|
|
149
|
-
true
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def create_savepoint
|
|
153
|
-
execute("SAVEPOINT #{current_savepoint_name}")
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def rollback_to_savepoint
|
|
157
|
-
execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def release_savepoint
|
|
161
|
-
execute("RELEASE SAVEPOINT #{current_savepoint_name}")
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def disable_referential_integrity(&block) #:nodoc:
|
|
165
|
-
old = select_value("SELECT @@FOREIGN_KEY_CHECKS")
|
|
166
|
-
begin
|
|
167
|
-
update("SET FOREIGN_KEY_CHECKS = 0")
|
|
168
|
-
yield
|
|
169
|
-
ensure
|
|
170
|
-
update("SET FOREIGN_KEY_CHECKS = #{old}")
|
|
48
|
+
def supports_comments_in_create?
|
|
49
|
+
true
|
|
171
50
|
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
# SCHEMA STATEMENTS ========================================
|
|
175
51
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
sql = "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'"
|
|
179
|
-
else
|
|
180
|
-
sql = "SHOW TABLES"
|
|
52
|
+
def supports_savepoints?
|
|
53
|
+
true
|
|
181
54
|
end
|
|
182
55
|
|
|
183
|
-
|
|
184
|
-
table.delete('Table_type')
|
|
56
|
+
# HELPER METHODS ===========================================
|
|
185
57
|
|
|
186
|
-
|
|
58
|
+
# Reloading the type map in abstract/statement_cache.rb blows up postgres
|
|
59
|
+
def clear_cache!
|
|
60
|
+
reload_type_map
|
|
61
|
+
super
|
|
62
|
+
end
|
|
187
63
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
64
|
+
def each_hash(result) # :nodoc:
|
|
65
|
+
if block_given?
|
|
66
|
+
# FIXME: This is C in mysql2 gem and I just made simplest Ruby
|
|
67
|
+
result.each do |row|
|
|
68
|
+
new_hash = {}
|
|
69
|
+
row.each { |k, v| new_hash[k.to_sym] = v }
|
|
70
|
+
yield new_hash
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
to_enum(:each_hash, result)
|
|
192
74
|
end
|
|
193
75
|
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def recreate_database(name, options = {}) #:nodoc:
|
|
197
|
-
drop_database(name)
|
|
198
|
-
create_database(name, options)
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def character_set(options) #:nodoc:
|
|
202
|
-
str = "CHARACTER SET `#{options[:charset] || 'utf8'}`"
|
|
203
|
-
str += " COLLATE `#{options[:collation]}`" if options[:collation]
|
|
204
|
-
str
|
|
205
|
-
end
|
|
206
|
-
private :character_set
|
|
207
|
-
|
|
208
|
-
def create_database(name, options = {}) #:nodoc:
|
|
209
|
-
execute "CREATE DATABASE `#{name}` DEFAULT #{character_set(options)}"
|
|
210
|
-
end
|
|
211
76
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def current_database
|
|
217
|
-
select_one("SELECT DATABASE() as db")["db"]
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def create_table(name, options = {}) #:nodoc:
|
|
221
|
-
super(name, {:options => "ENGINE=InnoDB #{character_set(options)}"}.merge(options))
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
def rename_table(name, new_name)
|
|
225
|
-
execute "RENAME TABLE #{quote_table_name(name)} TO #{quote_table_name(new_name)}"
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def add_column(table_name, column_name, type, options = {})
|
|
229
|
-
add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
|
230
|
-
add_column_options!(add_column_sql, options)
|
|
231
|
-
add_column_position!(add_column_sql, options)
|
|
232
|
-
execute(add_column_sql)
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def change_column_default(table_name, column_name, default) #:nodoc:
|
|
236
|
-
column = column_for(table_name, column_name)
|
|
237
|
-
change_column table_name, column_name, column.sql_type, :default => default
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
def change_column_null(table_name, column_name, null, default = nil)
|
|
241
|
-
column = column_for(table_name, column_name)
|
|
242
|
-
|
|
243
|
-
unless null || default.nil?
|
|
244
|
-
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
|
77
|
+
def error_number(exception)
|
|
78
|
+
exception.error_code if exception.is_a?(JDBCError)
|
|
245
79
|
end
|
|
246
80
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
251
|
-
column = column_for(table_name, column_name)
|
|
252
|
-
|
|
253
|
-
unless options_include_default?(options)
|
|
254
|
-
options[:default] = column.default
|
|
81
|
+
def create_table(table_name, **options) #:nodoc:
|
|
82
|
+
super(table_name, options: "ENGINE=InnoDB", **options)
|
|
255
83
|
end
|
|
256
84
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
85
|
+
#--
|
|
86
|
+
# QUOTING ==================================================
|
|
87
|
+
#++
|
|
260
88
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
add_column_position!(change_column_sql, options)
|
|
264
|
-
execute(change_column_sql)
|
|
265
|
-
end
|
|
89
|
+
# NOTE: quote_string(string) provided by ArJdbc::MySQL (native code),
|
|
90
|
+
# this piece is also native (mysql2) under MRI: `@connection.escape(string)`
|
|
266
91
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
raise ActiveRecord::ActiveRecordError, "No such column: #{table_name}.#{column_name}"
|
|
92
|
+
def quoted_date(value)
|
|
93
|
+
if supports_datetime_with_precision?
|
|
94
|
+
super
|
|
95
|
+
else
|
|
96
|
+
super.sub(/\.\d{6}\z/, '')
|
|
97
|
+
end
|
|
274
98
|
end
|
|
275
|
-
current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
|
|
276
|
-
rename_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
|
|
277
|
-
add_column_options!(rename_column_sql, options)
|
|
278
|
-
execute(rename_column_sql)
|
|
279
|
-
end
|
|
280
99
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
elsif offset
|
|
288
|
-
sql << " OFFSET #{offset.to_i}"
|
|
100
|
+
def _quote(value)
|
|
101
|
+
if value.is_a?(Type::Binary::Data)
|
|
102
|
+
"x'#{value.hex}'"
|
|
103
|
+
else
|
|
104
|
+
super
|
|
105
|
+
end
|
|
289
106
|
end
|
|
290
|
-
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
def show_variable(var)
|
|
294
|
-
res = execute("show variables like '#{var}'")
|
|
295
|
-
row = res.detect {|row| row["Variable_name"] == var }
|
|
296
|
-
row && row["Value"]
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
def charset
|
|
300
|
-
show_variable("character_set_database")
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
def collation
|
|
304
|
-
show_variable("collation_database")
|
|
305
|
-
end
|
|
107
|
+
private :_quote
|
|
306
108
|
|
|
307
|
-
|
|
308
|
-
|
|
109
|
+
#--
|
|
110
|
+
# CONNECTION MANAGEMENT ====================================
|
|
111
|
+
#++
|
|
309
112
|
|
|
310
|
-
|
|
311
|
-
when 1; 'tinyint'
|
|
312
|
-
when 2; 'smallint'
|
|
313
|
-
when 3; 'mediumint'
|
|
314
|
-
when nil, 4, 11; 'int(11)' # compatibility with MySQL default
|
|
315
|
-
when 5..8; 'bigint'
|
|
316
|
-
else raise(ActiveRecordError, "No integer type has byte size #{limit}")
|
|
317
|
-
end
|
|
318
|
-
end
|
|
113
|
+
alias :reset! :reconnect!
|
|
319
114
|
|
|
320
|
-
|
|
321
|
-
if options[:first]
|
|
322
|
-
sql << " FIRST"
|
|
323
|
-
elsif options[:after]
|
|
324
|
-
sql << " AFTER #{quote_column_name(options[:after])}"
|
|
325
|
-
end
|
|
326
|
-
end
|
|
115
|
+
#
|
|
327
116
|
|
|
328
|
-
|
|
329
|
-
def translate_exception(exception, message)
|
|
330
|
-
return super unless exception.respond_to?(:errno)
|
|
117
|
+
private
|
|
331
118
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
::ActiveRecord::RecordNotUnique.new(message, exception)
|
|
335
|
-
when 1452
|
|
336
|
-
::ActiveRecord::InvalidForeignKey.new(message, exception)
|
|
337
|
-
else
|
|
338
|
-
super
|
|
339
|
-
end
|
|
340
|
-
end
|
|
119
|
+
# e.g. "5.7.20-0ubuntu0.16.04.1"
|
|
120
|
+
def full_version; @full_version ||= @connection.full_version end
|
|
341
121
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
unless column = columns(table_name).find { |c| c.name == column_name.to_s }
|
|
345
|
-
raise "No such column: #{table_name}.#{column_name}"
|
|
122
|
+
def jdbc_connection_class(spec)
|
|
123
|
+
::ActiveRecord::ConnectionAdapters::MySQLJdbcConnection
|
|
346
124
|
end
|
|
347
|
-
column
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
def show_create_table(table)
|
|
351
|
-
select_one("SHOW CREATE TABLE #{quote_table_name(table)}")
|
|
352
|
-
end
|
|
353
|
-
|
|
354
|
-
def supports_views?
|
|
355
|
-
false
|
|
356
|
-
end
|
|
357
|
-
end
|
|
358
|
-
end
|
|
359
125
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
remove_const(:MysqlColumn) if const_defined?(:MysqlColumn)
|
|
363
|
-
remove_const(:MysqlAdapter) if const_defined?(:MysqlAdapter)
|
|
364
|
-
|
|
365
|
-
class MysqlColumn < JdbcColumn
|
|
366
|
-
include ArJdbc::MySQL::Column
|
|
367
|
-
|
|
368
|
-
def initialize(name, *args)
|
|
369
|
-
if Hash === name
|
|
370
|
-
super
|
|
371
|
-
else
|
|
372
|
-
super(nil, name, *args)
|
|
126
|
+
def jdbc_column_class
|
|
127
|
+
::ActiveRecord::ConnectionAdapters::MySQL::Column
|
|
373
128
|
end
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
def call_discovered_column_callbacks(*)
|
|
377
|
-
end
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
class MysqlAdapter < JdbcAdapter
|
|
381
|
-
include ArJdbc::MySQL
|
|
382
129
|
|
|
383
|
-
def initialize(*args)
|
|
384
|
-
super
|
|
385
|
-
configure_connection
|
|
386
130
|
end
|
|
387
|
-
|
|
388
|
-
def adapter_spec(config)
|
|
389
|
-
# return nil to avoid extending ArJdbc::MySQL, which we've already done
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
def jdbc_column_class
|
|
393
|
-
ActiveRecord::ConnectionAdapters::MysqlColumn
|
|
394
|
-
end
|
|
395
|
-
end
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
module Mysql # :nodoc:
|
|
399
|
-
def self.client_version
|
|
400
|
-
50400 # faked out for AR tests
|
|
401
131
|
end
|
|
402
132
|
end
|