activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -11
- data/.travis.yml +36 -7
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -6
- data/History.txt +64 -0
- data/README.md +8 -1
- data/Rakefile +3 -1
- data/gemfiles/rails23.gemfile +1 -1
- data/gemfiles/rails23.gemfile.lock +6 -5
- data/gemfiles/rails30.gemfile +1 -1
- data/gemfiles/rails30.gemfile.lock +7 -6
- data/gemfiles/rails31.gemfile +1 -1
- data/gemfiles/rails31.gemfile.lock +6 -5
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails32.gemfile.lock +6 -5
- data/gemfiles/rails40.gemfile +2 -4
- data/gemfiles/rails40.gemfile.lock +37 -51
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
- data/lib/arel/visitors/db2.rb +5 -1
- data/lib/arel/visitors/hsqldb.rb +1 -0
- data/lib/arel/visitors/sql_server.rb +55 -13
- data/lib/arjdbc/db2/adapter.rb +197 -227
- data/lib/arjdbc/db2/as400.rb +124 -0
- data/lib/arjdbc/db2/connection_methods.rb +20 -1
- data/lib/arjdbc/derby/adapter.rb +17 -85
- data/lib/arjdbc/derby/connection_methods.rb +2 -1
- data/lib/arjdbc/discover.rb +55 -47
- data/lib/arjdbc/h2/adapter.rb +52 -18
- data/lib/arjdbc/h2/connection_methods.rb +10 -2
- data/lib/arjdbc/hsqldb/adapter.rb +33 -9
- data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
- data/lib/arjdbc/informix.rb +2 -1
- data/lib/arjdbc/jdbc.rb +5 -1
- data/lib/arjdbc/jdbc/adapter.rb +167 -89
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +25 -3
- data/lib/arjdbc/jdbc/callbacks.rb +9 -8
- data/lib/arjdbc/jdbc/column.rb +8 -20
- data/lib/arjdbc/jdbc/connection.rb +69 -80
- data/lib/arjdbc/jdbc/extension.rb +6 -8
- data/lib/arjdbc/jdbc/jdbc.rake +3 -141
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/mssql/adapter.rb +108 -34
- data/lib/arjdbc/mssql/connection_methods.rb +3 -1
- data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
- data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
- data/lib/arjdbc/mysql/adapter.rb +127 -70
- data/lib/arjdbc/mysql/connection_methods.rb +5 -2
- data/lib/arjdbc/oracle/adapter.rb +124 -94
- data/lib/arjdbc/oracle/connection_methods.rb +2 -1
- data/lib/arjdbc/postgresql/adapter.rb +99 -67
- data/lib/arjdbc/postgresql/column_cast.rb +3 -5
- data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
- data/lib/arjdbc/railtie.rb +3 -1
- data/lib/arjdbc/sqlite3/adapter.rb +60 -43
- data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
- data/lib/arjdbc/sybase.rb +1 -1
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +50 -0
- data/lib/arjdbc/tasks/databases.rake +89 -0
- data/lib/arjdbc/tasks/databases3.rake +203 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +29 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +11 -12
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/02-test.rake +42 -15
- data/rakelib/compile.rake +29 -2
- data/rakelib/db.rake +2 -1
- data/rakelib/rails.rake +23 -6
- data/src/java/arjdbc/ArJdbcModule.java +175 -0
- data/src/java/arjdbc/db2/DB2Module.java +2 -1
- data/src/java/arjdbc/derby/DerbyModule.java +5 -24
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
- data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
- data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
- data/src/java/arjdbc/oracle/OracleModule.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
- data/test/db/db2.rb +14 -7
- data/test/db/db2/rake_test.rb +82 -0
- data/test/db/db2/rake_test_data.sql +35 -0
- data/test/db/db2/simple_test.rb +20 -0
- data/test/db/db2/unit_test.rb +3 -1
- data/test/db/derby.rb +7 -5
- data/test/db/derby/rake_test.rb +96 -0
- data/test/db/derby/simple_test.rb +10 -2
- data/test/db/h2.rb +6 -8
- data/test/db/h2/identity_column_test.rb +35 -0
- data/test/db/h2/offset_test.rb +49 -0
- data/test/db/h2/rake_test.rb +98 -0
- data/test/db/h2/schema_dump_test.rb +5 -1
- data/test/db/hsqldb.rb +6 -10
- data/test/db/hsqldb/rake_test.rb +101 -0
- data/test/db/hsqldb/schema_dump_test.rb +5 -1
- data/test/db/hsqldb/simple_test.rb +8 -0
- data/test/db/jndi_config.rb +1 -3
- data/test/db/jndi_pooled_config.rb +1 -3
- data/test/db/mssql/limit_offset_test.rb +23 -14
- data/test/db/mssql/rake_test.rb +143 -0
- data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
- data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
- data/test/db/mysql/rake_test.rb +97 -0
- data/test/db/mysql/schema_dump_test.rb +11 -11
- data/test/db/mysql/simple_test.rb +52 -3
- data/test/db/mysql/statement_escaping_test.rb +46 -0
- data/test/db/oracle/rake_test.rb +100 -0
- data/test/db/oracle/simple_test.rb +48 -0
- data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
- data/test/db/postgres/active_schema_unit_test.rb +68 -0
- data/test/db/postgres/connection_test.rb +10 -2
- data/test/db/postgres/data_types_test.rb +2 -2
- data/test/db/postgres/ltree_test.rb +6 -5
- data/test/db/postgres/native_types_test.rb +1 -5
- data/test/db/postgres/rake_test.rb +117 -0
- data/test/db/postgres/schema_dump_test.rb +9 -2
- data/test/db/postgres/schema_test.rb +4 -2
- data/test/db/postgres/simple_test.rb +57 -16
- data/test/db/sqlite3.rb +3 -10
- data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
- data/test/db/sqlite3/rake_test.rb +71 -0
- data/test/db/sqlite3/simple_test.rb +9 -9
- data/test/has_many_through.rb +4 -1
- data/test/jdbc/db2.rb +14 -1
- data/test/jdbc_column_test.rb +23 -0
- data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
- data/test/jndi_callbacks_test.rb +26 -28
- data/test/jndi_test.rb +7 -16
- data/test/models/data_types.rb +2 -1
- data/test/models/thing.rb +1 -0
- data/test/rails/mysql.rb +13 -0
- data/test/rails/sqlite3/version.rb +6 -0
- data/test/rails_stub.rb +31 -0
- data/test/rake_test_support.rb +298 -0
- data/test/serialize.rb +2 -4
- data/test/{helper.rb → shared_helper.rb} +0 -0
- data/test/simple.rb +167 -93
- data/test/test_helper.rb +52 -16
- metadata +388 -354
- data/lib/pg.rb +0 -26
- data/test/abstract_db_create.rb +0 -139
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
- data/test/db/mssql/db_create_test.rb +0 -29
- data/test/db/mysql/db_create_test.rb +0 -33
- data/test/db/postgres/db_create_test.rb +0 -44
- data/test/db/postgres/db_drop_test.rb +0 -17
@@ -1,24 +1,24 @@
|
|
1
1
|
require 'jdbc_common'
|
2
2
|
require 'db/mysql'
|
3
3
|
|
4
|
-
class
|
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
|
-
|
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
|
-
|
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 =
|
39
|
-
|
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"
|
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"
|
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"
|
50
|
-
assert_match %r{t.binary\s+"long_blob"
|
51
|
-
assert_match %r{t.text\s+"tiny_text"
|
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"
|
54
|
-
assert_match %r{t.text\s+"long_text"
|
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"
|
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::
|
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
|
-
|
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
|
|