activerecord-jdbc-adapter 51.1-java → 51.2-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a171f4269e41c768fcbfaaccbf2f6f2c2df051ae
4
- data.tar.gz: ec6aee76c700cfec4c7cfb3ffd64de135149a159
3
+ metadata.gz: b92cd70cfbcb8827986847b53e1d527f5fcee621
4
+ data.tar.gz: 2480d4df7693895d1ca20ac406dadb26f7c432e4
5
5
  SHA512:
6
- metadata.gz: c51149881eb9da030aad612f6df71cb2bff662ed6288cacb14aa7ddd61e42c42039ca0b425ed7df06345b71319f417bf4bc3e23f112113ff8403827127c075ef
7
- data.tar.gz: ac52a7288354ab3ee6871fa149eff7cc7d74242e8950d46d43d9e034a511d665bdc61e7de44aa5491ecdb6ce07b3da36f88b55e0bdcb0973158432cef1c34470
6
+ metadata.gz: 42f15c16ca5d768f29993be86e43234b832be0fd580625a1d080f9827f405fe9b3a44752cf25970e11a00aeafd3e9d1b20ee715eac15404f042027e5cb8e5643
7
+ data.tar.gz: ba4acdb1f07ab847ee0f560c8c9869f72456cfb812e69823b01ad4c0fb62126331401941a015ccd8058e40be7d395f14c418021a14f8f8d9d8eb42befb7ae16f
data/.travis.yml CHANGED
@@ -21,8 +21,8 @@ before_script:
21
21
  mysql -e "grant all privileges on activerecord_unittest.* to rails@localhost;" && \
22
22
  mysql -e "grant all privileges on activerecord_unittest2.* to rails@localhost;" && \
23
23
  mysql -e "grant all privileges on inexistent_activerecord_unittest.* to rails@localhost;" && \
24
- mysql -e "CREATE DATABASE activerecord_unittest;" && \
25
- mysql -e "CREATE DATABASE activerecord_unittest2;" \
24
+ mysql -e "CREATE DATABASE activerecord_unittest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" && \
25
+ mysql -e "CREATE DATABASE activerecord_unittest2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" \
26
26
  || true
27
27
  - |
28
28
  [ "$DB" == "postgresql" ] && [ "$TEST_PREFIX" == "rails:" ] && \
data/Rakefile CHANGED
@@ -236,23 +236,43 @@ if defined? JRUBY_VERSION
236
236
  end
237
237
 
238
238
  classpath = []
239
- [ 'java.class.path', 'sun.boot.class.path' ].each do |key|
240
- classpath += ENV_JAVA[key].split(File::PATH_SEPARATOR).find_all { |jar| jar =~ /jruby/i }
239
+ [ 'java.class.path', 'sun.boot.class.path' ].map { |key| ENV_JAVA[key] }.each do |v|
240
+ classpath += v.split(File::PATH_SEPARATOR).find_all { |jar| jar =~ /jruby/i } if v
241
241
  end
242
-
243
- #classpath += ENV_JAVA['java.class.path'].split(File::PATH_SEPARATOR)
244
- #classpath += ENV_JAVA['sun.boot.class.path'].split(File::PATH_SEPARATOR)
245
-
242
+ # Using Java 9+. Let's try and infer jruby.jar location from rbconfig
243
+ if classpath.empty?; require 'rbconfig'
244
+ libdir = RbConfig::CONFIG['libdir']
245
+ if libdir.start_with? 'classpath:'
246
+ error "Cannot build activerecord-jdbc with jruby-complete"
247
+ end
248
+ classpath << File.join(libdir, 'jruby.jar')
249
+ end
250
+
246
251
  classpath += driver_jars
247
252
  classpath = classpath.compact.join(File::PATH_SEPARATOR)
248
253
 
249
254
  source_files = FileList[ 'src/java/**/*.java' ]
250
255
 
251
- require 'tmpdir'
256
+ version = lambda do
257
+ begin
258
+ require 'arjdbc/version'
259
+ rescue LoadError
260
+ path = File.expand_path('../lib', File.dirname(__FILE__))
261
+ unless $LOAD_PATH.include?(path)
262
+ $LOAD_PATH << path; retry
263
+ end
264
+ end
252
265
 
253
- Dir.mktmpdir do |classes_dir|
254
- # Cross-platform way of finding an executable in the $PATH.
255
- # Thanks to @mislav
266
+ gem_version = Gem::Version.create(ArJdbc::VERSION)
267
+ if gem_version.segments.last == 'DEV'
268
+ gem_version.segments[0...-1] # 50.0.DEV -> 50.0
269
+ else
270
+ gem_version.segments.dup
271
+ end
272
+ end
273
+
274
+ require 'tmpdir'; Dir.mktmpdir do |classes_dir|
275
+ # Cross-platform way of finding an executable in the $PATH. Thanks to @mislav
256
276
  which = lambda do |cmd|
257
277
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
258
278
  ENV['PATH'].split(File::PATH_SEPARATOR).map do |path|
@@ -276,7 +296,24 @@ if defined? JRUBY_VERSION
276
296
  # avoid environment variable expansion using backslash
277
297
  # class_files.gsub!('$', '\$') unless windows?
278
298
  # args = class_files.map { |path| [ "-C #{classes_dir}", path ] }.flatten
279
- args = [ '-C', "#{classes_dir}/ ." ] # args = class_files
299
+
300
+ if ENV['RELEASE'] == 'true'; require 'tempfile'
301
+ manifest = "Built-Time: #{Time.now.utc.strftime('%Y-%m-%d %H:%M:%S')}\n"
302
+ manifest += "Built-JRuby: #{JRUBY_VERSION}\n"
303
+ manifest += "Specification-Title: ActiveRecord-JDBC\n"
304
+ manifest += "Specification-Vendor: JRuby\n"
305
+ manifest += "Specification-Version: #{version.call[0].to_s.split('').join('.')}\n" # AR VERSION (52 -> 5.2)
306
+ manifest += "Implementation-Vendor: The JRuby Team\n"
307
+ manifest += "Implementation-Version: #{version.call.join('.')}\n"
308
+ manifest = Tempfile.new('MANIFEST').tap { |f| f << manifest; f.close }.path
309
+ end
310
+
311
+ args = []; opts = '-cf'
312
+ if manifest
313
+ opts = "#{opts}m"
314
+ args = [ "#{manifest}" ]
315
+ end
316
+ args += [ '-C', "#{classes_dir}/ ." ]
280
317
 
281
318
  jar_path = jar_file
282
319
  if ext_lib_dir = ENV['RUBYLIBDIR']
@@ -286,7 +323,7 @@ if defined? JRUBY_VERSION
286
323
  unless jar = which.call('jar')
287
324
  warn "could not find jar tool, please make sure it's on the PATH"
288
325
  end
