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.
Files changed (161) hide show
  1. data/.gitignore +12 -11
  2. data/.travis.yml +36 -7
  3. data/Appraisals +3 -3
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +13 -6
  6. data/History.txt +64 -0
  7. data/README.md +8 -1
  8. data/Rakefile +3 -1
  9. data/gemfiles/rails23.gemfile +1 -1
  10. data/gemfiles/rails23.gemfile.lock +6 -5
  11. data/gemfiles/rails30.gemfile +1 -1
  12. data/gemfiles/rails30.gemfile.lock +7 -6
  13. data/gemfiles/rails31.gemfile +1 -1
  14. data/gemfiles/rails31.gemfile.lock +6 -5
  15. data/gemfiles/rails32.gemfile +1 -1
  16. data/gemfiles/rails32.gemfile.lock +6 -5
  17. data/gemfiles/rails40.gemfile +2 -4
  18. data/gemfiles/rails40.gemfile.lock +37 -51
  19. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  20. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
  21. data/lib/arel/visitors/db2.rb +5 -1
  22. data/lib/arel/visitors/hsqldb.rb +1 -0
  23. data/lib/arel/visitors/sql_server.rb +55 -13
  24. data/lib/arjdbc/db2/adapter.rb +197 -227
  25. data/lib/arjdbc/db2/as400.rb +124 -0
  26. data/lib/arjdbc/db2/connection_methods.rb +20 -1
  27. data/lib/arjdbc/derby/adapter.rb +17 -85
  28. data/lib/arjdbc/derby/connection_methods.rb +2 -1
  29. data/lib/arjdbc/discover.rb +55 -47
  30. data/lib/arjdbc/h2/adapter.rb +52 -18
  31. data/lib/arjdbc/h2/connection_methods.rb +10 -2
  32. data/lib/arjdbc/hsqldb/adapter.rb +33 -9
  33. data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
  34. data/lib/arjdbc/informix.rb +2 -1
  35. data/lib/arjdbc/jdbc.rb +5 -1
  36. data/lib/arjdbc/jdbc/adapter.rb +167 -89
  37. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  38. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  39. data/lib/arjdbc/jdbc/base_ext.rb +25 -3
  40. data/lib/arjdbc/jdbc/callbacks.rb +9 -8
  41. data/lib/arjdbc/jdbc/column.rb +8 -20
  42. data/lib/arjdbc/jdbc/connection.rb +69 -80
  43. data/lib/arjdbc/jdbc/extension.rb +6 -8
  44. data/lib/arjdbc/jdbc/jdbc.rake +3 -141
  45. data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
  46. data/lib/arjdbc/mssql/adapter.rb +108 -34
  47. data/lib/arjdbc/mssql/connection_methods.rb +3 -1
  48. data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
  49. data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
  50. data/lib/arjdbc/mysql/adapter.rb +127 -70
  51. data/lib/arjdbc/mysql/connection_methods.rb +5 -2
  52. data/lib/arjdbc/oracle/adapter.rb +124 -94
  53. data/lib/arjdbc/oracle/connection_methods.rb +2 -1
  54. data/lib/arjdbc/postgresql/adapter.rb +99 -67
  55. data/lib/arjdbc/postgresql/column_cast.rb +3 -5
  56. data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
  57. data/lib/arjdbc/railtie.rb +3 -1
  58. data/lib/arjdbc/sqlite3/adapter.rb +60 -43
  59. data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
  60. data/lib/arjdbc/sybase.rb +1 -1
  61. data/lib/arjdbc/tasks.rb +13 -0
  62. data/lib/arjdbc/tasks/database_tasks.rb +50 -0
  63. data/lib/arjdbc/tasks/databases.rake +89 -0
  64. data/lib/arjdbc/tasks/databases3.rake +203 -0
  65. data/lib/arjdbc/tasks/databases4.rake +39 -0
  66. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  67. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  68. data/lib/arjdbc/tasks/h2_database_tasks.rb +29 -0
  69. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  70. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
  71. data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
  72. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
  73. data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
  74. data/lib/arjdbc/version.rb +1 -1
  75. data/pom.xml +11 -12
  76. data/rails_generators/jdbc_generator.rb +1 -1
  77. data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
  78. data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
  79. data/rakelib/02-test.rake +42 -15
  80. data/rakelib/compile.rake +29 -2
  81. data/rakelib/db.rake +2 -1
  82. data/rakelib/rails.rake +23 -6
  83. data/src/java/arjdbc/ArJdbcModule.java +175 -0
  84. data/src/java/arjdbc/db2/DB2Module.java +2 -1
  85. data/src/java/arjdbc/derby/DerbyModule.java +5 -24
  86. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
  87. data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
  88. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
  89. data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
  90. data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
  91. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
  92. data/src/java/arjdbc/oracle/OracleModule.java +2 -1
  93. data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
  94. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
  95. data/test/db/db2.rb +14 -7
  96. data/test/db/db2/rake_test.rb +82 -0
  97. data/test/db/db2/rake_test_data.sql +35 -0
  98. data/test/db/db2/simple_test.rb +20 -0
  99. data/test/db/db2/unit_test.rb +3 -1
  100. data/test/db/derby.rb +7 -5
  101. data/test/db/derby/rake_test.rb +96 -0
  102. data/test/db/derby/simple_test.rb +10 -2
  103. data/test/db/h2.rb +6 -8
  104. data/test/db/h2/identity_column_test.rb +35 -0
  105. data/test/db/h2/offset_test.rb +49 -0
  106. data/test/db/h2/rake_test.rb +98 -0
  107. data/test/db/h2/schema_dump_test.rb +5 -1
  108. data/test/db/hsqldb.rb +6 -10
  109. data/test/db/hsqldb/rake_test.rb +101 -0
  110. data/test/db/hsqldb/schema_dump_test.rb +5 -1
  111. data/test/db/hsqldb/simple_test.rb +8 -0
  112. data/test/db/jndi_config.rb +1 -3
  113. data/test/db/jndi_pooled_config.rb +1 -3
  114. data/test/db/mssql/limit_offset_test.rb +23 -14
  115. data/test/db/mssql/rake_test.rb +143 -0
  116. data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
  117. data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
  118. data/test/db/mysql/rake_test.rb +97 -0
  119. data/test/db/mysql/schema_dump_test.rb +11 -11
  120. data/test/db/mysql/simple_test.rb +52 -3
  121. data/test/db/mysql/statement_escaping_test.rb +46 -0
  122. data/test/db/oracle/rake_test.rb +100 -0
  123. data/test/db/oracle/simple_test.rb +48 -0
  124. data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
  125. data/test/db/postgres/active_schema_unit_test.rb +68 -0
  126. data/test/db/postgres/connection_test.rb +10 -2
  127. data/test/db/postgres/data_types_test.rb +2 -2
  128. data/test/db/postgres/ltree_test.rb +6 -5
  129. data/test/db/postgres/native_types_test.rb +1 -5
  130. data/test/db/postgres/rake_test.rb +117 -0
  131. data/test/db/postgres/schema_dump_test.rb +9 -2
  132. data/test/db/postgres/schema_test.rb +4 -2
  133. data/test/db/postgres/simple_test.rb +57 -16
  134. data/test/db/sqlite3.rb +3 -10
  135. data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
  136. data/test/db/sqlite3/rake_test.rb +71 -0
  137. data/test/db/sqlite3/simple_test.rb +9 -9
  138. data/test/has_many_through.rb +4 -1
  139. data/test/jdbc/db2.rb +14 -1
  140. data/test/jdbc_column_test.rb +23 -0
  141. data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
  142. data/test/jndi_callbacks_test.rb +26 -28
  143. data/test/jndi_test.rb +7 -16
  144. data/test/models/data_types.rb +2 -1
  145. data/test/models/thing.rb +1 -0
  146. data/test/rails/mysql.rb +13 -0
  147. data/test/rails/sqlite3/version.rb +6 -0
  148. data/test/rails_stub.rb +31 -0
  149. data/test/rake_test_support.rb +298 -0
  150. data/test/serialize.rb +2 -4
  151. data/test/{helper.rb → shared_helper.rb} +0 -0
  152. data/test/simple.rb +167 -93
  153. data/test/test_helper.rb +52 -16
  154. metadata +388 -354
  155. data/lib/pg.rb +0 -26
  156. data/test/abstract_db_create.rb +0 -139
  157. data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
  158. data/test/db/mssql/db_create_test.rb +0 -29
  159. data/test/db/mysql/db_create_test.rb +0 -33
  160. data/test/db/postgres/db_create_test.rb +0 -44
  161. data/test/db/postgres/db_drop_test.rb +0 -17
