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.
Files changed (268) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +33 -0
  3. data/.travis.yml +79 -0
  4. data/.yardopts +4 -0
  5. data/CONTRIBUTING.md +50 -0
  6. data/Gemfile +91 -0
  7. data/History.md +1191 -0
  8. data/LICENSE.txt +22 -17
  9. data/README.md +169 -0
  10. data/RUNNING_TESTS.md +127 -0
  11. data/Rakefile +294 -5
  12. data/Rakefile.jdbc +20 -0
  13. data/activerecord-jdbc-adapter.gemspec +55 -0
  14. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  15. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
  16. data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
  18. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  19. data/lib/activerecord-jdbc-adapter.rb +0 -5
  20. data/lib/arel/visitors/compat.rb +60 -0
  21. data/lib/arel/visitors/db2.rb +128 -6
  22. data/lib/arel/visitors/derby.rb +103 -10
  23. data/lib/arel/visitors/firebird.rb +79 -0
  24. data/lib/arel/visitors/h2.rb +25 -0
  25. data/lib/arel/visitors/hsqldb.rb +18 -10
  26. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  27. data/lib/arel/visitors/sql_server.rb +225 -0
  28. data/lib/arel/visitors/sql_server/ng42.rb +293 -0
  29. data/lib/arjdbc.rb +11 -21
  30. data/lib/arjdbc/abstract/connection_management.rb +35 -0
  31. data/lib/arjdbc/abstract/core.rb +64 -0
  32. data/lib/arjdbc/abstract/database_statements.rb +64 -0
  33. data/lib/arjdbc/abstract/statement_cache.rb +58 -0
  34. data/lib/arjdbc/abstract/transaction_support.rb +86 -0
  35. data/lib/arjdbc/db2.rb +3 -1
  36. data/lib/arjdbc/db2/adapter.rb +630 -250
  37. data/lib/arjdbc/db2/as400.rb +130 -0
  38. data/lib/arjdbc/db2/column.rb +167 -0
  39. data/lib/arjdbc/db2/connection_methods.rb +44 -0
  40. data/lib/arjdbc/derby.rb +1 -5
  41. data/lib/arjdbc/derby/active_record_patch.rb +13 -0
  42. data/lib/arjdbc/derby/adapter.rb +409 -217
  43. data/lib/arjdbc/derby/connection_methods.rb +16 -14
  44. data/lib/arjdbc/derby/schema_creation.rb +15 -0
  45. data/lib/arjdbc/discover.rb +62 -50
  46. data/lib/arjdbc/firebird.rb +3 -1
  47. data/lib/arjdbc/firebird/adapter.rb +365 -62
  48. data/lib/arjdbc/firebird/connection_methods.rb +23 -0
  49. data/lib/arjdbc/h2.rb +2 -3
  50. data/lib/arjdbc/h2/adapter.rb +273 -6
  51. data/lib/arjdbc/h2/connection_methods.rb +23 -8
  52. data/lib/arjdbc/hsqldb.rb +2 -3
  53. data/lib/arjdbc/hsqldb/adapter.rb +204 -77
  54. data/lib/arjdbc/hsqldb/connection_methods.rb +24 -10
  55. data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
  56. data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
  57. data/lib/arjdbc/informix.rb +4 -2
  58. data/lib/arjdbc/informix/adapter.rb +78 -54
  59. data/lib/arjdbc/informix/connection_methods.rb +8 -9
  60. data/lib/arjdbc/jdbc.rb +59 -2
  61. data/lib/arjdbc/jdbc/adapter.rb +356 -166
  62. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  63. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  64. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  65. data/lib/arjdbc/jdbc/callbacks.rb +27 -18
  66. data/lib/arjdbc/jdbc/column.rb +79 -20
  67. data/lib/arjdbc/jdbc/connection.rb +5 -119
  68. data/lib/arjdbc/jdbc/connection_methods.rb +32 -4
  69. data/lib/arjdbc/jdbc/error.rb +65 -0
  70. data/lib/arjdbc/jdbc/extension.rb +41 -29
  71. data/lib/arjdbc/jdbc/java.rb +5 -6
  72. data/lib/arjdbc/jdbc/jdbc.rake +3 -126
  73. data/lib/arjdbc/jdbc/railtie.rb +2 -9
  74. data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
  75. data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
  76. data/lib/arjdbc/jdbc/type_cast.rb +166 -0
  77. data/lib/arjdbc/jdbc/type_converter.rb +35 -19
  78. data/lib/arjdbc/mssql.rb +6 -3
  79. data/lib/arjdbc/mssql/adapter.rb +630 -298
  80. data/lib/arjdbc/mssql/column.rb +200 -0
  81. data/lib/arjdbc/mssql/connection_methods.rb +66 -17
  82. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  83. data/lib/arjdbc/mssql/limit_helpers.rb +189 -50
  84. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  85. data/lib/arjdbc/mssql/types.rb +343 -0
  86. data/lib/arjdbc/mssql/utils.rb +82 -0
  87. data/lib/arjdbc/mysql.rb +2 -3
  88. data/lib/arjdbc/mysql/adapter.rb +86 -356
  89. data/lib/arjdbc/mysql/connection_methods.rb +159 -23
  90. data/lib/arjdbc/oracle/adapter.rb +714 -263
  91. data/lib/arjdbc/postgresql.rb +2 -3
  92. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +24 -0
  93. data/lib/arjdbc/postgresql/adapter.rb +570 -400
  94. data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
  95. data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
  96. data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
  97. data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
  98. data/lib/arjdbc/postgresql/column.rb +51 -0
  99. data/lib/arjdbc/postgresql/connection_methods.rb +57 -18
  100. data/lib/arjdbc/postgresql/name.rb +24 -0
  101. data/lib/arjdbc/postgresql/oid_types.rb +192 -0
  102. data/lib/arjdbc/railtie.rb +11 -0
  103. data/lib/arjdbc/sqlite3.rb +2 -3
  104. data/lib/arjdbc/sqlite3/adapter.rb +518 -198
  105. data/lib/arjdbc/sqlite3/connection_methods.rb +49 -24
  106. data/lib/arjdbc/sybase.rb +2 -2
  107. data/lib/arjdbc/sybase/adapter.rb +7 -6
  108. data/lib/arjdbc/tasks.rb +13 -0
  109. data/lib/arjdbc/tasks/database_tasks.rb +52 -0
  110. data/lib/arjdbc/tasks/databases.rake +91 -0
  111. data/lib/arjdbc/tasks/databases3.rake +215 -0
  112. data/lib/arjdbc/tasks/databases4.rake +39 -0
  113. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  114. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  115. data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
  116. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  117. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
  118. data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
  119. data/lib/arjdbc/util/quoted_cache.rb +60 -0
  120. data/lib/arjdbc/util/serialized_attributes.rb +98 -0
  121. data/lib/arjdbc/util/table_copier.rb +110 -0
  122. data/lib/arjdbc/version.rb +1 -6
  123. data/lib/generators/jdbc/USAGE +9 -0
  124. data/lib/generators/jdbc/jdbc_generator.rb +8 -0
  125. data/lib/jdbc_adapter.rb +1 -1
  126. data/lib/jdbc_adapter/rake_tasks.rb +3 -2
  127. data/lib/jdbc_adapter/version.rb +2 -1
  128. data/pom.xml +114 -0
  129. data/rails_generators/jdbc_generator.rb +1 -1
  130. data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
  131. data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
  132. data/rakelib/01-tomcat.rake +51 -0
  133. data/rakelib/02-test.rake +132 -0
  134. data/rakelib/bundler_ext.rb +11 -0
  135. data/rakelib/compile.rake +67 -22
  136. data/rakelib/db.rake +61 -0
  137. data/rakelib/rails.rake +204 -29
  138. data/src/java/arjdbc/ArJdbcModule.java +286 -0
  139. data/src/java/arjdbc/db2/DB2Module.java +76 -0
  140. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
  141. data/src/java/arjdbc/derby/DerbyModule.java +99 -243
  142. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
  143. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
  144. data/src/java/arjdbc/{jdbc/JdbcConnectionFactory.java → h2/H2Module.java} +20 -6
  145. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +27 -12
  146. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
  147. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +7 -6
  148. data/src/java/arjdbc/jdbc/AdapterJavaService.java +7 -29
  149. data/src/java/arjdbc/jdbc/Callable.java +44 -0
  150. data/src/java/arjdbc/jdbc/ConnectionFactory.java +132 -0
  151. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +157 -0
  152. data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
  153. data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
  154. data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
  155. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3622 -948
  156. data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
  157. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +181 -0
  158. data/src/java/arjdbc/mysql/MySQLModule.java +99 -81
  159. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
  160. data/src/java/arjdbc/oracle/OracleModule.java +80 -0
  161. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +387 -17
  162. data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
  163. data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
  164. data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
  165. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +184 -0
  166. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +952 -0
  167. data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
  168. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
  169. data/src/java/arjdbc/util/CallResultSet.java +826 -0
  170. data/src/java/arjdbc/util/DateTimeUtils.java +580 -0
  171. data/src/java/arjdbc/util/ObjectSupport.java +65 -0
  172. data/src/java/arjdbc/util/QuotingUtils.java +138 -0
  173. data/src/java/arjdbc/util/StringCache.java +63 -0
  174. data/src/java/arjdbc/util/StringHelper.java +159 -0
  175. metadata +245 -268
  176. data/History.txt +0 -369
  177. data/Manifest.txt +0 -180
  178. data/README.txt +0 -181
  179. data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
  180. data/lib/arel/engines/sql/compilers/db2_compiler.rb +0 -9
  181. data/lib/arel/engines/sql/compilers/derby_compiler.rb +0 -6
  182. data/lib/arel/engines/sql/compilers/h2_compiler.rb +0 -6
  183. data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +0 -15
  184. data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +0 -6
  185. data/lib/arel/engines/sql/compilers/mssql_compiler.rb +0 -46
  186. data/lib/arel/visitors/mssql.rb +0 -44
  187. data/lib/arjdbc/jdbc/compatibility.rb +0 -51
  188. data/lib/arjdbc/jdbc/core_ext.rb +0 -24
  189. data/lib/arjdbc/jdbc/discover.rb +0 -18
  190. data/lib/arjdbc/jdbc/driver.rb +0 -44
  191. data/lib/arjdbc/jdbc/missing_functionality_helper.rb +0 -87
  192. data/lib/arjdbc/jdbc/quoted_primary_key.rb +0 -28
  193. data/lib/arjdbc/jdbc/require_driver.rb +0 -16
  194. data/lib/arjdbc/mimer.rb +0 -2
  195. data/lib/arjdbc/mimer/adapter.rb +0 -142
  196. data/lib/arjdbc/mssql/tsql_helper.rb +0 -61
  197. data/lib/arjdbc/oracle.rb +0 -3
  198. data/lib/arjdbc/oracle/connection_methods.rb +0 -11
  199. data/lib/pg.rb +0 -4
  200. data/rakelib/package.rake +0 -92
  201. data/rakelib/test.rake +0 -81
  202. data/src/java/arjdbc/jdbc/SQLBlock.java +0 -48
  203. data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +0 -127
  204. data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +0 -57
  205. data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +0 -64
  206. data/test/abstract_db_create.rb +0 -117
  207. data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -31
  208. data/test/activerecord/connections/native_jdbc_mysql/connection.rb +0 -25
  209. data/test/db/db2.rb +0 -11
  210. data/test/db/derby.rb +0 -12
  211. data/test/db/h2.rb +0 -11
  212. data/test/db/hsqldb.rb +0 -13
  213. data/test/db/informix.rb +0 -11
  214. data/test/db/jdbc.rb +0 -11
  215. data/test/db/jndi_config.rb +0 -40
  216. data/test/db/logger.rb +0 -3
  217. data/test/db/mssql.rb +0 -9
  218. data/test/db/mysql.rb +0 -10
  219. data/test/db/oracle.rb +0 -34
  220. data/test/db/postgres.rb +0 -9
  221. data/test/db/sqlite3.rb +0 -11
  222. data/test/db2_simple_test.rb +0 -66
  223. data/test/derby_migration_test.rb +0 -68
  224. data/test/derby_multibyte_test.rb +0 -12
  225. data/test/derby_simple_test.rb +0 -99
  226. data/test/generic_jdbc_connection_test.rb +0 -29
  227. data/test/h2_simple_test.rb +0 -41
  228. data/test/has_many_through.rb +0 -79
  229. data/test/helper.rb +0 -5
  230. data/test/hsqldb_simple_test.rb +0 -6
  231. data/test/informix_simple_test.rb +0 -48
  232. data/test/jdbc_common.rb +0 -25
  233. data/test/jndi_callbacks_test.rb +0 -40
  234. data/test/jndi_test.rb +0 -25
  235. data/test/manualTestDatabase.rb +0 -191
  236. data/test/models/add_not_null_column_to_table.rb +0 -12
  237. data/test/models/auto_id.rb +0 -18
  238. data/test/models/data_types.rb +0 -28
  239. data/test/models/entry.rb +0 -43
  240. data/test/models/mixed_case.rb +0 -25
  241. data/test/models/reserved_word.rb +0 -18
  242. data/test/models/string_id.rb +0 -18
  243. data/test/models/validates_uniqueness_of_string.rb +0 -19
  244. data/test/mssql_db_create_test.rb +0 -26
  245. data/test/mssql_identity_insert_test.rb +0 -19
  246. data/test/mssql_legacy_types_test.rb +0 -58
  247. data/test/mssql_limit_offset_test.rb +0 -136
  248. data/test/mssql_multibyte_test.rb +0 -18
  249. data/test/mssql_simple_test.rb +0 -55
  250. data/test/mysql_db_create_test.rb +0 -27
  251. data/test/mysql_info_test.rb +0 -113
  252. data/test/mysql_multibyte_test.rb +0 -10
  253. data/test/mysql_nonstandard_primary_key_test.rb +0 -42
  254. data/test/mysql_simple_test.rb +0 -49
  255. data/test/oracle_simple_test.rb +0 -18
  256. data/test/oracle_specific_test.rb +0 -83
  257. data/test/pick_rails_version.rb +0 -3
  258. data/test/postgres_db_create_test.rb +0 -32
  259. data/test/postgres_drop_db_test.rb +0 -16
  260. data/test/postgres_mixed_case_test.rb +0 -29
  261. data/test/postgres_nonseq_pkey_test.rb +0 -38
  262. data/test/postgres_reserved_test.rb +0 -22
  263. data/test/postgres_schema_search_path_test.rb +0 -44
  264. data/test/postgres_simple_test.rb +0 -51
  265. data/test/postgres_table_alias_length_test.rb +0 -15
  266. data/test/simple.rb +0 -546
  267. data/test/sqlite3_simple_test.rb +0 -233
  268. data/test/sybase_jtds_simple_test.rb +0 -28