289
- sh("#{jar} cf #{jar_path} #{args.join(' ')}") do |ok|
326
+ sh("#{jar} #{opts} #{jar_path} #{args.join(' ')}") do |ok|
290
327
  raise 'could not build .jar extension - packaging failure' unless ok
291
328
  end
292
329
  cp jar_path, jar_file if ext_lib_dir # NOTE: hopefully RG won't mind?!
@@ -294,6 +331,6 @@ if defined? JRUBY_VERSION
294
331
  end
295
332
  else
296
333
  task :jar do
297
- puts "please run `rake jar' under JRuby to re-compile the native (Java) extension"
334
+ warn "please run `rake jar' under JRuby to re-compile the native (Java) extension"
298
335
  end
299
336
  end
@@ -60,7 +60,17 @@ module ArJdbc
60
60
  end
61
61
  end
62
62
 
63
+ def extract_raw_bind_values(binds)
64
+ binds.map(&:value_for_database)
65
+ end
63
66
 
67
+ # this version of log() automatically fills type_casted_binds from binds if necessary
68
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
69
+ if binds.any? && (type_casted_binds.nil? || type_casted_binds.empty?)
70
+ type_casted_binds = ->{ extract_raw_bind_values(binds) }
71
+ end
72
+ super
73
+ end
64
74
  end
65
75
  end
66
76
  end
@@ -4,15 +4,8 @@ module ArJdbc
4
4
  ConnectionMethods.module_eval do
5
5
 
6
6
  def jdbc_connection(config)
7
- adapter_class = config[:adapter_class]
8
- adapter_class ||= ::ActiveRecord::ConnectionAdapters::JdbcAdapter
9
-
10
- # Once all adapters converted to AR5 then this rescue can be removed
11
- begin
12
- adapter_class.new(nil, logger, nil, config)
13
- rescue ArgumentError
14
- adapter_class.new(nil, logger, config)
15
- end
7
+ adapter_class = config[:adapter_class] || ::ActiveRecord::ConnectionAdapters::JdbcAdapter
8
+ adapter_class.new(nil, logger, nil, config)
16
9
  end
17
10
 
18
11
  def jndi_connection(config); jdbc_connection(config) end
@@ -31,8 +31,8 @@ module ActiveRecord
31
31
 
32
32
  include ArJdbc::MySQL
33
33
 
34
- def initialize(connection, logger, config)
35
- super(connection, logger, nil, config)
34
+ def initialize(connection, logger, connection_parameters, config)
35
+ super
36
36
  @prepared_statements = false unless config.key?(:prepared_statements)
37
37
  # configure_connection taken care of at ArJdbc::Abstract::Core
38
38
  end
@@ -13,11 +13,14 @@ ArJdbc::ConnectionMethods.module_eval do
13
13
  driver = config[:driver] ||=
14
14
  defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
15
15
 
16
+ mysql_driver = driver.start_with?('com.mysql.')
17
+ mariadb_driver = ! mysql_driver && driver.start_with?('org.mariadb.')
18
+
16
19
  begin
17
20
  require 'jdbc/mysql'
18
21
  ::Jdbc::MySQL.load_driver(:require) if defined?(::Jdbc::MySQL.load_driver)
19
22
  rescue LoadError # assuming driver.jar is on the class-path
20
- end if mysql_driver = driver[0, 10] == 'com.mysql.'
23
+ end if mysql_driver
21
24
 
22
25
  config[:username] = 'root' unless config.key?(:username)
23
26
  # jdbc:mysql://[host][,failoverhost...][:port]/[database]
@@ -25,12 +28,12 @@ ArJdbc::ConnectionMethods.module_eval do
25
28
  # - if the port is not specified, it defaults to 3306
26
29
  # - alternate fail-over syntax: [host:port],[host:port]/[database]
27
30
  unless config[:url]
28
- host = config[:host]; host = host.join(',') if host.respond_to?(:join)
31
+ host = config[:host]
32
+ host ||= 'localhost' if mariadb_driver
33
+ host = host.join(',') if host.respond_to?(:join)
29
34
  config[:url] = "jdbc:mysql://#{host}#{ config[:port] ? ":#{config[:port]}" : nil }/#{config[:database]}"
30
35
  end
31
36
 
32
- mariadb_driver = ! mysql_driver && driver.start_with?('org.mariadb.')
33
-
34
37
  properties = ( config[:properties] ||= {} )
35
38
  if mysql_driver
36
39
  properties['zeroDateTimeBehavior'] ||= 'convertToNull'
@@ -63,8 +66,8 @@ ArJdbc::ConnectionMethods.module_eval do
63
66
  end
64
67
  if config[:sslkey] || sslcert = config[:sslcert] # || config[:use_ssl]
65
68
  properties['useSSL'] ||= true # supported by MariaDB as well
66
- properties['requireSSL'] ||= true if mysql_driver
67
69
  if mysql_driver
70
+ properties['requireSSL'] ||= true
68
71
  properties['clientCertificateKeyStoreUrl'] ||= java.io.File.new(sslcert).to_url.to_s if sslcert
69
72
  if sslca = config[:sslca]
70
73
  properties['trustCertificateKeyStoreUrl'] ||= java.io.File.new(sslca).to_url.to_s
@@ -55,8 +55,30 @@ module ArJdbc
55
55
  @postgresql_version ||=
56
56
  begin
57
57
  version = @connection.database_product
58
- if version =~ /PostgreSQL (\d+)\.(\d+)\.(\d+)/
59
- ($1.to_i * 10000) + ($2.to_i * 100) + $3.to_i
58
+ if match = version.match(/([\d\.]*\d).*?/)
59
+ version = match[1].split('.').map(&:to_i)
60
+ # PostgreSQL version representation does not have more than 4 digits
61
+ # From version 10 onwards, PG has changed its versioning policy to
62
+ # limit it to only 2 digits. i.e. in 10.x, 10 being the major
63
+ # version and x representing the patch release
64
+ # Refer to:
65
+ # https://www.postgresql.org/support/versioning/
66
+ # https://www.postgresql.org/docs/10/static/libpq-status.html -> PQserverVersion()
67
+ # for more info
68
+
69
+ if version.size >= 3
70
+ (version[0] * 100 + version[1]) * 100 + version[2]
71
+ elsif version.size == 2
72
+ if version[0] >= 10
73
+ version[0] * 100 * 100 + version[1]
74
+ else
75
+ (version[0] * 100 + version[1]) * 100
76
+ end
77
+ elsif version.size == 1
78
+ version[0] * 100 * 100
79
+ else
80
+ 0
81
+ end
60
82
  else
61
83
  0
62
84
  end
@@ -217,6 +239,8 @@ module ArJdbc
217
239
 
218
240
  def supports_ddl_transactions?; true end
219
241
 
242
+ def supports_advisory_locks?; true end
243
+
220
244
  def supports_explain?; true end
221
245
 
222
246
  def supports_expression_index?; true end
@@ -233,6 +257,10 @@ module ArJdbc
233
257
 
