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
@@ -1,24 +1,24 @@
1
1
  require 'jdbc_common'
2
2
  require 'db/mysql'
3
3
 
4
- class Project < ActiveRecord::Migration
5
- def self.up
6
- create_table :project, :primary_key => "project_id" do |t|
7
- t.string :projectType, :limit => 31
8
- t.boolean :published
9
- t.datetime :created_date
10
- t.text :abstract, :title
11
- end
12
- end
13
-
14
- def self.down
15
- drop_table :project
16
- end
4
+ class MysqlNonstandardPrimaryKeyTest < Test::Unit::TestCase
17
5
 
18
- end
6
+ class Project < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :project, :primary_key => "project_id" do |t|
9
+ t.string :projectType, :limit => 31
10
+ t.boolean :published
11
+ t.datetime :created_date
12
+ t.text :abstract, :title
13
+ end
14
+ end
19
15
 
20
- class MysqlNonstandardPrimaryKeyTest < Test::Unit::TestCase
16
+ def self.down
17
+ drop_table :project
18
+ end
21
19
 
20
+ end
21
+
22
22
  def setup
23
23
  Project.up
24
24
  end
@@ -27,16 +27,13 @@ class MysqlNonstandardPrimaryKeyTest < Test::Unit::TestCase
27
27
  Project.down
28
28
  end
29
29
 
30
- def standard_dump
31
- stream = StringIO.new
32
- ActiveRecord::SchemaDumper.ignore_tables = []
33
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
34
- stream.string
35
- end
36
-
37
30
  def test_nonstandard_primary_key
38
- output = standard_dump
39
- assert_match %r(:primary_key => "project_id"), output, "non-standard primary key not preserved"
31
+ output = schema_dump
32
+ if ar_version('4.0')
33
+ assert_match %r(primary_key: "project_id"), output, "non-standard primary key not preserved"
34
+ else
35
+ assert_match %r(:primary_key => "project_id"), output, "non-standard primary key not preserved"
36
+ end
40
37
  end
41
38
 
42
39
  end
@@ -0,0 +1,97 @@
1
+ require 'rake_test_support'
2
+ require 'db/mysql'
3
+
4
+ class MySQLRakeTest < Test::Unit::TestCase
5
+ include RakeTestSupport
6
+
7
+ def db_config
8
+ MYSQL_CONFIG
9
+ end
10
+
11
+ def do_teardown
12
+ drop_rake_test_database(:silence)
13
+ end
14
+
15
+ test 'rake db:create (and db:drop)' do
16
+ # omit_unless find_executable?("mysql")
17
+ Rake::Task["db:create"].invoke
18
+ with_mysql do |mysql|
19
+ mysql << "show databases where `Database` = '#{db_name}';"
20
+ mysql.close_write
21
+ output = mysql.read
22
+ assert output =~ /#{db_name}/m, "db name: #{db_name.inspect} not matched in:\n#{output}"
23
+ end if find_executable?("mysql")
24
+
25
+ Rake::Task["db:drop"].invoke
26
+ with_mysql do |mysql|
27
+ mysql << "show databases where `Database` = '#{db_name}';"
28
+ mysql.close_write
29
+ output = mysql.read
30
+ assert_nil output =~ /#{db_name}/m, "db name: #{db_name.inspect} matched in:\n#{output}"
31
+ end if find_executable?("mysql")
32
+ end
33
+
34
+ test 'rake db:test:purge' do
35
+ # Rake::Task["db:create"].invoke
36
+ create_rake_test_database do |connection|
37
+ connection.create_table('users') { |t| t.string :name }
38
+ end
39
+
40
+ Rake::Task["db:test:purge"].invoke
41
+
42
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
43
+ assert_false ActiveRecord::Base.connection.table_exists?('users')
44
+ ActiveRecord::Base.connection.disconnect!
45
+ end
46
+
47
+ test 'rake db:structure:dump (and db:structure:load)' do
48
+ # Rake::Task["db:create"].invoke
49
+ create_rake_test_database do |connection|
50
+ create_schema_migrations_table(connection)
51
+ connection.create_table('users') { |t| t.string :name; t.timestamps }
52
+ end
53
+
54
+ structure_sql = File.join('db', structure_sql_filename)
55
+ begin
56
+ Dir.mkdir 'db' # db/structure.sql
57
+ Rake::Task["db:structure:dump"].invoke
58
+
59
+ assert File.exists?(structure_sql)
60
+ assert_match /CREATE TABLE `users`/, File.read(structure_sql)
61
+
62
+ # db:structure:load
63
+ drop_rake_test_database(:silence)
64
+ create_rake_test_database
65
+ Rake::Task["db:structure:load"].invoke
66
+
67
+ ActiveRecord::Base.establish_connection db_config.merge :database => db_name
68
+ assert ActiveRecord::Base.connection.table_exists?('users')
69
+ ActiveRecord::Base.connection.disconnect!
70
+ ensure
71
+ File.delete(structure_sql) if File.exists?(structure_sql)
72
+ Dir.rmdir 'db'
73
+ end
74
+ end
75
+
76
+ setup { rm_r 'db' if File.exist?('db') }
77
+
78
+ test 'rake db:charset' do
79
+ create_rake_test_database
80
+ expect_rake_output 'utf8'
81
+ Rake::Task["db:charset"].invoke
82
+ end
83
+
84
+ test 'rake db:collation' do
85
+ create_rake_test_database
86
+ expect_rake_output /utf8_.*?_ci/
87
+ Rake::Task["db:collation"].invoke
88
+ end
89
+
90
+ private
91
+
92
+ def with_mysql(args = nil)
93
+ exec = "mysql -u #{db_config[:username]} --password=#{db_config[:password]} #{args}"
94
+ IO.popen(exec, "r+") { |mysql| yield(mysql) }
95
+ end
96
+
97
+ end
@@ -39,19 +39,19 @@ class MysqlSchemaDumpTest < Test::Unit::TestCase
39
39
 