@@ -1,4 +1,3 @@
1
- require 'arjdbc/jdbc'
2
- jdbc_require_driver 'jdbc/mysql'
3
- require 'arjdbc/mysql/connection_methods'
1
+ require 'arjdbc'
4
2
  require 'arjdbc/mysql/adapter'
3
+ require 'arjdbc/mysql/connection_methods'
@@ -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 ::ArJdbc
4
- module MySQL
5
- def self.column_selector
6
- [/mysql/i, lambda {|cfg,col| col.extend(::ArJdbc::MySQL::Column)}]
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
- def self.extended(adapter)
10
- adapter.configure_connection
11
- end
18
+ # Remove any vestiges of core/Ruby MySQL adapter
19
+ remove_const(:Mysql2Adapter) if const_defined?(:Mysql2Adapter)
12
20
 
13
- def configure_connection
14
- execute("SET SQL_AUTO_IS_NULL=0")
15
- end
21
+ class Mysql2Adapter < AbstractMysqlAdapter
22
+ ADAPTER_NAME = 'Mysql2'.freeze
16
23
 
17
- module Column
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
- def has_default?
33
- return false if sql_type =~ /blob/i || type == :text #mysql forbids defaults on blob and text columns
34
- super
35
- end
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
- def simplified_type(field_type)
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 extract_limit(sql_type)
44
- case sql_type
45
- when /blob|text/i
46
- case sql_type
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
- # MySQL misreports NOT NULL column default when none is given.
69
- # We can't detect this for columns which may have a legitimate ''
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
- def case_sensitive_equality_operator
98
- "= BINARY"
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
- def quoted_true
123
- "1"
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
- def structure_dump #:nodoc:
177
- if supports_views?
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
- select_all(sql).inject("") do |structure, table|
184
- table.delete('Table_type')
56
+ # HELPER METHODS ===========================================
185
57
 
