activerecord-jdbc-adapter 50.1-java → 50.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: 5b084099c62150191b20ce945af56f678dbea01a
4
- data.tar.gz: 503f2431a2d3d8a2a9f8aed698dea351cead1e91
3
+ metadata.gz: 0222c94a160b13665c886d04020a3e549a1cd040
4
+ data.tar.gz: ef8cf19be8e3e6febef802e235a940069b445168
5
5
  SHA512:
6
- metadata.gz: ccda53ecea8b3f8d2107ceba72c66a927168d4a9ea3fbb2e06c548276401e69a9b6ffbfaa737a92a2617b8ac2a7295555d09b73dc98c431fbf0f5e19456aa6e2
7
- data.tar.gz: 9b8efb23326005581ec55a168175e366af08b3025f4ca025a7cc6f391a3b6484889257b9b61fce0baa9746a8339598edbd298e6939b82e90e8c1cf71185d4dd4
6
+ metadata.gz: d105602d32ac438487c69d77120006847ac2f995e3434820a594db4d4a04a40a2880d8a8c4101ff3581ce7391aff085864df9f6b9ae195858a41159172138cb8
7
+ data.tar.gz: 639a1928003e48251aa9c143298643bb282f93086df821c1bf31dac8f5c425c5b55b4654f7bdbf472e78af653dd0481ad3764576ed71211b3747b675371d9e32
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
@@ -44,7 +44,7 @@ Gem::Specification.new do |gem|
44
44
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
45
45
  gem.test_files = gem.files.grep(%r{^test/})
46
46
 
47
- gem.add_dependency 'activerecord', '~> 5.0.0'
47
+ gem.add_dependency 'activerecord', '~> 5.0.0', '>= 5.0.3'
48
48
 
49
49
  #gem.add_development_dependency 'test-unit', '2.5.4'
50
50
  #gem.add_development_dependency 'test-unit-context', '>= 0.3.0'
@@ -58,7 +58,17 @@ module ArJdbc
58
58
  end
59
59
  end
60
60
 
61
+ def extract_raw_bind_values(binds)
62
+ binds.map(&:value_for_database)
63
+ end
61
64
 
65
+ # this version of log() automatically fills type_casted_binds from binds if necessary
66
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
67
+ if binds.any? && (type_casted_binds.nil? || type_casted_binds.empty?)
68
+ type_casted_binds = ->{ extract_raw_bind_values(binds) }
69
+ end
70
+ super
71
+ end
62
72
  end
63
73
  end
64
74
  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
@@ -54,8 +54,30 @@ module ArJdbc
54
54
  @postgresql_version ||=
55
55
  begin
56
56
  version = @connection.database_product
57
- if version =~ /PostgreSQL (\d+)\.(\d+)\.(\d+)/
58
- ($1.to_i * 10000) + ($2.to_i * 100) + $3.to_i
57
+ if match = version.match(/([\d\.]*\d).*?/)
58
+ version = match[1].split('.').map(&:to_i)
59
+ # PostgreSQL version representation does not have more than 4 digits
60
+ # From version 10 onwards, PG has changed its versioning policy to
61
+ # limit it to only 2 digits. i.e. in 10.x, 10 being the major
62
+ # version and x representing the patch release
63
+ # Refer to:
64
+ # https://www.postgresql.org/support/versioning/
65
+ # https://www.postgresql.org/docs/10/static/libpq-status.html -> PQserverVersion()
66
+ # for more info
67
+
68
+ if version.size >= 3
69
+ (version[0] * 100 + version[1]) * 100 + version[2]
70
+ elsif version.size == 2
71
+ if version[0] >= 10
72
+ version[0] * 100 * 100 + version[1]
73
+ else
74
+ (version[0] * 100 + version[1]) * 100
75
+ end
76
+ elsif version.size == 1
77
+ version[0] * 100 * 100
78
+ else
79
+ 0
80
+ end
59
81
  else
60
82
  0
61
83
  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
@@ -237,6 +261,10 @@ module ArJdbc
237
261
 
238
262
  def supports_views?; true end
239
263
 
264
+ def supports_datetime_with_precision?; true end
265
+
266
+ def supports_comments?; true end
267
+
240
268
  # Does PostgreSQL support standard conforming strings?
241
269
  def supports_standard_conforming_strings?
242
270
  standard_conforming_strings?
@@ -247,6 +275,14 @@ module ArJdbc
247
275
  postgresql_version >= 90000
248
276
  end
249
277
 
278
+ def supports_materialized_views?
279
+ postgresql_version >= 90300
280
+ end
281
+
282
+ def supports_json?
283
+ postgresql_version >= 90200
284
+ end
285
+
250
286
  def supports_insert_with_returning?