40
40
  def test_schema_dump_should_not_add_default_value_for_mysql_text_field
41
41
  output = standard_dump
42
- assert_match %r{t.text\s+"just_text",\s+:null => false$}, output
42
+ assert_match %r{t.text\s+"just_text",[\s|:]+null[\s\:\=\>]+false$}, output
43
43
  end
44
44
 
45
45
  def test_schema_dump_includes_length_for_mysql_blob_and_text_fields
46
46
  output = standard_dump
47
- assert_match %r{t.binary\s+"tiny_blob",\s+:limit => 255$}, output
47
+ assert_match %r{t.binary\s+"tiny_blob",[\s|:]+limit[\s\:\=\>]+255$}, output
48
48
  assert_match %r{t.binary\s+"normal_blob"$}, output
49
- assert_match %r{t.binary\s+"medium_blob",\s+:limit => 16777215$}, output
50
- assert_match %r{t.binary\s+"long_blob",\s+:limit => 2147483647$}, output
51
- assert_match %r{t.text\s+"tiny_text",\s+:limit => 255$}, output
49
+ assert_match %r{t.binary\s+"medium_blob",[\s|:]+limit[\s\:\=\>]+16777215$}, output
50
+ assert_match %r{t.binary\s+"long_blob",[\s|:]+limit[\s\:\=\>]+2147483647$}, output
51
+ assert_match %r{t.text\s+"tiny_text",[\s|:]+limit[\s\:\=\>]+255$}, output
52
52
  assert_match %r{t.text\s+"normal_text"$}, output
53
- assert_match %r{t.text\s+"medium_text",\s+:limit => 16777215$}, output
54
- assert_match %r{t.text\s+"long_text",\s+:limit => 2147483647$}, output
53
+ assert_match %r{t.text\s+"medium_text",[\s|:]+limit[\s\:\=\>]+16777215$}, output
54
+ assert_match %r{t.text\s+"long_text",[\s|:]+limit[\s\:\=\>]+2147483647$}, output
55
55
  end
56
56
 
57
57
  def test_schema_dump_includes_length_for_mysql_binary_fields
@@ -132,18 +132,18 @@ class MysqlInfoTest < Test::Unit::TestCase
132
132
  strio = StringIO.new