234
258
  def supports_views?; true end
235
259
 
260
+ def supports_datetime_with_precision?; true end
261
+
262
+ def supports_comments?; true end
263
+
236
264
  # Does PostgreSQL support standard conforming strings?
237
265
  def supports_standard_conforming_strings?
238
266
  standard_conforming_strings?
@@ -243,6 +271,14 @@ module ArJdbc
243
271
  postgresql_version >= 90000
244
272
  end
245
273
 
274
+ def supports_materialized_views?
275
+ postgresql_version >= 90300
276
+ end
277
+
278
+ def supports_json?
279
+ postgresql_version >= 90200
280
+ end
281
+
246
282
  def supports_insert_with_returning?
247
283
  postgresql_version >= 80200
248
284
  end
@@ -376,6 +412,12 @@ module ArJdbc
376
412
  @connection.configure_connection
377
413
  end
378
414
 
415
+ def default_sequence_name(table_name, pk = "id") #:nodoc:
416
+ serial_sequence(table_name, pk)
417
+ rescue ActiveRecord::StatementInvalid
418
+ %Q("#{table_name}_#{pk}_seq")
419
+ end
420
+
379
421
  def last_insert_id_result(sequence_name)
380
422
  exec_query("SELECT currval('#{sequence_name}')", 'SQL')
381
423
  end
@@ -581,6 +623,8 @@ module ArJdbc
581
623
  end
582
624
 
583
625
  def translate_exception(exception, message)
626
+ return super unless exception.is_a?(ActiveRecord::JDBCError)
627
+
584
628
  # TODO: Can we base these on an error code of some kind?
585
629
  case exception.message
586
630
  when /duplicate key value violates unique constraint/
@@ -668,12 +712,12 @@ module ActiveRecord::ConnectionAdapters
668
712
  # AR expects OID to be available on the adapter
669
713
  OID = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
670
714
 
671
- def initialize(connection, logger = nil, config = {})
715
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
672
716
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
673
717
  @local_tz = nil
674
718
  @max_identifier_length = nil
675
719
 
676
- super # configure_connection happens in super
720
+ super(connection, logger, config) # configure_connection happens in super
677
721
 
678
722
  initialize_type_map(@type_map = Type::HashLookupTypeMap.new)
679
723
 
@@ -695,21 +739,6 @@ module ActiveRecord::ConnectionAdapters
695
739
  TableDefinition.new(*args)
696
740
  end
697
741
 
698
- def exec_query(sql, name = nil, binds = [], prepare: false)
699
- super
700
- rescue ActiveRecord::StatementInvalid => e
701
- raise unless e.cause.message.include?('cached plan must not change result type'.freeze)
702
-
703
- if open_transactions > 0
704
- # In a transaction, have to fail it - See AR code for details
705
- raise ActiveRecord::PreparedStatementCacheExpired.new(e.cause.message)
706
- else
707
- # Not in a transaction, clear the prepared statement and try again
708
- delete_cached_statement(sql)
709
- retry
710
- end
711
- end
712
-
713
742
  public :sql_for_insert
714
743
 
715
744
  def schema_creation # :nodoc:
@@ -51,8 +51,15 @@ ArJdbc::ConnectionMethods.module_eval do
51
51
  properties['tcpKeepAlive'] ||= config[:keepalives] if config.key?(:keepalives)
52
52
  properties['kerberosServerName'] ||= config[:krbsrvname] if config[:krbsrvname]
53
53
 
54
- # If prepared statements are off, lets make sure they are really *off*
55
- properties['prepareThreshold'] ||= 0 unless config[:prepared_statements]
54
+ prepared_statements = config.fetch(:prepared_statements) { true }
55
+ prepared_statements = false if prepared_statements == 'false'
56
+ if prepared_statements
57
+ # this makes the pgjdbc driver handle hot compatibility internally
58
+ properties['autosave'] ||= 'conservative'
59
+ else
60
+ # If prepared statements are off, lets make sure they are really *off*
61
+ properties['prepareThreshold'] = 0
62
+ end
56
63
 
57
64
  jdbc_connection(config)
58
65
  end
@@ -72,8 +72,7 @@ module ArJdbc
72
72
  Arel::Visitors::SQLite.new(self)
73
73
  end
74
74
 
75
- # DIFFERENCE: we remove connection_options because we are not using it.
76
- def initialize(connection, logger, config)
75
+ def initialize(connection, logger, connection_options, config)
77
76
  super(connection, logger, config)
78
77
 
79
78
  @active = nil
@@ -1,52 +1,32 @@
1
1
  module ArJdbc
2
2
  module Tasks
3
3
 
4
- if defined? ActiveRecord::Tasks::DatabaseTasks # AR-4.x
5
-
6
- def self.register_tasks(pattern, task)
7
- ActiveRecord::Tasks::DatabaseTasks.register_task(pattern, task)
8
- end
9
-
10
- # support adapter: mariadb (as if it were mysql)
11
- register_tasks(/mariadb/, ActiveRecord::Tasks::MySQLDatabaseTasks)
12
-
13
- else
14
-
15
- @@tasks = {}
16
-
17
- def self.register_tasks(pattern, task)
18
- @@tasks[pattern] = task
19
- end
20
-
21
- def self.tasks_instance(config)
22
- adapter = config['adapter']
23
- key = @@tasks.keys.detect { |pattern| adapter[pattern] }
24
- ( @@tasks[key] || JdbcDatabaseTasks ).new(config)
25
- end
26
-
4
+ def self.register_tasks(pattern, task)
5
+ ActiveRecord::Tasks::DatabaseTasks.register_task(pattern, task)
27
6
  end
28
7
 
8
+ # support adapter: mariadb (as if it were mysql)
9
+ register_tasks(/mariadb/, ActiveRecord::Tasks::MySQLDatabaseTasks)
10
+
29
11
  require 'arjdbc/tasks/jdbc_database_tasks'
30
- require 'arjdbc/tasks/db2_database_tasks'
31
- require 'arjdbc/tasks/derby_database_tasks'
32
- require 'arjdbc/tasks/h2_database_tasks'
33
- require 'arjdbc/tasks/hsqldb_database_tasks'
34
- require 'arjdbc/tasks/mssql_database_tasks'
12
+ #require 'arjdbc/tasks/db2_database_tasks'
13
+ #require 'arjdbc/tasks/derby_database_tasks'
14
+ #require 'arjdbc/tasks/h2_database_tasks'
15
+ #require 'arjdbc/tasks/hsqldb_database_tasks'
16
+ #require 'arjdbc/tasks/mssql_database_tasks'
35
17
 
36
18
  # re-invent built-in (but deprecated on 4.0) tasks :
37
- register_tasks(/sqlserver/, MSSQLDatabaseTasks)
38
- register_tasks(/mssql/, MSSQLDatabaseTasks) # (built-in) alias
19
+ #register_tasks(/sqlserver/, MSSQLDatabaseTasks)
20
+ #register_tasks(/mssql/, MSSQLDatabaseTasks) # (built-in) alias
39
21
  # tasks for custom (JDBC) adapters :