251
287
  postgresql_version >= 80200
252
288
  end
@@ -370,6 +406,12 @@ module ArJdbc
370
406
  @connection.configure_connection
371
407
  end
372
408
 
409
+ def default_sequence_name(table_name, pk = "id") #:nodoc:
410
+ serial_sequence(table_name, pk)
411
+ rescue ActiveRecord::StatementInvalid
412
+ %Q("#{table_name}_#{pk}_seq")
413
+ end
414
+
373
415
  def last_insert_id_result(sequence_name)
374
416
  exec_query("SELECT currval('#{sequence_name}')", 'SQL')
375
417
  end
@@ -649,11 +691,11 @@ module ActiveRecord::ConnectionAdapters
649
691
  # AR expects OID to be available on the adapter
650
692
  OID = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
651
693
 
652
- def initialize(connection, logger = nil, config = {})
694
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
653
695
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
654
696
  @local_tz = nil
655
697
 
656
- super # configure_connection happens in super
698
+ super(connection, logger, config) # configure_connection happens in super
657
699
 
658
700
  initialize_type_map(@type_map = Type::HashLookupTypeMap.new)
659
701
 
@@ -676,21 +718,6 @@ module ActiveRecord::ConnectionAdapters
676
718
  TableDefinition.new(*args)
677
719
  end
678
720
 
679
- def exec_query(sql, name = nil, binds = [], prepare: false)
680
- super
681
- rescue ActiveRecord::StatementInvalid => e
682
- raise unless e.cause.message.include?('cached plan must not change result type'.freeze)
683
-
684
- if open_transactions > 0
685
- # In a transaction, have to fail it - See AR code for details
686
- raise ActiveRecord::PreparedStatementCacheExpired.new(e.cause.message)
687
- else
688
- # Not in a transaction, clear the prepared statement and try again
689
- delete_cached_statement(sql)
690
- retry
691
- end
692
- end
693
-
694
721
  public :sql_for_insert
695
722
 
696
723
  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
@@ -60,8 +60,7 @@ module ArJdbc
60
60
  Arel::Visitors::SQLite.new(self)
61
61
  end
62
62
 
63
- # Difference we remove connection_options because we are not using it.
64
- def initialize(connection, logger, config)
63
+ def initialize(connection, logger, connection_options, config)
65
64
  super(connection, logger, config)
66
65
 
67
66
  @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 = '50.1'