186
- hash = show_create_table(table.to_a.first.last)
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
- if(table = hash["Create Table"])
189
- structure += table + ";\n\n"
190
- elsif(view = hash["Create View"])
191
- structure += view + ";\n\n"
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
- def drop_database(name) #:nodoc:
213
- execute "DROP DATABASE IF EXISTS `#{name}`"
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
- change_column table_name, column_name, column.sql_type, :null => null
248
- end
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
- unless options.has_key?(:null)
258
- options[:null] = column.null
259
- end
85
+ #--
86
+ # QUOTING ==================================================
87
+ #++
260
88
 
261
- change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
262
- add_column_options!(change_column_sql, options)
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
- def rename_column(table_name, column_name, new_column_name) #:nodoc:
268
- options = {}
269
- if column = columns(table_name).find { |c| c.name == column_name.to_s }
270
- options[:default] = column.default
271
- options[:null] = column.null
272
- else
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
- def add_limit_offset!(sql, options) #:nodoc:
282
- limit, offset = options[:limit], options[:offset]
283
- if limit && offset
284
- sql << " LIMIT #{offset.to_i}, #{sanitize_limit(limit)}"
285
- elsif limit
286
- sql << " LIMIT #{sanitize_limit(limit)}"
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
- sql
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
- def type_to_sql(type, limit = nil, precision = nil, scale = nil)
308
- return super unless type.to_s == 'integer'
109
+ #--
110
+ # CONNECTION MANAGEMENT ====================================
111
+ #++
309
112
 
310
- case limit
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
- def add_column_position!(sql, options)
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
- protected
329
- def translate_exception(exception, message)
330
- return super unless exception.respond_to?(:errno)
117
+ private
331
118
 
332
- case exception.errno
333
- when 1062
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
- private
343
- def column_for(table_name, column_name)
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
- module ActiveRecord::ConnectionAdapters
361
- # Remove any vestiges of core/Ruby MySQL adapter
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