40
- register_tasks(/db2/, DB2DatabaseTasks)
41
- register_tasks(/derby/, DerbyDatabaseTasks)
42
- register_tasks(/h2/, H2DatabaseTasks)
43
- register_tasks(/hsqldb/, HSQLDBDatabaseTasks)
22
+ #register_tasks(/db2/, DB2DatabaseTasks)
23
+ #register_tasks(/derby/, DerbyDatabaseTasks)
24
+ #register_tasks(/h2/, H2DatabaseTasks)
25
+ #register_tasks(/hsqldb/, HSQLDBDatabaseTasks)
44
26
  # (default) generic JDBC task :
45
27
  register_tasks(/^jdbc$/, JdbcDatabaseTasks)
46
28
 
47
29
  # NOTE: no need to register "built-in" adapters such as MySQL
48
- # - on 4.0 these are registered and will be instantiated
49
- # - while on 2.3/3.x we keep the AR built-in task behavior
50
30
 
51
31
  end
52
32
  end
@@ -1,91 +1,48 @@
1
- raise "ArJdbc needs rake 0.9.x or newer" unless Rake.const_defined?(:VERSION)
2
-
3
- Rake::DSL.module_eval do
4
-
5
- def redefine_task(*args, &block)
6
- if Hash === args.first
7
- task_name = args.first.keys[0]
8
- old_prereqs = false # leave as specified
9
- else
10
- task_name = args.first; old_prereqs = []
11
- # args[0] = { task_name => old_prereqs }
12
- end
13
-
14
- full_name = Rake::Task.scope_name(Rake.application.current_scope, task_name)
15
-
16
- if old_task = Rake.application.lookup(task_name)
17
- old_comment = old_task.full_comment
18
- old_prereqs = old_task.prerequisites.dup if old_prereqs
19
- old_actions = old_task.actions.dup
20
- old_actions.shift # remove the main 'action' block - we're redefining it
21
- # old_task.clear_prerequisites if old_prereqs
22
- # old_task.clear_actions
23
- # remove the (old) task instance from the application :
24
- Rake.application.send(:instance_variable_get, :@tasks)[full_name.to_s] = nil
25
- else
26
- # raise "could not find rake task with (full) name '#{full_name}'"
27
- end
28
-
29
- new_task = task(*args, &block)
30
- new_task.comment = old_comment if old_comment
31
- new_task.actions.concat(old_actions) if old_actions
32
- new_task.prerequisites.concat(old_prereqs) if old_prereqs
33
- new_task
34
- end
35
-
36
- end
37
-
38
- namespace :db do
39
-
40
- def rails_env
41
- defined?(Rails.env) ? Rails.env : ( RAILS_ENV || 'development' )
42
- end
1
+ require 'arjdbc/tasks/database_tasks'
43
2
 
44
- if defined? adapt_jdbc_config
45
- ArJdbc.warn "double loading #{__FILE__} please delete lib/tasks/jdbc.rake if present!"
46
- end
3
+ module ActiveRecord::Tasks
47
4
 
48
- def adapt_jdbc_config(config)
49
- return config unless config['adapter']
50
- config.merge 'adapter' => config['adapter'].sub(/^jdbc/, '')
51
- end
5
+ DatabaseTasks.module_eval do
52
6
 
53
- if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
7
+ # @override patched to adapt jdbc configuration
8
+ def each_current_configuration(environment)
9
+ environments = [environment]
10
+ environments << 'test' if environment == 'development'
54
11
 
55
- def current_config(options = {})
56
- ActiveRecord::Tasks::DatabaseTasks.current_config(options)
12
+ configurations = ActiveRecord::Base.configurations.values_at(*environments)
13
+ configurations.compact.each do |config|
14
+ yield adapt_jdbc_config(config) unless config['database'].blank?
15
+ end
57
16
  end
58
17
 
59
- else # 3.x / 2.3
18
+ # @override patched to adapt jdbc configuration
19
+ def each_local_configuration
20
+ ActiveRecord::Base.configurations.each_value do |config|
21
+ next unless config['database']
60
22
 
61
- def current_config(options = {}) # not on 2.3
62
- options = { :env => rails_env }.merge! options
63
- if options[:config]
64
- @current_config = options[:config]
65
- else
66
- @current_config ||= ENV['DATABASE_URL'] ?
67
- database_url_config : ActiveRecord::Base.configurations[options[:env]]
23
+ if local_database?(config)
24
+ yield adapt_jdbc_config(config)
25
+ else
26
+ $stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host."
27
+ end
68
28
  end
69
29
  end
70
30
 
71
- def database_url_config(url = ENV['DATABASE_URL'])
72
- # NOTE: ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
73
- # since AR 4.0 that is handled by DatabaseTasks - only care about 2.3/3.x :
74
- unless defined? ActiveRecord::Base::ConnectionSpecification::Resolver
75
- raise "DATABASE_URL not supported on ActiveRecord #{ActiveRecord::VERSION::STRING}"
76
- end
77
- resolver = ActiveRecord::Base::ConnectionSpecification::Resolver.new(url, {})
78
- resolver.spec.config.stringify_keys
31
+ private
32
+
33
+ def adapt_jdbc_config(config)
34
+ return config unless config['adapter']
35
+ config.merge 'adapter' => config['adapter'].sub(/^jdbc/, '')
79
36
  end
80
37
 
81
38
  end
82
39
 
83
- end
40
+ MySQLDatabaseTasks.class_eval do
84
41
 
85
- require 'arjdbc/tasks/database_tasks'
42
+ def error_class
43
+ ActiveRecord::JDBCError
44
+ end
45
+
46
+ end if const_defined?(:MySQLDatabaseTasks)
86
47
 
87
- if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
88
- load File.expand_path('databases4.rake', File.dirname(__FILE__))
89
- else # 3.x / 2.3
90
- load File.expand_path('databases3.rake', File.dirname(__FILE__))
91
- end
48
+ end
@@ -1,3 +1,3 @@
1
1
  module ArJdbc
2
- VERSION = '51.1'
2
+ VERSION = '51.2'
3
3
  end
data/rakelib/db.rake CHANGED
@@ -4,25 +4,35 @@ namespace :db do
4
4
  task :mysql do
5
5
  require File.expand_path('../../test/shared_helper', __FILE__)
6
6
  fail "could not create test database: mysql executable not found" unless mysql = which('mysql')
7
+
7
8
  load 'test/db/mysql_config.rb' # rescue nil
8
9
  enc = MYSQL_CONFIG[:encoding] || 'utf8' # 'utf8mb4'
9
10
  puts MYSQL_CONFIG.inspect if $VERBOSE