2
+ VERSION = '50.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();
@@ -2712,7 +2712,7 @@ public class RubyJdbcConnection extends RubyObject {
2712
2712
 
2713
2713
  private String default_timezone(final ThreadContext context) {
2714
2714
  final RubyClass base = getBase(context.runtime);
2715
- return default_timezone.call(context, base, base).toString(); // :utc (or :local)
2715
+ return default_timezone.call(context, base, base).asJavaString(); // :utc (or :local)
2716
2716
  }
2717
2717
 
2718
2718
  // ActiveRecord::Base.default_timezone
@@ -2894,14 +2894,13 @@ public class RubyJdbcConnection extends RubyObject {
2894
2894
  final RubySymbol type = (RubySymbol) attributeSQLType(context, attribute);
2895
2895
 
2896
2896
  // For some reason the driver doesn't like "character varying" as a type
2897
- if ( type.eql(context.runtime.newSymbol("string")) ){
2898
- return "text";
2899
- }
2897
+ if ( type.eql(context.runtime.newSymbol("string")) ) return "text";
2900
2898
 
2901
2899
  final RubyHash nativeTypes = (RubyHash) getAdapter().callMethod(context, "native_database_types");
2900
+ // e.g. `integer: { name: 'integer' }`
2902
2901
  final RubyHash typeInfo = (RubyHash) nativeTypes.op_aref(context, type);
2903
2902
 
2904
- return typeInfo.op_aref(context, context.runtime.newSymbol("name")).asString().toString();
2903
+ return typeInfo.op_aref(context, context.runtime.newSymbol("name")).toString();
2905
2904
  }
2906
2905
 
2907
2906
  protected void setXmlParameter(final ThreadContext context,
@@ -3442,12 +3441,14 @@ public class RubyJdbcConnection extends RubyObject {
3442
3441
  if ( ! gotConnection ) { // SQLException from driver/data-source
3443
3442
  reconnectOnRetry = connected;
3444
3443
  }
3444
+ else if (!autoCommit) {
3445
+ // never retry inside a transaction
3446
+ break;
3447
+ }
3445
3448
  else if ( isTransient(exception) ) {
3446
3449
  reconnectOnRetry = false; // continue;
3447
3450
  }
3448
3451
  else {
3449
- if ( ! autoCommit ) break; // do not retry if (inside) transactions
3450
-
3451
3452
  if ( isConnectionValid(context, getConnectionImpl()) ) {
3452
3453
  break; // connection not broken yet failed (do not retry)
3453
3454
  }
@@ -54,6 +54,7 @@ import org.joda.time.DateTimeZone;
54
54
  import org.jruby.*;
55
55
  import org.jruby.anno.JRubyMethod;
56
56
  import org.jruby.exceptions.RaiseException;
57
+ import org.jruby.ext.bigdecimal.RubyBigDecimal;
57
58
  import org.jruby.javasupport.JavaUtil;
58
59
  import org.jruby.runtime.ObjectAllocator;
59
60
  import org.jruby.runtime.ThreadContext;
@@ -99,6 +100,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
99
100
  POSTGRES_JDBC_TYPE_FOR.put("line", Types.OTHER);
100
101
  POSTGRES_JDBC_TYPE_FOR.put("lseg", Types.OTHER);
101
102
  POSTGRES_JDBC_TYPE_FOR.put("ltree", Types.OTHER);
103
+ POSTGRES_JDBC_TYPE_FOR.put("money", Types.OTHER);
102
104
  POSTGRES_JDBC_TYPE_FOR.put("numrange", Types.OTHER);
103
105
  POSTGRES_JDBC_TYPE_FOR.put("path", Types.OTHER);
104
106
  POSTGRES_JDBC_TYPE_FOR.put("point", Types.OTHER);
@@ -440,6 +442,14 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
440
442
  }
441
443
  break;
442
444
 
445
+ case "money":
446
+ if (value instanceof RubyBigDecimal) {
447
+ statement.setBigDecimal(index, ((RubyBigDecimal) value).getValue());
448
+ } else {
449
+ setPGobjectParameter(statement, index, value, columnType);
450
+ }
451
+ break;
452
+
443
453
  case "lseg":
444
454
  pointValues = parseDoubles(value);
445
455
  statement.setObject(index, new PGlseg(pointValues[0], pointValues[1], pointValues[2], pointValues[3]));
@@ -484,7 +494,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
484
494
  return points;
485
495
  }
486
496
 
487
- private Double[] parseDoubles(IRubyObject value) {
497
+ private static Double[] parseDoubles(IRubyObject value) {
488
498
  Matcher matches = doubleValuePattern.matcher(value.toString());
489
499
  ArrayList<Double> doubles = new ArrayList<Double>(4); // Paths and polygons may be larger but this covers points/circles/boxes/line segments
490
500
 
@@ -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,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: '50.1'
4
+ version: '50.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.0.0
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 5.0.3
22
+ name: activerecord
23
+ prerelease: false
24
+ type: :runtime
20
25
  version_requirements: !ruby/object:Gem::Requirement
21
26
  requirements:
22
27
  - - "~>"
23
28
  - !ruby/object:Gem::Version
24
29
  version: 5.0.0
25
- prerelease: false
26
- type: :runtime
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.3
27
33
  description: 'AR-JDBC is a database adapter for Rails'' ActiveRecord component designed
28
34
  to be used with JRuby built upon Java''s JDBC API for database access. Provides
29
35
  (ActiveRecord) built-in adapters: MySQL, PostgreSQL and SQLite3 as well as adapters
@@ -119,7 +125,6 @@ files:
119
125
  - lib/arjdbc/jdbc/error.rb
120
126
  - lib/arjdbc/jdbc/extension.rb
121
127
  - lib/arjdbc/jdbc/java.rb
122
- - lib/arjdbc/jdbc/jdbc.rake
123
128
  - lib/arjdbc/jdbc/railtie.rb
124
129
  - lib/arjdbc/jdbc/rake_tasks.rb
125
130
  - lib/arjdbc/jdbc/serialized_attributes_helper.rb
@@ -158,8 +163,6 @@ files:
158
163
  - lib/arjdbc/tasks.rb
159
164
  - lib/arjdbc/tasks/database_tasks.rb
160
165
  - lib/arjdbc/tasks/databases.rake
161
- - lib/arjdbc/tasks/databases3.rake
162
- - lib/arjdbc/tasks/databases4.rake
163
166
  - lib/arjdbc/tasks/db2_database_tasks.rb
164
167
  - lib/arjdbc/tasks/derby_database_tasks.rb
165
168
  - lib/arjdbc/tasks/h2_database_tasks.rb
@@ -182,7 +185,6 @@ files:
182
185
  - rakelib/01-tomcat.rake
183
186
  - rakelib/02-test.rake
184
187
  - rakelib/bundler_ext.rb
185
- - rakelib/compile.rake
186
188
  - rakelib/db.rake
187
189
  - rakelib/rails.rake
188
190
  - 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