activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -11
- data/.travis.yml +36 -7
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -6
- data/History.txt +64 -0
- data/README.md +8 -1
- data/Rakefile +3 -1
- data/gemfiles/rails23.gemfile +1 -1
- data/gemfiles/rails23.gemfile.lock +6 -5
- data/gemfiles/rails30.gemfile +1 -1
- data/gemfiles/rails30.gemfile.lock +7 -6
- data/gemfiles/rails31.gemfile +1 -1
- data/gemfiles/rails31.gemfile.lock +6 -5
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails32.gemfile.lock +6 -5
- data/gemfiles/rails40.gemfile +2 -4
- data/gemfiles/rails40.gemfile.lock +37 -51
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
- data/lib/arel/visitors/db2.rb +5 -1
- data/lib/arel/visitors/hsqldb.rb +1 -0
- data/lib/arel/visitors/sql_server.rb +55 -13
- data/lib/arjdbc/db2/adapter.rb +197 -227
- data/lib/arjdbc/db2/as400.rb +124 -0
- data/lib/arjdbc/db2/connection_methods.rb +20 -1
- data/lib/arjdbc/derby/adapter.rb +17 -85
- data/lib/arjdbc/derby/connection_methods.rb +2 -1
- data/lib/arjdbc/discover.rb +55 -47
- data/lib/arjdbc/h2/adapter.rb +52 -18
- data/lib/arjdbc/h2/connection_methods.rb +10 -2
- data/lib/arjdbc/hsqldb/adapter.rb +33 -9
- data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
- data/lib/arjdbc/informix.rb +2 -1
- data/lib/arjdbc/jdbc.rb +5 -1
- data/lib/arjdbc/jdbc/adapter.rb +167 -89
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +25 -3
- data/lib/arjdbc/jdbc/callbacks.rb +9 -8
- data/lib/arjdbc/jdbc/column.rb +8 -20
- data/lib/arjdbc/jdbc/connection.rb +69 -80
- data/lib/arjdbc/jdbc/extension.rb +6 -8
- data/lib/arjdbc/jdbc/jdbc.rake +3 -141
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/mssql/adapter.rb +108 -34
- data/lib/arjdbc/mssql/connection_methods.rb +3 -1
- data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
- data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
- data/lib/arjdbc/mysql/adapter.rb +127 -70
- data/lib/arjdbc/mysql/connection_methods.rb +5 -2
- data/lib/arjdbc/oracle/adapter.rb +124 -94
- data/lib/arjdbc/oracle/connection_methods.rb +2 -1
- data/lib/arjdbc/postgresql/adapter.rb +99 -67
- data/lib/arjdbc/postgresql/column_cast.rb +3 -5
- data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
- data/lib/arjdbc/railtie.rb +3 -1
- data/lib/arjdbc/sqlite3/adapter.rb +60 -43
- data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
- data/lib/arjdbc/sybase.rb +1 -1
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +50 -0
- data/lib/arjdbc/tasks/databases.rake +89 -0
- data/lib/arjdbc/tasks/databases3.rake +203 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +29 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +11 -12
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/02-test.rake +42 -15
- data/rakelib/compile.rake +29 -2
- data/rakelib/db.rake +2 -1
- data/rakelib/rails.rake +23 -6
- data/src/java/arjdbc/ArJdbcModule.java +175 -0
- data/src/java/arjdbc/db2/DB2Module.java +2 -1
- data/src/java/arjdbc/derby/DerbyModule.java +5 -24
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
- data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
- data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
- data/src/java/arjdbc/oracle/OracleModule.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
- data/test/db/db2.rb +14 -7
- data/test/db/db2/rake_test.rb +82 -0
- data/test/db/db2/rake_test_data.sql +35 -0
- data/test/db/db2/simple_test.rb +20 -0
- data/test/db/db2/unit_test.rb +3 -1
- data/test/db/derby.rb +7 -5
- data/test/db/derby/rake_test.rb +96 -0
- data/test/db/derby/simple_test.rb +10 -2
- data/test/db/h2.rb +6 -8
- data/test/db/h2/identity_column_test.rb +35 -0
- data/test/db/h2/offset_test.rb +49 -0
- data/test/db/h2/rake_test.rb +98 -0
- data/test/db/h2/schema_dump_test.rb +5 -1
- data/test/db/hsqldb.rb +6 -10
- data/test/db/hsqldb/rake_test.rb +101 -0
- data/test/db/hsqldb/schema_dump_test.rb +5 -1
- data/test/db/hsqldb/simple_test.rb +8 -0
- data/test/db/jndi_config.rb +1 -3
- data/test/db/jndi_pooled_config.rb +1 -3
- data/test/db/mssql/limit_offset_test.rb +23 -14
- data/test/db/mssql/rake_test.rb +143 -0
- data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
- data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
- data/test/db/mysql/rake_test.rb +97 -0
- data/test/db/mysql/schema_dump_test.rb +11 -11
- data/test/db/mysql/simple_test.rb +52 -3
- data/test/db/mysql/statement_escaping_test.rb +46 -0
- data/test/db/oracle/rake_test.rb +100 -0
- data/test/db/oracle/simple_test.rb +48 -0
- data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
- data/test/db/postgres/active_schema_unit_test.rb +68 -0
- data/test/db/postgres/connection_test.rb +10 -2
- data/test/db/postgres/data_types_test.rb +2 -2
- data/test/db/postgres/ltree_test.rb +6 -5
- data/test/db/postgres/native_types_test.rb +1 -5
- data/test/db/postgres/rake_test.rb +117 -0
- data/test/db/postgres/schema_dump_test.rb +9 -2
- data/test/db/postgres/schema_test.rb +4 -2
- data/test/db/postgres/simple_test.rb +57 -16
- data/test/db/sqlite3.rb +3 -10
- data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
- data/test/db/sqlite3/rake_test.rb +71 -0
- data/test/db/sqlite3/simple_test.rb +9 -9
- data/test/has_many_through.rb +4 -1
- data/test/jdbc/db2.rb +14 -1
- data/test/jdbc_column_test.rb +23 -0
- data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
- data/test/jndi_callbacks_test.rb +26 -28
- data/test/jndi_test.rb +7 -16
- data/test/models/data_types.rb +2 -1
- data/test/models/thing.rb +1 -0
- data/test/rails/mysql.rb +13 -0
- data/test/rails/sqlite3/version.rb +6 -0
- data/test/rails_stub.rb +31 -0
- data/test/rake_test_support.rb +298 -0
- data/test/serialize.rb +2 -4
- data/test/{helper.rb → shared_helper.rb} +0 -0
- data/test/simple.rb +167 -93
- data/test/test_helper.rb +52 -16
- metadata +388 -354
- data/lib/pg.rb +0 -26
- data/test/abstract_db_create.rb +0 -139
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
- data/test/db/mssql/db_create_test.rb +0 -29
- data/test/db/mysql/db_create_test.rb +0 -33
- data/test/db/postgres/db_create_test.rb +0 -44
- data/test/db/postgres/db_drop_test.rb +0 -17
@@ -8,8 +8,8 @@ module ArJdbc
|
|
8
8
|
return string unless String === string
|
9
9
|
|
10
10
|
case string
|
11
|
-
when
|
12
|
-
when '-infinity'
|
11
|
+
when 'infinity' then 1.0 / 0.0
|
12
|
+
when '-infinity' then -1.0 / 0.0
|
13
13
|
when / BC$/
|
14
14
|
super("-" + string.sub(/ BC$/, ""))
|
15
15
|
else
|
@@ -19,9 +19,7 @@ module ArJdbc
|
|
19
19
|
|
20
20
|
def hstore_to_string(object)
|
21
21
|
if Hash === object
|
22
|
-
object.map { |k,v|
|
23
|
-
"#{escape_hstore(k)}=>#{escape_hstore(v)}"
|
24
|
-
}.join ','
|
22
|
+
object.map { |k,v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(',')
|
25
23
|
else
|
26
24
|
object
|
27
25
|
end
|
@@ -6,17 +6,17 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
6
6
|
rescue LoadError # assuming driver.jar is on the class-path
|
7
7
|
end
|
8
8
|
|
9
|
-
config[:username] ||= Java::JavaLang::System.get_property("user.name")
|
10
9
|
config[:host] ||= "localhost"
|
11
10
|
config[:port] ||= 5432
|
11
|
+
config[:username] ||= Java::JavaLang::System.get_property("user.name")
|
12
12
|
config[:url] ||= "jdbc:postgresql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
13
13
|
config[:url] << config[:pg_params] if config[:pg_params]
|
14
14
|
config[:driver] ||= defined?(::Jdbc::Postgres.driver_name) ? ::Jdbc::Postgres.driver_name : 'org.postgresql.Driver'
|
15
|
-
config[:
|
16
|
-
config[:
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
config[:adapter_spec] ||= ::ArJdbc::PostgreSQL
|
16
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter unless config.key?(:adapter_class)
|
17
|
+
# config[:connection_alive_sql] ||= 'SELECT 1'
|
18
|
+
|
19
|
+
jdbc_connection(config)
|
20
20
|
end
|
21
21
|
alias_method :jdbcpostgresql_connection, :postgresql_connection
|
22
22
|
end
|
data/lib/arjdbc/railtie.rb
CHANGED
@@ -3,7 +3,9 @@ require 'rails/railtie'
|
|
3
3
|
module ArJdbc
|
4
4
|
class Railtie < ::Rails::Railtie
|
5
5
|
rake_tasks do
|
6
|
-
|
6
|
+
if defined? ActiveRecord::Railtie # only if AR being used
|
7
|
+
load File.expand_path('tasks.rb', File.dirname(__FILE__))
|
8
|
+
end
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
ArJdbc.load_java_part :SQLite3
|
2
|
+
|
1
3
|
require 'arjdbc/jdbc/missing_functionality_helper'
|
2
4
|
require 'arjdbc/sqlite3/explain_support'
|
3
5
|
|
4
|
-
module
|
6
|
+
module ArJdbc
|
5
7
|
module SQLite3
|
6
8
|
|
7
9
|
def self.column_selector
|
@@ -86,14 +88,21 @@ module ::ArJdbc
|
|
86
88
|
|
87
89
|
end
|
88
90
|
|
89
|
-
def self.arel2_visitors(config)
|
90
|
-
{
|
91
|
-
'sqlite3' => ::Arel::Visitors::SQLite,
|
92
|
-
'jdbcsqlite3' => ::Arel::Visitors::SQLite
|
93
|
-
}
|
91
|
+
def self.arel2_visitors(config = nil)
|
92
|
+
{ 'sqlite3' => ::Arel::Visitors::SQLite, 'jdbcsqlite3' => ::Arel::Visitors::SQLite }
|
94
93
|
end
|
95
94
|
|
96
|
-
|
95
|
+
def new_visitor(config = nil)
|
96
|
+
visitor = ::Arel::Visitors::SQLite
|
97
|
+
( prepared_statements? ? visitor : bind_substitution(visitor) ).new(self)
|
98
|
+
end if defined? ::Arel::Visitors::SQLite
|
99
|
+
|
100
|
+
# @see #bind_substitution
|
101
|
+
class BindSubstitution < Arel::Visitors::SQLite # :nodoc:
|
102
|
+
include Arel::Visitors::BindVisitor
|
103
|
+
end if defined? Arel::Visitors::BindVisitor
|
104
|
+
|
105
|
+
ADAPTER_NAME = 'SQLite'.freeze
|
97
106
|
|
98
107
|
def adapter_name # :nodoc:
|
99
108
|
ADAPTER_NAME
|
@@ -200,6 +209,10 @@ module ::ArJdbc
|
|
200
209
|
end
|
201
210
|
end
|
202
211
|
|
212
|
+
def quote_table_name_for_assignment(table, attr)
|
213
|
+
quote_column_name(attr)
|
214
|
+
end if ::ActiveRecord::VERSION::MAJOR > 3
|
215
|
+
|
203
216
|
def quote_column_name(name) # :nodoc:
|
204
217
|
%Q("#{name.to_s.gsub('"', '""')}") # "' kludge for emacs font-lock
|
205
218
|
end
|
@@ -235,22 +248,6 @@ module ::ArJdbc
|
|
235
248
|
table_name && tables(nil, table_name).any?
|
236
249
|
end
|
237
250
|
|
238
|
-
IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition # :nodoc:
|
239
|
-
|
240
|
-
def indexes(table_name, name = nil)
|
241
|
-
result = select_rows("SELECT name, sql FROM sqlite_master" <<
|
242
|
-
" WHERE tbl_name = #{quote_table_name(table_name)} AND type = 'index'", name)
|
243
|
-
|
244
|
-
result.map do |row|
|
245
|
-
name, index_sql = row[0], row[1]
|
246
|
-
unique = !! (index_sql =~ /unique/i)
|
247
|
-
columns = index_sql.match(/\((.*)\)/)[1].gsub(/,/,' ').split.map do |col|
|
248
|
-
match = /^"(.+)"$/.match(col); match ? match[1] : col
|
249
|
-
end
|
250
|
-
IndexDefinition.new(table_name, name, unique, columns)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
251
|
# Returns 62. SQLite supports index names up to 64
|
255
252
|
# characters. The rest is used by rails internally to perform
|
256
253
|
# temporary rename operations
|
@@ -270,7 +267,15 @@ module ::ArJdbc
|
|
270
267
|
execute("RELEASE SAVEPOINT #{current_savepoint_name}")
|
271
268
|
end
|
272
269
|
|
273
|
-
def recreate_database(name, options = {})
|
270
|
+
def recreate_database(name = nil, options = {}) # :nodoc:
|
271
|
+
drop_database(name)
|
272
|
+
create_database(name, options)
|
273
|
+
end
|
274
|
+
|
275
|
+
def create_database(name = nil, options = {}) # :nodoc:
|
276
|
+
end
|
277
|
+
|
278
|
+
def drop_database(name = nil) # :nodoc:
|
274
279
|
tables.each { |table| drop_table(table) }
|
275
280
|
end
|
276
281
|
|
@@ -308,7 +313,7 @@ module ::ArJdbc
|
|
308
313
|
raise e
|
309
314
|
end
|
310
315
|
|
311
|
-
def
|
316
|
+
def columns(table_name, name = nil) # :nodoc:
|
312
317
|
klass = ::ActiveRecord::ConnectionAdapters::SQLite3Column
|
313
318
|
table_structure(table_name).map do |field|
|
314
319
|
klass.new(field['name'], field['dflt_value'], field['type'], field['notnull'] == 0)
|
@@ -345,6 +350,16 @@ module ::ArJdbc
|
|
345
350
|
end
|
346
351
|
end
|
347
352
|
|
353
|
+
if ActiveRecord::VERSION::MAJOR >= 4
|
354
|
+
|
355
|
+
def remove_column(table_name, column_name, type = nil, options = {}) #:nodoc:
|
356
|
+
alter_table(table_name) do |definition|
|
357
|
+
definition.remove_column column_name
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
else
|
362
|
+
|
348
363
|
def remove_column(table_name, *column_names) #:nodoc:
|
349
364
|
if column_names.empty?
|
350
365
|
raise ArgumentError.new(
|
@@ -359,7 +374,9 @@ module ::ArJdbc
|
|
359
374
|
end
|
360
375
|
end
|
361
376
|
alias :remove_columns :remove_column
|
362
|
-
|
377
|
+
|
378
|
+
end
|
379
|
+
|
363
380
|
def change_column_default(table_name, column_name, default) #:nodoc:
|
364
381
|
alter_table(table_name) do |definition|
|
365
382
|
definition[column_name].default = default
|
@@ -410,6 +427,10 @@ module ::ArJdbc
|
|
410
427
|
"DEFAULT VALUES"
|
411
428
|
end
|
412
429
|
|
430
|
+
def encoding
|
431
|
+
select_value 'PRAGMA encoding'
|
432
|
+
end
|
433
|
+
|
413
434
|
protected
|
414
435
|
|
415
436
|
include ArJdbc::MissingFunctionalityHelper
|
@@ -442,9 +463,10 @@ module ::ArJdbc
|
|
442
463
|
end
|
443
464
|
|
444
465
|
module ActiveRecord::ConnectionAdapters
|
445
|
-
remove_const(:SQLite3Adapter) if const_defined?(:SQLite3Adapter)
|
446
|
-
remove_const(:SQLiteAdapter) if const_defined?(:SQLiteAdapter)
|
447
466
|
|
467
|
+
# NOTE: SQLite3Column exists in native adapter since AR 4.0
|
468
|
+
remove_const(:SQLite3Column) if const_defined?(:SQLite3Column)
|
469
|
+
|
448
470
|
class SQLite3Column < JdbcColumn
|
449
471
|
include ArJdbc::SQLite3::Column
|
450
472
|
|
@@ -467,7 +489,9 @@ module ActiveRecord::ConnectionAdapters
|
|
467
489
|
value
|
468
490
|
end
|
469
491
|
end
|
470
|
-
|
492
|
+
|
493
|
+
remove_const(:SQLite3Adapter) if const_defined?(:SQLite3Adapter)
|
494
|
+
|
471
495
|
class SQLite3Adapter < JdbcAdapter
|
472
496
|
include ArJdbc::SQLite3
|
473
497
|
include ArJdbc::SQLite3::ExplainSupport
|
@@ -477,24 +501,17 @@ module ActiveRecord::ConnectionAdapters
|
|
477
501
|
end
|
478
502
|
|
479
503
|
def jdbc_column_class
|
480
|
-
ActiveRecord::ConnectionAdapters::SQLite3Column
|
504
|
+
::ActiveRecord::ConnectionAdapters::SQLite3Column
|
481
505
|
end
|
482
|
-
|
483
|
-
alias_chained_method :columns, :query_cache, :jdbc_columns
|
484
506
|
|
485
507
|
end
|
486
508
|
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
$LOADED_FEATURES << 'active_record/connection_adapters/sqlite3_adapter.rb'
|
509
|
+
if ActiveRecord::VERSION::MAJOR <= 3
|
510
|
+
remove_const(:SQLiteColumn) if const_defined?(:SQLiteColumn)
|
511
|
+
SQLiteColumn = SQLite3Column
|
512
|
+
|
513
|
+
remove_const(:SQLiteAdapter) if const_defined?(:SQLiteAdapter)
|
493
514
|
|
494
|
-
|
495
|
-
$LOADED_FEATURES << 'sqlite3/version.rb'
|
496
|
-
module SQLite3
|
497
|
-
module Version
|
498
|
-
VERSION = '1.2.6' # query_cache_test.rb requires SQLite3::Version::VERSION > '1.2.5'
|
515
|
+
SQLiteAdapter = SQLite3Adapter
|
499
516
|
end
|
500
517
|
end
|
@@ -11,23 +11,23 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
11
11
|
database = '' if database == ':memory:'
|
12
12
|
config[:url] ||= "jdbc:sqlite:#{database}"
|
13
13
|
config[:driver] ||= defined?(::Jdbc::SQLite3.driver_name) ? ::Jdbc::SQLite3.driver_name : 'org.sqlite.JDBC'
|
14
|
-
config[:
|
15
|
-
config[:
|
14
|
+
config[:adapter_spec] ||= ::ArJdbc::SQLite3
|
15
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter unless config.key?(:adapter_class)
|
16
|
+
config[:connection_alive_sql] ||= 'SELECT 1'
|
17
|
+
|
16
18
|
jdbc_connection(config)
|
17
19
|
end
|
18
20
|
alias_method :jdbcsqlite3_connection, :sqlite3_connection
|
19
21
|
|
20
22
|
private
|
23
|
+
|
21
24
|
def parse_sqlite3_config!(config)
|
22
25
|
config[:database] ||= config[:dbfile]
|
23
|
-
|
24
|
-
|
25
|
-
# the database path is not the special path that tells
|
26
|
-
# Sqlite to build a database only in memory.
|
27
|
-
rails_root_defined = defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
|
28
|
-
if rails_root_defined && ':memory:' != config[:database]
|
26
|
+
# Allow database path relative to RAILS_ROOT :
|
27
|
+
if config[:database] != ':memory:' && defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
|
29
28
|
rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
|
30
|
-
config[:database] = File.expand_path(config[:database], rails_root)
|
29
|
+
config[:database] = File.expand_path(config[:database], rails_root.to_s)
|
31
30
|
end
|
32
31
|
end
|
32
|
+
|
33
33
|
end
|
data/lib/arjdbc/sybase.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'arjdbc'
|
2
|
-
require 'arjdbc/sybase/adapter
|
2
|
+
require 'arjdbc/sybase/adapter'
|
data/lib/arjdbc/tasks.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
if defined?(Rake.application) && Rake.application
|
2
|
+
skip = ENV["SKIP_AR_JDBC_RAKE_REDEFINES"] # jruby -J-Darjdc.tasks.skip=true -S rake ...
|
3
|
+
if ! Java::JavaLang::Boolean.getBoolean('arjdbc.tasks.skip') || ! ( skip && skip != 'false' )
|
4
|
+
databases_rake = File.expand_path('tasks/databases.rake', File.dirname(__FILE__))
|
5
|
+
if Rake.application.lookup("db:create")
|
6
|
+
load databases_rake # load the override tasks now
|
7
|
+
else # rails tasks not loaded yet; load as an import
|
8
|
+
Rake.application.add_import(databases_rake)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
else
|
12
|
+
warn "ArJdbc: could not load rake tasks - rake not loaded ..."
|
13
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ArJdbc
|
2
|
+
module Tasks
|
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
|
+
else
|
11
|
+
|
12
|
+
@@tasks = {}
|
13
|
+
|
14
|
+
def self.register_tasks(pattern, task)
|
15
|
+
@@tasks[pattern] = task
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.tasks_instance(config)
|
19
|
+
adapter = config['adapter']
|
20
|
+
key = @@tasks.keys.detect { |pattern| adapter[pattern] }
|
21
|
+
( @@tasks[key] || JdbcDatabaseTasks ).new(config)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'arjdbc/tasks/jdbc_database_tasks'
|
27
|
+
require 'arjdbc/tasks/db2_database_tasks'
|
28
|
+
require 'arjdbc/tasks/derby_database_tasks'
|
29
|
+
require 'arjdbc/tasks/h2_database_tasks'
|
30
|
+
require 'arjdbc/tasks/hsqldb_database_tasks'
|
31
|
+
require 'arjdbc/tasks/mssql_database_tasks'
|
32
|
+
require 'arjdbc/tasks/oracle_database_tasks'
|
33
|
+
|
34
|
+
# re-invent built-in (but deprecated on 4.0) tasks :
|
35
|
+
register_tasks(/(mssql|sqlserver)/i, MSSQLDatabaseTasks)
|
36
|
+
register_tasks(/(oci|oracle)/i, OracleDatabaseTasks)
|
37
|
+
# tasks for custom (JDBC) adapters :
|
38
|
+
register_tasks(/db2/i, DB2DatabaseTasks)
|
39
|
+
register_tasks(/derby/i, DerbyDatabaseTasks)
|
40
|
+
register_tasks(/h2/i, H2DatabaseTasks)
|
41
|
+
register_tasks(/hsqldb/i, HSQLDBDatabaseTasks)
|
42
|
+
# (default) generic JDBC task :
|
43
|
+
register_tasks(/^jdbc$/i, JdbcDatabaseTasks)
|
44
|
+
|
45
|
+
# NOTE: no need to register "built-in" adapters such as MySQL
|
46
|
+
# - on 4.0 these are registered and will be instantiated
|
47
|
+
# - while on 2.3/3.x we keep the AR built-in task behavior
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,89 @@
|
|
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
|
43
|
+
|
44
|
+
def adapt_jdbc_config(config)
|
45
|
+
return config unless config['adapter']
|
46
|
+
config.merge 'adapter' => config['adapter'].sub(/^jdbc/, '')
|
47
|
+
end
|
48
|
+
|
49
|
+
if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
|
50
|
+
|
51
|
+
def current_config(options = {})
|
52
|
+
ActiveRecord::Tasks::DatabaseTasks.current_config(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
else # 3.x / 2.3
|
56
|
+
|
57
|
+
def current_config(options = {}) # not on 2.3
|
58
|
+
options = { :env => rails_env }.merge! options
|
59
|
+
if options[:config]
|
60
|
+
@current_config = options[:config]
|
61
|
+
else
|
62
|
+
@current_config ||=
|
63
|
+
if ENV['DATABASE_URL']
|
64
|
+
database_url_config
|
65
|
+
else
|
66
|
+
ActiveRecord::Base.configurations[options[:env]]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def database_url_config(url = ENV['DATABASE_URL'])
|
72
|
+
unless defined? ActiveRecord::Base::ConnectionSpecification::Resolver
|
73
|
+
raise "ENV['DATABASE_URL'] not support on AR #{ActiveRecord::VERSION::STRING}"
|
74
|
+
end
|
75
|
+
@database_url_config ||=
|
76
|
+
ActiveRecord::Base::ConnectionSpecification::Resolver.new(url, {}).spec.config.stringify_keys
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
require 'arjdbc/tasks/database_tasks'
|
84
|
+
|
85
|
+
if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
|
86
|
+
load File.expand_path('databases4.rake', File.dirname(__FILE__))
|
87
|
+
else # 3.x / 2.3
|
88
|
+
load File.expand_path('databases3.rake', File.dirname(__FILE__))
|
89
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
# NOTE: fake these for create_database(config)
|
2
|
+
module Mysql
|
3
|
+
Error = ActiveRecord::JDBCError unless const_defined?(:Error)
|
4
|
+
end
|
5
|
+
module Mysql2
|
6
|
+
Error = ActiveRecord::JDBCError unless const_defined?(:Error)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ArJdbc
|
10
|
+
module Tasks
|
11
|
+
class << self
|
12
|
+
|
13
|
+
# API similar to ActiveRecord::Tasks::DatabaseTasks on AR 4.0
|
14
|
+
|
15
|
+
def create(config)
|
16
|
+
tasks_instance(config).create
|
17
|
+
end
|
18
|
+
|
19
|
+
def drop(config)
|
20
|
+
tasks_instance(config).drop
|
21
|
+
end
|
22
|
+
|
23
|
+
def purge(config)
|
24
|
+
tasks_instance(config).purge
|
25
|
+
end
|
26
|
+
|
27
|
+
def charset(config)
|
28
|
+
tasks_instance(config).charset
|
29
|
+
end
|
30
|
+
|
31
|
+
def collation(config)
|
32
|
+
tasks_instance(config).collation
|
33
|
+
end
|
34
|
+
|
35
|
+
def structure_dump(config, filename)
|
36
|
+
tasks_instance(config).structure_dump(filename)
|
37
|
+
end
|
38
|
+
|
39
|
+
def structure_load(config, filename)
|
40
|
+
tasks_instance(config).structure_load(filename)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
namespace :db do
|
48
|
+
|
49
|
+
class << self
|
50
|
+
alias_method :_rails_create_database, :create_database
|
51
|
+
alias_method :_rails_drop_database, :drop_database
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_database(config)
|
55
|
+
case config['adapter']
|
56
|
+
when /mysql|postgresql|sqlite/
|
57
|
+
_rails_create_database adapt_jdbc_config(config)
|
58
|
+
else
|
59
|
+
ArJdbc::Tasks.create(config)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def drop_database(config)
|
64
|
+
case config['adapter']
|
65
|
+
when /mysql|postgresql|sqlite/
|
66
|
+
_rails_drop_database adapt_jdbc_config(config)
|
67
|
+
else
|
68
|
+
ArJdbc::Tasks.drop(config)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
redefine_task :charset do # available on 2.3
|
73
|
+
ArJdbc::Tasks.charset ActiveRecord::Base.configurations[rails_env]
|
74
|
+
end
|
75
|
+
|
76
|
+
redefine_task :collation do # available on 2.3
|
77
|
+
ArJdbc::Tasks.collation ActiveRecord::Base.configurations[rails_env]
|
78
|
+
end
|
79
|
+
|
80
|
+
namespace :structure do
|
81
|
+
|
82
|
+
redefine_task :dump do
|
83
|
+
config = ActiveRecord::Base.configurations[rails_env] # current_config
|
84
|
+
filename = structure_sql
|
85
|
+
|
86
|
+
case config['adapter']
|
87
|
+
when /mysql/
|
88
|
+
ActiveRecord::Base.establish_connection(config)
|
89
|
+
File.open(filename, 'w:utf-8') { |f| f << ActiveRecord::Base.connection.structure_dump }
|
90
|
+
when /postgresql/
|
91
|
+
ActiveRecord::Base.establish_connection(config)
|
92
|
+
|
93
|
+
ENV['PGHOST'] = config['host'] if config['host']
|
94
|
+
ENV['PGPORT'] = config['port'].to_s if config['port']
|
95
|
+
ENV['PGPASSWORD'] = config['password'].to_s if config['password']
|
96
|
+
ENV['PGUSER'] = config['username'].to_s if config['username']
|
97
|
+
|
98
|
+
require 'shellwords'
|
99
|
+
search_path = config['schema_search_path']
|
100
|
+
unless search_path.blank?
|
101
|
+
search_path = search_path.split(",").map{ |part| "--schema=#{Shellwords.escape(part.strip)}" }.join(" ")
|
102
|
+
end
|
103
|
+
`pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}`
|
104
|
+
raise 'Error dumping database' if $?.exitstatus == 1
|
105
|
+
|
106
|
+
File.open(filename, 'a') { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
|
107
|
+
when /sqlite/
|
108
|
+
dbfile = config['database']
|
109
|
+
`sqlite3 #{dbfile} .schema > #{filename}`
|
110
|
+
else
|
111
|
+
ActiveRecord::Base.establish_connection(config)
|
112
|
+
ArJdbc::Tasks.structure_dump(config, filename)
|
113
|
+
end
|
114
|
+
|
115
|
+
if ActiveRecord::Base.connection.supports_migrations?
|
116
|
+
File.open(filename, 'a') { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
redefine_task :load do
|
121
|
+
config = ActiveRecord::Base.configurations[rails_env] # current_config
|
122
|
+
filename = structure_sql
|
123
|
+
|
124
|
+
case config['adapter']
|
125
|
+
when /mysql/
|
126
|
+
ActiveRecord::Base.establish_connection(config)
|
127
|
+
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
|
128
|
+
IO.read(filename).split("\n\n").each do |table|
|
129
|
+
ActiveRecord::Base.connection.execute(table)
|
130
|
+
end
|
131
|
+
when /postgresql/
|
132
|
+
ENV['PGHOST'] = config['host'] if config['host']
|
133
|
+
ENV['PGPORT'] = config['port'].to_s if config['port']
|
134
|
+
ENV['PGPASSWORD'] = config['password'].to_s if config['password']
|
135
|
+
ENV['PGUSER'] = config['username'].to_s if config['username']
|
136
|
+
|
137
|
+
`psql -f "#{filename}" #{config['database']}`
|
138
|
+
when /sqlite/
|
139
|
+
dbfile = config['database']
|
140
|
+
`sqlite3 #{dbfile} < "#{filename}"`
|
141
|
+
else
|
142
|
+
ArJdbc::Tasks.structure_load(config, filename)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def structure_sql
|
147
|
+
ENV['DB_STRUCTURE'] ||= begin
|
148
|
+
root = defined?(Rails.root) ? Rails.root : ( RAILS_ROOT rescue nil )
|
149
|
+
if ActiveRecord::VERSION::STRING > '3.2'
|
150
|
+
root ? File.join(root, "db", "structure.sql") : File.join("db", "structure.sql")
|
151
|
+
else
|
152
|
+
root ? File.join(root, "db/#{rails_env}_structure.sql") : "db/#{rails_env}_structure.sql"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
namespace :test do
|
160
|
+
|
161
|
+
# desc "Recreate the test database from an existent structure.sql file"
|
162
|
+
redefine_task :load_structure => 'db:test:purge' do # not on 2.3
|
163
|
+
begin
|
164
|
+
current_config(:config => ActiveRecord::Base.configurations['test'])
|
165
|
+
Rake::Task["structure:load"].invoke
|
166
|
+
ensure
|
167
|
+
current_config(:config => nil)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# desc "Recreate the test database from a fresh structure.sql file"
|
172
|
+
redefine_task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
|
173
|
+
# same as on 3.2 - but this task gets changed on 2.3 by depending on :load_structure
|
174
|
+
|
175
|
+
# desc "Empty the test database"
|
176
|
+
redefine_task :purge do
|
177
|
+
config = ActiveRecord::Base.configurations['test']
|
178
|
+
case config['adapter']
|
179
|
+
when /mysql/
|
180
|
+
ActiveRecord::Base.establish_connection(:test)
|
181
|
+
options = mysql_creation_options(config) rescue config
|
182
|
+
ActiveRecord::Base.connection.recreate_database(config['database'], options)
|
183
|
+
when /postgresql/
|
184
|
+
ActiveRecord::Base.clear_active_connections!
|
185
|
+
# drop_database(config) :
|
186
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
187
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
188
|
+
# create_database(config) :
|
189
|
+
encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
|
190
|
+
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => encoding))
|
191
|
+
when /sqlite/
|
192
|
+
dbfile = config['database']
|
193
|
+
File.delete(dbfile) if File.exist?(dbfile)
|
194
|
+
else
|
195
|
+
ArJdbc::Tasks.purge(config)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
# only does (:purge => :environment) on AR < 3.2
|
199
|
+
task :purge => :load_config if Rake::Task.task_defined?(:load_config)
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|