10
- # DROP USER arjdbc@localhost; __ERROR 1396 (HY000): Operation CREATE USER failed__
11
+
12
+ clean_script = sql_script <<-SQL, 'mysqlclean'
13
+ DROP USER #{MYSQL_CONFIG[:username]}@localhost;
14
+ SQL
15
+
11
16
  script = sql_script <<-SQL, 'mysql'
12
17
  DROP DATABASE IF EXISTS `#{MYSQL_CONFIG[:database]}`;
13
18
  CREATE DATABASE `#{MYSQL_CONFIG[:database]}` DEFAULT CHARACTER SET `#{enc}` COLLATE `#{enc}_general_ci`;
19
+ CREATE USER #{MYSQL_CONFIG[:username]}@localhost IDENTIFIED BY '#{MYSQL_CONFIG[:password]}';
14
20
  GRANT ALL PRIVILEGES ON `#{MYSQL_CONFIG[:database]}`.* TO #{MYSQL_CONFIG[:username]}@localhost;
15
21
  GRANT ALL PRIVILEGES ON `test\_%`.* TO #{MYSQL_CONFIG[:username]}@localhost;
16
- SET PASSWORD FOR #{MYSQL_CONFIG[:username]}@localhost = PASSWORD('#{MYSQL_CONFIG[:password]}');
17
22
  SQL
23
+
18
24
  params = { '-u' => 'root' }
19
- if ENV['DATABASE_YML']; require 'yaml'
20
- params['-p'] = YAML.load(File.new(ENV['DATABASE_YML']))["production"]["password"]
25
+ if ENV['DATABASE_YML']
26
+ require 'yaml'
27
+ params['-p'] = YAML.load(File.new(ENV['DATABASE_YML']))["production"]["password"]
21
28
  end
22
29
  params['-u'] = ENV['MY_USER'] if ENV['MY_USER']
23
30
  params['-p'] = ENV['MY_PASSWORD'] if ENV['MY_PASSWORD']
31
+
24
32
  puts "Creating MySQL (test) database: #{MYSQL_CONFIG[:database]}"
25
- sh "cat #{script.path} | #{mysql} -f #{params.map {|k, v| "#{k}#{v}"}.join(' ')}", :verbose => $VERBOSE # so password is not echoed
33
+ mysql_cmd = "#{mysql} -f #{params.map {|k, v| "#{k}#{v}"}.join(' ')}"
34
+ sh "cat #{clean_script.path} | #{mysql_cmd}", verbose: false
35
+ sh "cat #{script.path} | #{mysql_cmd}", verbose: $VERBOSE # so password is not echoed
26
36
  end
27
37
 
28
38
  desc "Creates the test database for PostgreSQL"
@@ -30,8 +40,10 @@ SET PASSWORD FOR #{MYSQL_CONFIG[:username]}@localhost = PASSWORD('#{MYSQL_CONFIG
30
40
  require File.expand_path('../../test/shared_helper', __FILE__)
31
41
  fail 'could not create test database: psql executable not found' unless psql = which('psql')
32
42
  fail 'could not create test database: missing "postgres" role' unless PostgresHelper.postgres_role?
43
+
33
44
  load 'test/db/postgres_config.rb' # rescue nil
34
45
  puts POSTGRES_CONFIG.inspect if $VERBOSE
46
+
35
47
  script = sql_script <<-SQL, 'psql'
36
48
  DROP DATABASE IF EXISTS #{POSTGRES_CONFIG[:database]};
37
49
  DROP USER IF EXISTS #{POSTGRES_CONFIG[:username]};
@@ -40,12 +52,14 @@ CREATE DATABASE #{POSTGRES_CONFIG[:database]} OWNER #{POSTGRES_CONFIG[:username]
40
52
  TEMPLATE template0
41
53
  ENCODING '#{POSTGRES_CONFIG[:encoding]}' LC_COLLATE '#{POSTGRES_CONFIG[:collate]}' LC_CTYPE '#{POSTGRES_CONFIG[:collate]}';
42
54
  SQL
55
+
43
56
  params = { '-U' => ENV['PSQL_USER'] || 'postgres' }
44
57
  params['-q'] = nil unless $VERBOSE
58
+
45
59
  puts "Creating PostgreSQL (test) database: #{POSTGRES_CONFIG[:database]}"
46
- sh "cat #{script.path} | #{psql} #{params.to_a.join(' ')}", :verbose => $VERBOSE
60
+ sh "cat #{script.path} | #{psql} #{params.to_a.join(' ')}", verbose: $VERBOSE
47
61
  end
48
- task :postgres => :postgresql
62
+ task postgres: :postgresql
49
63
 
50
64
  private
51
65
 