133
133
  ActiveRecord::SchemaDumper::dump(connection, strio)
134
134
  dump = strio.string
135
- assert_match %r{t.text\s+"text",\s+:limit => 2147483647$}, dump
135
+ assert_match %r{t.text\s+"text",[\s|:]+limit[\s\:\=\>]+2147483647$}, dump
136
136
  end
137
137
 
138
138
  # JRUBY-5040
139
139
  def test_schema_dump_should_not_have_limits_on_datetime
140
140
  dump = schema_dump
141
- dump.lines.grep(/datetime/).each {|line| assert line !~ /limit/ }
141
+ dump.lines.grep(/datetime/).each { |line| assert line !~ /limit/ }
142
142
  end
143
143
 
144
144
  def test_schema_dump_should_not_have_limits_on_date
145
145
  dump = schema_dump
146
- dump.lines.grep(/date/).each {|line| assert line !~ /limit/ }
146
+ dump.lines.grep(/date/).each { |line| assert line !~ /limit/ }
147
147
  end
148
148
 
149
149
  def test_should_include_limit
@@ -153,7 +153,7 @@ class MysqlInfoTest < Test::Unit::TestCase
153
153
 
154
154
  def test_should_set_sqltype_to_longtext
155
155
  text_column = connection.columns('memos').find { |c| c.name == 'text' }
156
- assert text_column.sql_type =~ /^longtext/i
156
+ assert text_column.sql_type =~ /^longtext/i, "longtext sql type expected for: #{text_column.inspect}"
157
157
  end
158
158
 
159
159
  def test_should_set_type_to_text
@@ -21,8 +21,7 @@ class MysqlSimpleTest < Test::Unit::TestCase
21
21
  def test_column_class_instantiation
22
22
  text_column = nil
23
23
  assert_nothing_raised do
24
- text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.
25
- new("title", nil, "text")
24
+ text_column = ActiveRecord::ConnectionAdapters::MysqlAdapter::Column.new("title", nil, "text")
26
25
  end
27
26
  assert_not_nil text_column
28
27
  end
@@ -105,7 +104,11 @@ class MysqlSimpleTest < Test::Unit::TestCase
105
104
  begin
106
105
  User.table_name = "#{database}.users"
107
106
  Entry.table_name = "#{database}.entries"
108
- assert_not_empty Entry.all(:include => :user)
107
+ if ar_version('4.0')
108
+ assert_not_empty Entry.includes(:user).to_a
109
+ else
110
+ assert_not_empty Entry.all(:include => :user)
111
+ end
109
112
  ensure
110
113
  Entry.table_name = old_entries_table_name
111
114
  User.table_name = old_users_table_name
@@ -131,6 +134,52 @@ class MysqlSimpleTest < Test::Unit::TestCase
131
134
  assert_equal 'updated content', e2.reload.content
132
135
  end
133
136
 
137
+ # NOTE: expected escape processing to be disabled by default for non-prepared statements
138
+ def test_quoting_braces
139
+ e = Entry.create! :title => '{'
140
+ assert_equal "{", e.reload.title
141
+ e = Entry.create! :title => '{}'
142
+ assert_equal "{}", e.reload.title
143
+
144
+ e = Entry.create! :title => "\\'{}{"
145
+ assert_equal "\\'{}{", e.reload.title
146
+
147
+ e = Entry.create! :title => '}{"\'} \''
148
+ assert_equal "}{\"'} '", e.reload.title
149
+ end
150
+
151
+ def test_emulates_booleans_by_default
152
+ assert connection.class.emulate_booleans
153
+ assert_true ArJdbc::MySQL.emulate_booleans
154
+ assert_true ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans
155
+ end if ar_version('3.0')
156
+
157
+ def test_boolean_emulation_can_be_disabled
158
+ db_type = DbType.create! :sample_boolean => true
159
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
160
+ assert_equal :boolean, column.type
161
+ ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
162
+
163
+ DbType.reset_column_information
164
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
165
+ assert_equal :integer, column.type
166
+
167
+ assert_equal 1, db_type.reload.sample_boolean
168
+ ensure
169
+ ArJdbc::MySQL.emulate_booleans = true
170
+ DbType.reset_column_information
171
+ end if ar_version('3.0')
172
+
173
+ def test_pk_and_sequence_for
174
+ assert_equal [ 'id', nil ], connection.pk_and_sequence_for('entries')
175
+ end
176
+
177
+ def test_mysql_indexes
178
+ if ar_version('4.0')
179
+ assert connection.class.const_defined?(:INDEX_TYPES)
180
+ end
181
+ end
182
+
134
183
  end