@@ -40,9 +40,10 @@ import org.jruby.runtime.builtin.IRubyObject;
40
40
  */
41
41
  public class MSSQLModule {
42
42
 
43
- public static void load(final RubyModule arJdbc) {
43
+ public static RubyModule load(final RubyModule arJdbc) {
44
44
  RubyModule mssql = arJdbc.defineModuleUnder("MSSQL");
45
45
  mssql.defineAnnotatedMethods( MSSQLModule.class );
46
+ return mssql;
46
47
  }
47
48
 
48
49
  @JRubyMethod(name = "quote_string", required = 1, frame = false)
@@ -42,9 +42,10 @@ import org.jruby.util.ByteList;
42
42
 
43
43
  public class MySQLModule {
44
44
 
45
- public static void load(RubyModule arJdbc) {
46
- RubyModule mySQL = arJdbc.defineModuleUnder("MySQL");
47
- mySQL.defineAnnotatedMethods(MySQLModule.class);
45
+ public static RubyModule load(final RubyModule arJdbc) {
46
+ RubyModule mysql = arJdbc.defineModuleUnder("MySQL");
47
+ mysql.defineAnnotatedMethods(MySQLModule.class);
48
+ return mysql;
48
49
  }
49
50
 
50
51
  //private final static byte[] ZERO = new byte[] {'\\','0'};
@@ -80,19 +80,24 @@ public class MySQLRubyJdbcConnection extends RubyJdbcConnection {
80
80
  return super.jdbcToRuby(runtime, column, type, resultSet);
81
81
  }
82
82
 
83
- public static RubyClass createMySQLJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
84
- RubyClass clazz = RubyJdbcConnection.getConnectionAdapters(runtime).defineClassUnder("MySQLJdbcConnection",
85
- jdbcConnection, MYSQL_JDBCCONNECTION_ALLOCATOR);
86
- clazz.defineAnnotatedMethods(MySQLRubyJdbcConnection.class);
87
-
88
- return clazz;
89
- }
90
83
  private static ObjectAllocator MYSQL_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
91
84
  public IRubyObject allocate(Ruby runtime, RubyClass klass) {
92
85
  return new MySQLRubyJdbcConnection(runtime, klass);
93
86
  }
94
87
  };
88
+
89
+ public static RubyClass createMySQLJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
90
+ RubyClass clazz = getConnectionAdapters(runtime).
91
+ defineClassUnder("MySQLJdbcConnection", jdbcConnection, MYSQL_JDBCCONNECTION_ALLOCATOR);
92
+ clazz.defineAnnotatedMethods(MySQLRubyJdbcConnection.class);
93
+ return clazz;
94
+ }
95
95
 
96
+ /*
97
+ public static RubyClass getMySQLJdbcConnectionClass(final Ruby runtime) {
98
+ return getConnectionAdapters(runtime).getClass("MySQLJdbcConnection");
99
+ } */
100
+
96
101
  @Override
97
102
  protected IRubyObject indexes(final ThreadContext context, final String tableName, final String name, final String schemaName) {
98
103
  return withConnection(context, new Callable<IRubyObject>() {
@@ -40,9 +40,10 @@ import org.jruby.runtime.builtin.IRubyObject;
40
40
  */
41
41
  public class OracleModule {
42
42
 
43
- public static void load(final RubyModule arJdbc) {
43
+ public static RubyModule load(final RubyModule arJdbc) {
44
44
  RubyModule oracle = arJdbc.defineModuleUnder("Oracle");
45
45
  oracle.defineAnnotatedMethods( OracleModule.class );
46
+ return oracle;
46
47
  }
47
48
 
48
49
  @JRubyMethod(name = "quote_string", required = 1, frame = false)
@@ -39,9 +39,10 @@ import org.jruby.util.ByteList;
39
39
  */
40
40
  public class SQLite3Module {
41
41
 
42
- public static void load(final RubyModule arJdbc) {
42
+ public static RubyModule load(final RubyModule arJdbc) {
43
43
  RubyModule sqlite3 = arJdbc.defineModuleUnder("SQLite3");
44
44
  sqlite3.defineAnnotatedMethods( SQLite3Module.class );
45
+ return sqlite3;
45
46
  }
46
47
 
47
48
  @JRubyMethod(name = "quote_string", required = 1, frame = false)
@@ -92,6 +92,18 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
92
92
  });
93
93
  }
94
94
 
95
+ @Override
96
+ protected Statement createStatement(final ThreadContext context, final Connection connection)
97
+ throws SQLException {
98
+ final Statement statement = connection.createStatement();
99
+ IRubyObject statementEscapeProcessing = getConfigValue(context, "statement_escape_processing");
100
+ if ( ! statementEscapeProcessing.isNil() ) {
101
+ statement.setEscapeProcessing(statementEscapeProcessing.isTrue());
102
+ }
103
+ // else leave as is by default
104
+ return statement;
105
+ }
106
+
95
107
  @Override
96
108
  protected IRubyObject jdbcToRuby(final Ruby runtime, final int column, int type, final ResultSet resultSet)
97
109
  throws SQLException {
data/test/db/db2.rb CHANGED
@@ -9,24 +9,31 @@ config[:port] = ENV['DB2PORT'] if ENV['DB2PORT']
9
9
  config[:username] = ENV['DB2USER'] if ENV['DB2USER'] # db2inst1
10
10
  config[:password] = ENV['DB2PASS'] if ENV['DB2PASS']
11
11
 
12
+ # for AS400 specify the full JDBC URL "jdbc:as400://..."
13
+ config[:url] = ENV['DB2URL'] if ENV['DB2URL']
14
+
12
15
  # DB2 does not like "_" in database names :
13
16
  # SQL0104N An unexpected token "weblog_development" was found
14
17
  # create the sample database using `db2sampl` command
15
- database = ENV['DB2DATABASE'] || 'SAMPLE'
16
- if config[:host]
17
- config[:database] = database
18
- else
19
- config[:url] = "jdbc:db2:#{database}" # local instance
18
+ unless config[:url]
19
+ database = ENV['DB2DATABASE'] || 'SAMPLE'
20
+ if config[:host]
21
+ config[:database] = database
22
+ else
23
+ config[:url] = "jdbc:db2:#{database}" # local instance
24
+ end
20
25
  end
21
26
 
22
27
  require 'jdbc/db2'
23
28
  # Download IBM DB2 JCC driver from :
24
29
  # https://www-304.ibm.com/support/docview.wss?rs=4020&uid=swg21385217
30
+ # or http://sourceforge.net/projects/jt400/ for AS400
31
+ jdbc_db2 = (config[:url] || '') =~ /\:as400/ ? Jdbc::AS400 : Jdbc::DB2
25
32
  begin
26
- Java::JavaClass.for_name(Jdbc::DB2.driver_name)
33
+ Java::JavaClass.for_name(jdbc_db2.driver_name)
27
34
  rescue NameError
28
35
  begin
29
- Jdbc::DB2.load_driver
36
+ jdbc_db2.load_driver
30
37
  rescue LoadError => e
31
38
  puts "Please setup a JDBC driver to run the DB2 tests !"
32
39
  raise e
@@ -0,0 +1,82 @@
1
+ require 'rake_test_support'
2
+ require 'db/db2'
3
+
4
+ class DB2RakeDbCreateTest < Test::Unit::TestCase
5
+ include RakeTestSupport
6
+
7
+ def db_name; nil; end # using same DB (db:create is a bit IBM-plicated)
8
+
9
+ test 'rake db:test:purge' do
10
+ # Rake::Task["db:create"].invoke
11
+ create_rake_test_database do |connection|
12
+ create_schema_migrations_table(connection)
13
+ connection.create_table('ibmers_test') { |t| t.string :name }
14
+ end
15
+
16
+ Rake::Task["db:test:purge"].invoke
17
+
18
+ establish_test_connection
19
+ assert_false ActiveRecord::Base.connection.table_exists?('ibmers_test')
20
+ ActiveRecord::Base.connection.disconnect!
21
+ end
22
+
23
+ test 'rake db:structure:dump (and db:structure:load)' do
24
+ # Rake::Task["db:create"].invoke
25
+ create_rake_test_database do |connection|
26
+ drop_all_database_tables(connection)
27
+ create_sample_database_data(connection)
28
+ create_schema_migrations_table(connection)
29
+ connection.create_table('ibmers') { |t| t.string :name; t.timestamps }
30
+ end
31
+
32
+ structure_sql = File.join('db', structure_sql_filename)
33
+ begin
34
+ Dir.mkdir 'db' # db/structure.sql
35
+ Rake::Task["db:structure:dump"].invoke
36
+
37
+ assert File.exists?(structure_sql)
38
+ assert_match /CREATE TABLE ibmers/im, File.read(structure_sql)
39
+
40
+ # db:structure:load
41
+ drop_all_database_tables
42
+ create_rake_test_database
43
+ Rake::Task["db:structure:load"].invoke
44
+
45
+ establish_test_connection
46
+ assert ActiveRecord::Base.connection.table_exists?('ibmers')
47
+ ActiveRecord::Base.connection.disconnect!
48
+ ensure
49
+ File.delete(structure_sql) if File.exists?(structure_sql)
50
+ Dir.rmdir 'db'
51
+ end
52
+ end
53
+
54
+ setup { rm_r 'db' if File.exist?('db') }
55
+
56
+ private
57
+
58
+ def establish_test_connection
59
+ config = db_config.dup
60
+ config.merge! :database => db_name if db_name
61
+ ActiveRecord::Base.establish_connection config
62
+ end
63
+
64
+ def create_sample_database_data(connection)
65
+ filename = File.expand_path('rake_test_data.sql', File.dirname(__FILE__))
66
+ File.read(filename).split(/;\n\n/).each { |ddl| connection.execute(ddl) }
67
+ end
68
+
69
+ def drop_all_database_tables(connection = nil)
70
+ established = nil
71
+ connection ||= begin
72
+ ActiveRecord::Base.connection
73
+ rescue
74
+ ActiveRecord::Base.establish_connection db_config
75
+ established = true
76
+ ActiveRecord::Base.connection
77
+ end
78
+ connection.tables.each { |table| connection.drop_table(table) }
79
+ ActiveRecord::Base.connection.disconnect! if established
80
+ end
81
+
82
+ end
@@ -0,0 +1,35 @@
1
+ CREATE TABLE EMPLOYEE (
2
+ EMPNO CHAR(6) NOT NULL,
3
+ FIRSTNME VARCHAR(12) NOT NULL,
4
+ MIDINIT CHAR(1),
5
+ LASTNAME VARCHAR(15) NOT NULL,
6
+ WORKDEPT CHAR(3),
7
+ PHONENO CHAR(4),
8
+ HIREDATE DATE,
9
+ JOB CHAR(8),
10
+ EDLEVEL SMALLINT NOT NULL,
11
+ SEX CHAR(1),
12
+ BIRTHDATE DATE,
13
+ SALARY DECIMAL(9,2),
14
+ BONUS DECIMAL(9,2),
15
+ COMM DECIMAL(9,2)
16
+ );
17
+
18
+ ALTER TABLE EMPLOYEE ADD CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPNO);
19
+
20
+ CREATE TABLE EMP_PHOTO (
21
+ EMPNO CHAR(6) NOT NULL,
22
+ PHOTO_FORMAT VARCHAR(10) NOT NULL,
23
+ PICTURE BLOB(102400)
24
+ );
25
+
26
+ ALTER TABLE EMP_PHOTO ADD CONSTRAINT PK_EMP_PHOTO PRIMARY KEY (EMPNO, PHOTO_FORMAT);
27
+
28
+ CREATE TABLE EMP_RESUME (
29
+ EMPNO CHAR(6) NOT NULL,
30
+ RESUME_FORMAT VARCHAR(10) NOT NULL,
31
+ RESUME CLOB(5120)
32
+ );
33
+
34
+ ALTER TABLE EMP_RESUME ADD CONSTRAINT PK_EMP_RESUME PRIMARY KEY (EMPNO, RESUME_FORMAT);
35
+
@@ -42,6 +42,26 @@ class DB2SimpleTest < Test::Unit::TestCase
42
42
  assert_equal false, e.sample_boolean?
43
43
  end
44
44
 
45
+ def test_emulates_booleans_by_default
46
+ assert_true ArJdbc::DB2.emulate_booleans
47
+ end if ar_version('3.0')
48
+
49
+ def test_boolean_emulation_can_be_disabled
50
+ db_type = DbType.create! :sample_boolean => true
51
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
52
+ assert_equal :boolean, column.type
53
+ ArJdbc::DB2.emulate_booleans = false
54
+
55
+ DbType.reset_column_information
56
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
57
+ assert_equal :integer, column.type
58
+
59
+ assert_equal 1, db_type.reload.sample_boolean
60
+ ensure
61
+ ArJdbc::DB2.emulate_booleans = true
62
+ DbType.reset_column_information
63
+ end if ar_version('3.0')
64
+
45
65
  def test_find_by_sql_WITH_statement
46
66
  user = User.create! :login => 'ferko'
47
67
  Entry.create! :title => 'aaa', :user_id => user.id
@@ -1,5 +1,6 @@
1
1
  require 'test_helper'
2
2
  require 'arjdbc/db2'
3
+ require 'arjdbc/db2/as400'
3
4
 
4
5
  class DB2UnitTest < Test::Unit::TestCase
5
6
 
@@ -52,7 +53,8 @@ class DB2UnitTest < Test::Unit::TestCase
52
53
  private
53
54
 
54
55
  def new_adapter_stub(config = {})
55
- config = config.merge({ :adapter => 'jdbc', :adapter_spec => ArJdbc::DB2 })
56
+ config = config.merge({ :adapter => 'jdbc' })
57
+ config[:adapter_spec] ||= config[:url] =~ /as400/ ? ArJdbc::AS400 : ArJdbc::DB2
56
58
  connection = stub('connection'); logger = nil
57
59
  connection.stub_everything
58
60
  adapter = ActiveRecord::ConnectionAdapters::JdbcAdapter.new connection, logger, config
data/test/db/derby.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'test_helper'
2
2
 
3
- config = {
4
- :adapter => 'derby',
5
- :database => "derby-testdb"
6
- }
3
+ config = { :adapter => 'derby', :database => 'test.derby' }
7
4
 
8
5
  ActiveRecord::Base.establish_connection(config)
9
6
 
10
- at_exit { FileUtils.rm_rf('derby-testdb') }
7
+ at_exit do
8
+ Dir.glob('test*.derby').each do |dir|
9
+ FileUtils.rm_rf(dir)
10
+ File.delete(dir) if File.exist?(dir)
11
+ end
12
+ end
@@ -0,0 +1,96 @@
1
+ require 'rake_test_support'
2
+ require 'db/derby'
3
+
4
+ class DerbyRakeTest < Test::Unit::TestCase
5
+ include RakeTestSupport
6
+
7
+ def db_name; 'test-rake.derby'; end
8
+
9
+ def do_teardown
10
+ drop_rake_test_database(:silence)
11
+ end
12
+
13
+ test 'rake db:create' do
14
+ Rake::Task["db:create"].invoke
15
+ assert_true File.directory?('test-rake.derby')
16
+ end
17
+
18
+ test 'rake db:drop' do
19
+ create_rake_test_database
20
+
21
+ Rake::Task["db:drop"].invoke
22
+ assert_false File.directory?('test-rake.derby')
23
+ end
24
+
25
+ test 'rake db:test:purge' do
26
+ ActiveRecord::Base.connection.disconnect!
27
+ # Rake::Task["db:create"].invoke
28
+ create_rake_test_database do |connection|
29
+ connection.create_table('users') { |t| t.string :name }
30
+ end
31
+
32
+ Rake::Task["db:test:purge"].invoke
33
+
34
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
35
+ assert_false ActiveRecord::Base.connection.table_exists?('users')
36
+ ActiveRecord::Base.connection.disconnect!
37
+ end
38
+
39
+ test 'rake db:structure:dump (and db:structure:load)' do
40
+ # NOTE: need to change db name esp. when run with other (rake) tests
41
+ # since Derby can not handle too much create/rm - gets inconsistent
42
+ db_name = @db_name = 'test-dump-rake.derby'
43
+ create_rake_test_database(db_name) do |connection|
44
+ create_schema_migrations_table(connection)
45
+ connection.create_table('users') { |t| t.string :name; t.timestamps }
46
+ end
47
+
48
+ structure_sql = File.join('db', structure_sql_filename)
49
+ begin
50
+ Dir.mkdir 'db' # db/structure.sql
51
+ Rake::Task["db:structure:dump"].invoke
52
+
53
+ assert File.exists?(structure_sql)
54
+ assert_match /CREATE TABLE "?USERS"?/i, File.read(structure_sql)
55
+
56
+ # db:structure:load
57
+ ActiveRecord::Base.connection.disconnect!
58
+ # drop_rake_test_database(:silence)
59
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
60
+ ActiveRecord::Base.connection.drop_table('users')
61
+ ActiveRecord::Base.connection.drop_table('schema_migrations')
62
+ ActiveRecord::Base.connection.disconnect!
63
+
64
+ Rake::Task["db:structure:load"].invoke
65
+
66
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
67
+ assert ActiveRecord::Base.connection.table_exists?('users')
68
+ ActiveRecord::Base.connection.disconnect!
69
+ ensure
70
+ File.delete(structure_sql) if File.exists?(structure_sql)
71
+ Dir.rmdir 'db'
72
+ end
73
+ end
74
+
75
+ # test 'rake db:charset' do
76
+ # expect_rake_output('UTF-8')
77
+ # Rake::Task["db:charset"].invoke
78
+ # end
79
+
80
+ def create_rake_test_database(db_name = self.db_name)
81
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
82
+ if block_given?
83
+ yield ActiveRecord::Base.connection
84
+ end
85
+ ActiveRecord::Base.connection.disconnect!
86
+ end
87
+
88
+ def drop_rake_test_database(silence = nil)
89
+ if silence
90
+ FileUtils.rm_rf(@db_name) if File.exists?(@db_name)
91
+ else
92
+ FileUtils.rm_rf(@db_name)
93
+ end
94
+ end
95
+
96
+ end
@@ -8,6 +8,13 @@ class DerbySimpleTest < Test::Unit::TestCase
8
8
  include ActiveRecord3TestMethods
9
9
  include CustomSelectTestMethods
10
10
 
11
+ # @override
12
+ def test_empty_insert_statement
13
+ # "INSERT INTO table VALUES ( DEFAULT ) " not supported by Derby DB
14
+ pend if ar_version('4.0')
15
+ super
16
+ end
17
+
11
18
  # Check that a table-less VALUES(xxx) query (like SELECT works.
12
19
  def test_values
13
20
  value = nil
@@ -28,7 +35,7 @@ class DerbySimpleTest < Test::Unit::TestCase
28
35
  end
29
36
 
30
37
  def test_text_and_string_conversions
31
- e = DbType.first
38
+ e = DbType.create!(:sample_string => '', :sample_text => '').reload
32
39
 
33
40
  # Derby will normally reject any non text value.
34
41
  # The adapter has been patched to convert non text values to strings
@@ -122,7 +129,8 @@ class DerbySimpleTest < Test::Unit::TestCase
122
129
  ["sample_integer_neg_default", :integer, { :default => -1 }],
123
130
  ["sample_text", :text, { }],
124
131
  ["big_decimal", :integer, { :precision => 31, :scale => 0 }],
125
- ].sort{|a,b| a[0] <=> b[0]}
132
+ ["decimal_with_scale", :decimal, { :precision => 15, :scale => 3 }],
133
+ ].sort{ |a,b| a[0] <=> b[0] }
126
134
 
127
135
  column_names = (expected_types.map{|et| et[0]} + DbType.column_names).sort.uniq
128
136
  result = []