@@ -284,7 +284,7 @@ public class RubyJdbcConnection extends RubyObject {
284
284
  public static int mapTransactionIsolationLevel(final IRubyObject isolation) {
285
285
  final Object isolationString;
286
286
  if ( isolation instanceof RubySymbol ) {
287
- isolationString = isolation.toString(); // RubySymbol.toString (interned)
287
+ isolationString = ((RubySymbol) isolation).asJavaString(); // RubySymbol (interned)
288
288
  }
289
289
  else {
290
290
  isolationString = isolation.asString().toString().toLowerCase(Locale.ENGLISH).intern();
@@ -2716,7 +2716,7 @@ public class RubyJdbcConnection extends RubyObject {
2716
2716
 
2717
2717
  private String default_timezone(final ThreadContext context) {
2718
2718
  final RubyClass base = getBase(context.runtime);
2719
- return default_timezone.call(context, base, base).toString(); // :utc (or :local)
2719
+ return default_timezone.call(context, base, base).asJavaString(); // :utc (or :local)
2720
2720
  }
2721
2721
 
2722
2722
  // ActiveRecord::Base.default_timezone
@@ -2898,14 +2898,13 @@ public class RubyJdbcConnection extends RubyObject {
2898
2898
  final RubySymbol type = (RubySymbol) attributeSQLType(context, attribute);
2899
2899
 
2900
2900
  // For some reason the driver doesn't like "character varying" as a type
2901
- if ( type.eql(context.runtime.newSymbol("string")) ){
2902
- return "text";
2903
- }
2901
+ if ( type.eql(context.runtime.newSymbol("string")) ) return "text";
2904
2902
 
2905
2903
  final RubyHash nativeTypes = (RubyHash) getAdapter().callMethod(context, "native_database_types");
2904
+ // e.g. `integer: { name: 'integer' }`
2906
2905
  final RubyHash typeInfo = (RubyHash) nativeTypes.op_aref(context, type);
2907
2906
 
2908
- return typeInfo.op_aref(context, context.runtime.newSymbol("name")).asString().toString();
2907
+ return typeInfo.op_aref(context, context.runtime.newSymbol("name")).toString();
2909
2908
  }
2910
2909
 
2911
2910
  protected void setXmlParameter(final ThreadContext context,
@@ -3446,12 +3445,14 @@ public class RubyJdbcConnection extends RubyObject {
3446
3445
  if ( ! gotConnection ) { // SQLException from driver/data-source
3447
3446
  reconnectOnRetry = connected;
3448
3447
  }
3448
+ else if (!autoCommit) {
3449
+ // never retry inside a transaction
3450
+ break;
3451
+ }
3449
3452
  else if ( isTransient(exception) ) {
3450
3453
  reconnectOnRetry = false; // continue;
3451
3454
  }
3452
3455
  else {
3453
- if ( ! autoCommit ) break; // do not retry if (inside) transactions
3454
-
3455
3456
  if ( isConnectionValid(context, getConnectionImpl()) ) {
3456
3457
  break; // connection not broken yet failed (do not retry)
3457
3458
  }
@@ -55,6 +55,7 @@ import org.joda.time.DateTimeZone;
55
55
  import org.jruby.*;
56
56
  import org.jruby.anno.JRubyMethod;
57
57
  import org.jruby.exceptions.RaiseException;
58
+ import org.jruby.ext.bigdecimal.RubyBigDecimal;
58
59
  import org.jruby.javasupport.JavaUtil;
59
60
  import org.jruby.runtime.ObjectAllocator;
60
61
  import org.jruby.runtime.ThreadContext;
@@ -100,6 +101,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
100
101
  POSTGRES_JDBC_TYPE_FOR.put("line", Types.OTHER);
101
102
  POSTGRES_JDBC_TYPE_FOR.put("lseg", Types.OTHER);
102
103
  POSTGRES_JDBC_TYPE_FOR.put("ltree", Types.OTHER);
104
+ POSTGRES_JDBC_TYPE_FOR.put("money", Types.OTHER);
103
105
  POSTGRES_JDBC_TYPE_FOR.put("numrange", Types.OTHER);
104
106
  POSTGRES_JDBC_TYPE_FOR.put("path", Types.OTHER);
105
107
  POSTGRES_JDBC_TYPE_FOR.put("point", Types.OTHER);
@@ -441,6 +443,14 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
441
443
  }
442
444
  break;
443
445
 
446
+ case "money":
447
+ if (value instanceof RubyBigDecimal) {
448
+ statement.setBigDecimal(index, ((RubyBigDecimal) value).getValue());
449
+ } else {
450
+ setPGobjectParameter(statement, index, value, columnType);
451
+ }
452
+ break;
453
+
444
454
  case "lseg":
445
455
  pointValues = parseDoubles(value);
446
456
  statement.setObject(index, new PGlseg(pointValues[0], pointValues[1], pointValues[2], pointValues[3]));
@@ -485,7 +495,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
485
495
  return points;
486
496
  }
487
497
 
488
- private Double[] parseDoubles(IRubyObject value) {
498
+ private static Double[] parseDoubles(IRubyObject value) {
489
499
  Matcher matches = doubleValuePattern.matcher(value.toString());
490
500
  ArrayList<Double> doubles = new ArrayList<Double>(4); // Paths and polygons may be larger but this covers points/circles/boxes/line segments
491
501
 
@@ -25,12 +25,9 @@ package arjdbc.util;
25
25
 
26
26
  import java.io.IOException;
27
27
  import java.io.InputStream;
28
- import java.nio.charset.Charset;
29
28
 
30
29
  import org.jcodings.Encoding;
31
- import org.jcodings.specific.UTF8Encoding;
32
30
  import org.jruby.Ruby;
33
- import org.jruby.RubyEncoding;
34
31
  import org.jruby.RubyString;
35
32
  import org.jruby.util.ByteList;
36
33
 
@@ -61,18 +58,6 @@ public abstract class StringHelper {
61
58
  return RubyString.newString(runtime, new ByteList(bytes, false));
62
59
  }
63
60
 
64
- private static final Charset ASCII_CHARSET = Charset.forName("ISO-8859-1");
65
-
66
- public static RubyString newASCIIString(final Ruby runtime, final String str) {
67
- final ByteList byteList = new ByteList(str.getBytes(ASCII_CHARSET), false);
68
- return RubyString.newString(runtime, byteList);
69
- }
70
-
71
- public static RubyString newUTF8String(final Ruby runtime, final byte[] bytes) {
72
- final ByteList byteList = new ByteList(bytes, false);
73
- return RubyString.newString(runtime, byteList, UTF8Encoding.INSTANCE);
74
- }
75
-
76
61
  public static RubyString newDefaultInternalString(final Ruby runtime, final byte[] bytes) {
77
62
  final ByteList byteList = new ByteList(bytes, false);
78
63
  Encoding enc = runtime.getDefaultInternalEncoding();
@@ -83,18 +68,19 @@ public abstract class StringHelper {
83
68
  public static RubyString newDefaultInternalString(final Ruby runtime, final CharSequence str) {
84
69
  Encoding enc = runtime.getDefaultInternalEncoding();
85
70
  if (enc == null) enc = runtime.getEncodingService().getJavaDefault();
86
- return RubyString.newString(runtime, new ByteList(RubyEncoding.encode(str, enc.getCharset()), enc));
71
+ return new RubyString(runtime, runtime.getString(), str, enc);
87
72
  }
88
73
 
74
+ // NOTE: a 'better' RubyString.newInternalFromJavaExternal - to be back-ported in JRuby 9.2
89
75
  public static RubyString newDefaultInternalString(final Ruby runtime, final String str) {
90
- return RubyString.newInternalFromJavaExternal(runtime, str);
76
+ Encoding enc = runtime.getDefaultInternalEncoding();
77
+ if (enc == null) enc = runtime.getEncodingService().getJavaDefault();
78
+ return RubyString.newString(runtime, str, enc);
91
79
  }
92
80
 
93
81
  public static int readBytes(final ByteList output, final InputStream input)
94
82
  throws IOException {
95
- @SuppressWarnings("deprecation") // capacity :
96
- final int buffSize = output.bytes.length - output.begin;
97
- return readBytes(output, input, buffSize);
83
+ return readBytes(output, input, output.unsafeBytes().length - output.getBegin());
98
84
  }
99
85
 
100
86
  public static int readBytes(final ByteList output, final InputStream input, int buffSize)
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: '51.1'
4
+ version: '51.2'
5
5
  platform: java
6
6
  authors:
7
7
  - Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-16 00:00:00.000000000 Z
11
+ date: 2018-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activerecord
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: 5.1.0
19
+ name: activerecord
20
+ prerelease: false
21
+ type: :runtime
20
22
  version_requirements: !ruby/object:Gem::Requirement
21
23
  requirements:
22
24
  - - "~>"
23
25
  - !ruby/object:Gem::Version
24
26
  version: 5.1.0
25
- prerelease: false
26
- type: :runtime
27
27
  description: 'AR-JDBC is a database adapter for Rails'' ActiveRecord component designed
28
28
  to be used with JRuby built upon Java''s JDBC API for database access. Provides
29
29
  (ActiveRecord) built-in adapters: MySQL, PostgreSQL and SQLite3 as well as adapters
@@ -119,7 +119,6 @@ files:
119
119
  - lib/arjdbc/jdbc/error.rb
120
120
  - lib/arjdbc/jdbc/extension.rb
121
121
  - lib/arjdbc/jdbc/java.rb
122
- - lib/arjdbc/jdbc/jdbc.rake
123
122
  - lib/arjdbc/jdbc/railtie.rb
124
123
  - lib/arjdbc/jdbc/rake_tasks.rb
125
124
  - lib/arjdbc/jdbc/serialized_attributes_helper.rb
@@ -157,8 +156,6 @@ files:
157
156
  - lib/arjdbc/tasks.rb
158
157
  - lib/arjdbc/tasks/database_tasks.rb
159
158
  - lib/arjdbc/tasks/databases.rake
160
- - lib/arjdbc/tasks/databases3.rake
161
- - lib/arjdbc/tasks/databases4.rake
162
159
  - lib/arjdbc/tasks/db2_database_tasks.rb
163
160
  - lib/arjdbc/tasks/derby_database_tasks.rb
164
161
  - lib/arjdbc/tasks/h2_database_tasks.rb
@@ -181,7 +178,6 @@ files:
181
178
  - rakelib/01-tomcat.rake
182
179
  - rakelib/02-test.rake
183
180
  - rakelib/bundler_ext.rb
184
- - rakelib/compile.rake
185
181
  - rakelib/db.rake
186
182
  - rakelib/rails.rake
187
183
  - src/java/arjdbc/ArJdbcModule.java
@@ -1,4 +0,0 @@
1
- load 'arjdbc/tasks.rb'
2
-
3
- require 'arjdbc'
4
- ArJdbc.deprecate "load 'arjdbc/tasks.rb' (or 'arjdbc/tasks/database.rake') instead of 'arjdbc/jdbc/jdbc.rake'"
@@ -1,215 +0,0 @@
1
- module ArJdbc
2
- module Tasks
3
- class << self
4
-
5
- # API similar to ActiveRecord::Tasks::DatabaseTasks on AR 4.0
6
-
7
- def create(config)
8
- tasks_instance(config).create
9
- end
10
-
11
- def drop(config)
12
- tasks_instance(config).drop
13
- end
14
-
15
- def purge(config)
16
- tasks_instance(config).purge
17
- end
18
-
19
- def charset(config)
20
- tasks_instance(config).charset
21
- end
22
-
23
- def collation(config)
24
- tasks_instance(config).collation
25
- end
26
-
27
- def structure_dump(config, filename)
28
- tasks_instance(config).structure_dump(filename)
29
- end
30
-
31
- def structure_load(config, filename)
32
- tasks_instance(config).structure_load(filename)
33
- end
34
-
35
- end
36
- end
37
- end
38
-
39
- namespace :db do
40
-
41
- class << self
42
- alias_method :_rails_create_database, :create_database
43
- alias_method :_rails_drop_database, :drop_database
44
- end
45
-
46
- def create_database(config)
47
- case config['adapter']
48
- when /mysql2/
49
- unless defined? Mysql2::Error
50
- # NOTE: fake it for create_database(config)
51
- Object.const_set :Mysql2, Module.new
52
- Mysql2.const_set :Error, ActiveRecord::JDBCError
53
- ActiveRecord::JDBCError.class_eval do
54
- def error; self end # Mysql2::Error#error
55
- end
56
- end
57
- _rails_create_database adapt_jdbc_config(config)
58
- when /mysql/
59
- unless defined? Mysql::Error
60
- # NOTE: fake it for create_database(config)
61
- Object.const_set :Mysql, Module.new
62
- Mysql.const_set :Error, ActiveRecord::JDBCError
63
- ActiveRecord::JDBCError.class_eval do
64
- def error; self end # Mysql::Error#error
65
- end
66
- end
67
- _rails_create_database adapt_jdbc_config(config)
68
- when /postgresql|sqlite/
69
- _rails_create_database adapt_jdbc_config(config)
70
- else
71
- ArJdbc::Tasks.create(config)
72
- end
73
- end
74
-
75
- def drop_database(config)
76
- case config['adapter']
77
- when /mysql|postgresql|sqlite/
78
- _rails_drop_database adapt_jdbc_config(config)
79
- else
80
- ArJdbc::Tasks.drop(config)
81
- end
82
- end
83
-
84
- redefine_task :charset do # available on 2.3
85
- ArJdbc::Tasks.charset ActiveRecord::Base.configurations[rails_env]
86
- end
87
-
88
- redefine_task :collation do # available on 2.3
89
- ArJdbc::Tasks.collation ActiveRecord::Base.configurations[rails_env]
90
- end
91
-
92
- namespace :structure do
93
-
94
- redefine_task :dump do
95
- config = ActiveRecord::Base.configurations[rails_env] # current_config
96
- filename = structure_sql
97
-
98
- case config['adapter']
99
- when /mysql/
100
- ActiveRecord::Base.establish_connection(config)
101
- File.open(filename, 'w:utf-8') { |f| f << ActiveRecord::Base.connection.structure_dump }
102
- when /postgresql/
103
- ActiveRecord::Base.establish_connection(config)
104
-
105
- ENV['PGHOST'] = config['host'] if config['host']
106
- ENV['PGPORT'] = config['port'].to_s if config['port']
107
- ENV['PGPASSWORD'] = config['password'].to_s if config['password']
108
- ENV['PGUSER'] = config['username'].to_s if config['username']
109
-
110
- require 'shellwords'
111
- search_path = config['schema_search_path']
112
- unless search_path.blank?
113
- search_path = search_path.split(",").map{ |part| "--schema=#{Shellwords.escape(part.strip)}" }.join(" ")
114
- end
115
- sh "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}"
116
-
117
- File.open(filename, 'a') { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
118
- when /sqlite/
119
- dbfile = config['database']
120
- sh "sqlite3 #{dbfile} .schema > #{filename}"
121
- else
122
- ActiveRecord::Base.establish_connection(config)
123
- ArJdbc::Tasks.structure_dump(config, filename)
124
- end
125
-
126
- if ActiveRecord::Base.connection.supports_migrations?
127
- File.open(filename, 'a') { |f| f << ActiveRecord::Base.connection.dump_schema_information }
128
- end
129
-
130
- end
131
-
132
- redefine_task :load do
133
- config = current_config
134
- filename = structure_sql
135
-
136
- case config['adapter']
137
- when /mysql/
138
- ActiveRecord::Base.establish_connection(config)
139
- ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
140
- IO.read(filename).split("\n\n").each do |table|
141
- ActiveRecord::Base.connection.execute(table)
142
- end
143
- when /postgresql/
144
- ENV['PGHOST'] = config['host'] if config['host']
145
- ENV['PGPORT'] = config['port'].to_s if config['port']
146
- ENV['PGPASSWORD'] = config['password'].to_s if config['password']
147
- ENV['PGUSER'] = config['username'].to_s if config['username']
148
-
149
- `psql -f "#{filename}" #{config['database']}`
150
- when /sqlite/
151
- dbfile = config['database']
152
- `sqlite3 #{dbfile} < "#{filename}"`
153
- else
154
- ArJdbc::Tasks.structure_load(config, filename)
155
- end
156
- end
157
-
158
- def structure_sql
159
- ENV['DB_STRUCTURE'] ||= begin
160
- root = defined?(Rails.root) ? Rails.root : ( RAILS_ROOT rescue nil )
161
- if ActiveRecord::VERSION::STRING > '3.2'
162
- root ? File.join(root, "db", "structure.sql") : File.join("db", "structure.sql")
163
- else
164
- root ? File.join(root, "db/#{rails_env}_structure.sql") : "db/#{rails_env}_structure.sql"
165
- end
166
- end
167
- end
168
-
169
- end
170
-
171
- namespace :test do
172
-
173
- # desc "Recreate the test database from an existent structure.sql file"
174
- redefine_task :load_structure => 'db:test:purge' do # not on 2.3
175
- begin
176
- current_config(:config => ActiveRecord::Base.configurations['test'])
177
- Rake::Task["db:structure:load"].invoke
178
- ensure
179
- current_config(:config => nil)
180
- end
181
- end
182
-
183
- # desc "Recreate the test database from a fresh structure.sql file"
184
- redefine_task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
185
- # same as on 3.2 - but this task gets changed on 2.3 by depending on :load_structure
186
-
187
- # desc "Empty the test database"
188
- redefine_task :purge do
189
- config = ActiveRecord::Base.configurations['test']
190
- case config['adapter']
191
- when /mysql/
192
- ActiveRecord::Base.establish_connection(:test)
193
- options = mysql_creation_options(config) rescue config
194
- ActiveRecord::Base.connection.recreate_database(config['database'], options)
195
- when /postgresql/
196
- ActiveRecord::Base.clear_active_connections!
197
- # drop_database(config) :
198
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
199
- ActiveRecord::Base.connection.drop_database config['database']
200
- # create_database(config) :
201
- encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
202
- ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => encoding))
203
- when /sqlite/
204
- dbfile = config['database']
205
- File.delete(dbfile) if File.exist?(dbfile)
206
- else
207
- ArJdbc::Tasks.purge(config)
208
- end
209
- end
210
- # only does (:purge => :environment) on AR < 3.2
211
- task :purge => :load_config if Rake::Task.task_defined?(:load_config)
212
-
213
- end
214
-
215
- end
@@ -1,39 +0,0 @@
1
- module ActiveRecord::Tasks
2
-
3
- DatabaseTasks.module_eval do
4
-
5
- # patched to adapt jdbc configuration
6
- def each_current_configuration(environment)
7
- environments = [environment]
8
- environments << 'test' if environment == 'development'
9
-
10
- configurations = ActiveRecord::Base.configurations.values_at(*environments)
11
- configurations.compact.each do |config|
12
- yield adapt_jdbc_config(config) unless config['database'].blank?
13
- end
14
- end
15
-
16
- # patched to adapt jdbc configuration
17
- def each_local_configuration
18
- ActiveRecord::Base.configurations.each_value do |config|
19
- next unless config['database']
20
-
21
- if local_database?(config)
22
- yield adapt_jdbc_config(config)
23
- else
24
- $stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host."
25
- end
26
- end
27
- end
28
-
29
- end
30
-
31
- MySQLDatabaseTasks.class_eval do
32
-
33
- def error_class
34
- ActiveRecord::JDBCError
35
- end
36
-
37
- end
38
-
39
- end
data/rakelib/compile.rake DELETED
@@ -1,70 +0,0 @@
1
- jar_file = File.join(*%w(lib arjdbc jdbc adapter_java.jar))
2
- begin
3
- require 'ant'
4
- directory classes = "pkg/classes"
5
- CLEAN << classes
6
-
7
- driver_jars = []
8
- # PostgreSQL driver :
9
- driver_jars << Dir.glob("jdbc-postgres/lib/*.jar").sort.last
10
-
11
- file jar_file => FileList['src/java/**/*.java', 'pkg/classes'] do
12
- rm_rf FileList["#{classes}/**/*"]
13
- ant.javac :srcdir => "src/java", :destdir => "pkg/classes",
14
- :source => "7", :target => "7", :debug => true, :deprecation => true,
15
- :classpath => "${java.class.path}:${sun.boot.class.path}:#{driver_jars.join(':')}",
16
- :includeantRuntime => false
17
-
18
- ant.tstamp do |ts|
19
- ts.format(:property => 'TODAY', :pattern => 'yyyy-MM-dd HH:mm:ss')
20
- end
21
-
22
- begin
23
- require 'arjdbc/version'
24
- rescue LoadError
25
- path = File.expand_path('../lib', File.dirname(__FILE__))
26
- unless $LOAD_PATH.include?(path)
27
- $LOAD_PATH << path; retry
28
- end
29
- end
30
-
31
- gem_version = Gem::Version.create(ArJdbc::VERSION)
32
- if gem_version.segments.last == 'DEV'
33
- version = gem_version.segments[0...-1] # 1.3.0.DEV -> 1.3.0
34
- else
35
- version = gem_version.segments.dup
36
- end
37
- version = version.join('.')
38
-
39
- ant.manifest :file => 'MANIFEST.MF' do |mf|
40
- mf.attribute :name => 'Built-By', :value => '${user.name}'
41
- mf.attribute :name => 'Built-Time', :value => '${TODAY}'
42
- mf.attribute :name => 'Built-Jdk', :value => '${java.version}'
43
- mf.attribute :name => 'Built-JRuby', :value => JRUBY_VERSION
44
-
45
- mf.attribute :name => 'Specification-Title', :value => 'ActiveRecord-JDBC'
46
- mf.attribute :name => 'Specification-Version', :value => '1.3'
47
- mf.attribute :name => 'Specification-Vendor', :value => 'JRuby'
48
- mf.attribute :name => 'Implementation-Version', :value => version
49
- mf.attribute :name => 'Implementation-Vendor', :value => 'The JRuby Team'
50
- end
51
-
52
- ant.jar :basedir => "pkg/classes", :includes => "**/*.class",
53
- :destfile => jar_file, :manifest => 'MANIFEST.MF'
54
- end
55
-
56
- desc "Compile the native Java code."
57
- task :jar => jar_file
58
-
59
- namespace :jar do
60
- task :force do
61
- rm jar_file if File.exist?(jar_file)
62
- Rake::Task['jar'].invoke
63
- end
64
- end
65
-
66
- rescue LoadError
67
- task :jar do
68
- puts "Run 'jar' with JRuby to re-compile the agent extension class"
69
- end
70
- end