135
184
 
136
185
  class MysqlHasManyThroughTest < Test::Unit::TestCase
@@ -0,0 +1,46 @@
1
+ require 'jdbc_common'
2
+ require 'db/mysql'
3
+
4
+ class StatementEscapingTest < Test::Unit::TestCase
5
+ include FixtureSetup
6
+
7
+ def setup
8
+ super
9
+ ActiveRecord::Base.clear_active_connections!
10
+ @config = ActiveRecord::Base.connection.config
11
+ end
12
+
13
+ def teardown
14
+ ActiveRecord::Base.clear_active_connections!
15
+ ActiveRecord::Base.establish_connection @config
16
+ super
17
+ end
18
+
19
+ def test_false
20
+ set_escape_processing false
21
+ e1 = Entry.create! :title => "\\'{}{"
22
+ e2 = Entry.find(e1.id)
23
+ assert_equal "\\'{}{", e2.title
24
+ end
25
+
26
+ def set_escape_processing(value)
27
+ ActiveRecord::Base.establish_connection @config.merge(:statement_escape_processing => value)
28
+ end
29
+
30
+ def test_not_set
31
+ set_escape_processing nil
32
+ verify_escaped
33
+ end
34
+
35
+ def verify_escaped
36
+ e = Entry.create! :title => 'abc'
37
+ rs = ActiveRecord::Base.connection.execute(
38
+ "SELECT {fn concat(title, 'xyz')} AS title from entries WHERE id = #{e.id}")
39
+ assert_equal 'abcxyz', rs.first['title']
40
+ end
41
+
42
+ def test_true
43
+ set_escape_processing true
44
+ verify_escaped
45
+ end
46
+ end
@@ -0,0 +1,100 @@
1
+ require 'rake_test_support'
2
+ require 'db/oracle'
3
+
4
+ class OracleRakeDbCreateTest < Test::Unit::TestCase
5
+ include RakeTestSupport
6
+
7
+ def db_name; nil; end # using same Oracle DB
8
+
9
+ test 'rake db:drop' do
10
+ create_rake_test_database do |connection|
11
+ connection.create_table('oraclers_test') { |t| t.string :name }
12
+ end
13
+
14
+ Rake::Task["db:drop"].invoke
15
+
16
+ establish_test_connection
17
+ assert_false ActiveRecord::Base.connection.table_exists?('oraclers_test')
18
+ ActiveRecord::Base.connection.disconnect!
19
+ end
20
+
21
+ test 'rake db:test:purge' do
22
+ # Rake::Task["db:create"].invoke
23
+ create_rake_test_database do |connection|
24
+ create_schema_migrations_table(connection)
25
+ connection.create_table('oraclers_test') { |t| t.string :name }
26
+ end
27
+
28
+ Rake::Task["db:test:purge"].invoke
29
+
30
+ establish_test_connection
31
+ assert_false ActiveRecord::Base.connection.table_exists?('oraclers_test')
32
+ ActiveRecord::Base.connection.disconnect!
33
+ end
34
+
35
+ test 'rake db:structure:dump (and db:structure:load)' do
36
+ # Rake::Task["db:create"].invoke
37
+ create_rake_test_database do |connection|
38
+ drop_all_database_tables(connection)
39
+ create_schema_migrations_table(connection)
40
+ connection.create_table('oraclers') { |t| t.string :name; t.timestamps }
41
+ end
42
+
43
+ structure_sql = File.join('db', structure_sql_filename)
44
+ begin
45
+ Dir.mkdir 'db' # db/structure.sql
46
+ Rake::Task["db:structure:dump"].invoke
47
+
48
+ assert File.exists?(structure_sql)
49
+ assert_match /CREATE TABLE \"?ORACLERS\"?/i, File.read(structure_sql)
50
+
51
+ # db:structure:load
52
+ drop_all_database_tables
53
+ create_rake_test_database
54
+ Rake::Task["db:structure:load"].invoke
55
+
56
+ establish_test_connection
57
+ assert ActiveRecord::Base.connection.table_exists?('oraclers')
58
+ ActiveRecord::Base.connection.disconnect!
59
+ ensure
60
+ File.delete(structure_sql) if File.exists?(structure_sql)
61
+ Dir.rmdir 'db'
62
+ end
63
+ end
64
+
65
+ setup { rm_r 'db' if File.exist?('db') }
66
+
67
+ test 'rake db:charset' do
68
+ create_rake_test_database
69
+ expect_rake_output 'AL32UTF8'
70
+ Rake::Task["db:charset"].invoke
71
+ end
72
+
73
+ test 'rake db:collation' do
74
+ create_rake_test_database
75
+ expect_rake_output /BINARY/
76
+ Rake::Task["db:collation"].invoke
77
+ end
78
+
79
+ private
80
+
81
+ def establish_test_connection
82
+ config = db_config.dup
83
+ config.merge! :database => db_name if db_name
84
+ ActiveRecord::Base.establish_connection config
85
+ end
86
+
87
+ def drop_all_database_tables(connection = nil)
88
+ established = nil
89
+ connection ||= begin
90
+ ActiveRecord::Base.connection
91
+ rescue
92
+ ActiveRecord::Base.establish_connection db_config
93
+ established = true
94
+ ActiveRecord::Base.connection
95
+ end
96
+ connection.tables.each { |table| connection.drop_table(table) }
97
+ ActiveRecord::Base.connection.disconnect! if established
98
+ end
99
+
100
+ end
@@ -63,6 +63,54 @@ class OracleSimpleTest < Test::Unit::TestCase
63
63
  end if Test::Unit::TestCase.ar_version('3.1') # no binds argument for <= 3.0
