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
@@ -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