activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 = []