64
64
 
65
65
  include ExplainSupportTestMethods if ar_version("3.1")
66
+
67
+ def test_quotes_reserved_word_column
68
+ connection.create_table 'lusers', :force => true do |t|
69
+ t.string :file
70
+ t.text "desc", :limit => 16777216
71
+ t.date :'date', :null => false
72
+ end
73
+ ensure
74
+ connection.drop_table('lusers') rescue nil
75
+ end
76
+
77
+ def test_emulates_booleans_by_default
78
+ assert_true ArJdbc::Oracle.emulate_booleans
79
+ # assert_true ActiveRecord::ConnectionAdapters::OracleAdapter.emulate_booleans
80
+ end if ar_version('3.0')
81
+
82
+ def test_boolean_emulation_can_be_disabled
83
+ db_type = DbType.create! :sample_boolean => true
84
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
85
+ assert_equal :boolean, column.type
86
+ ArJdbc::Oracle.emulate_booleans = false
87
+
88
+ DbType.reset_column_information
89
+ column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
90
+ assert_equal :integer, column.type
91
+
92
+ assert_equal 1, db_type.reload.sample_boolean
93
+ ensure
94
+ ArJdbc::Oracle.emulate_booleans = true
95
+ DbType.reset_column_information
96
+ end if ar_version('3.0')
97
+
98
+ def test_set_table_name_prefixed_with_schema
99
+ schema = connection.config[:username]
100
+ activity = Class.new(ActiveRecord::Base) do # class Activity
101
+ if respond_to?(:table_name=)
102
+ self.table_name = "#{schema}.activities"
103
+ self.sequence_name = "#{schema}.activities_seq"
104
+ else
105
+ set_table_name "#{schema}.activities"
106
+ set_sequence_name "#{schema}.activities_seq"
107
+ end
108
+ end
109
+ connection.create_table(:activities) { |t| t.string :name }
110
+ assert activity.create! :name => 'an-activity' # Activity.create! ...
111
+ ensure
112
+ connection.drop_table(:activities) rescue nil
113
+ end
66
114
 
67
115
  protected
68
116