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