kb-activerecord-jdbc-adapter 0.9.7.1-java

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 (135) hide show
  1. data/History.txt +296 -0
  2. data/LICENSE.txt +21 -0
  3. data/Manifest.txt +139 -0
  4. data/README.txt +219 -0
  5. data/Rakefile +10 -0
  6. data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -0
  7. data/lib/active_record/connection_adapters/derby_adapter.rb +13 -0
  8. data/lib/active_record/connection_adapters/h2_adapter.rb +13 -0
  9. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +13 -0
  10. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  11. data/lib/active_record/connection_adapters/jdbc_adapter.rb +661 -0
  12. data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +26 -0
  13. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  14. data/lib/active_record/connection_adapters/mssql_adapter.rb +13 -0
  15. data/lib/active_record/connection_adapters/mysql_adapter.rb +13 -0
  16. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/postgresql_adapter.rb +13 -0
  18. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +13 -0
  19. data/lib/activerecord-jdbc-adapter.rb +6 -0
  20. data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
  21. data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
  22. data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
  23. data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +6 -0
  24. data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
  25. data/lib/generators/jdbc/jdbc_generator.rb +9 -0
  26. data/lib/jdbc_adapter.rb +27 -0
  27. data/lib/jdbc_adapter/jdbc.rake +122 -0
  28. data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
  29. data/lib/jdbc_adapter/jdbc_cachedb.rb +33 -0
  30. data/lib/jdbc_adapter/jdbc_db2.rb +222 -0
  31. data/lib/jdbc_adapter/jdbc_derby.rb +426 -0
  32. data/lib/jdbc_adapter/jdbc_firebird.rb +109 -0
  33. data/lib/jdbc_adapter/jdbc_hsqldb.rb +221 -0
  34. data/lib/jdbc_adapter/jdbc_informix.rb +147 -0
  35. data/lib/jdbc_adapter/jdbc_mimer.rb +145 -0
  36. data/lib/jdbc_adapter/jdbc_mssql.rb +468 -0
  37. data/lib/jdbc_adapter/jdbc_mysql.rb +260 -0
  38. data/lib/jdbc_adapter/jdbc_oracle.rb +397 -0
  39. data/lib/jdbc_adapter/jdbc_postgre.rb +531 -0
  40. data/lib/jdbc_adapter/jdbc_sqlite3.rb +386 -0
  41. data/lib/jdbc_adapter/jdbc_sybase.rb +50 -0
  42. data/lib/jdbc_adapter/missing_functionality_helper.rb +87 -0
  43. data/lib/jdbc_adapter/railtie.rb +9 -0
  44. data/lib/jdbc_adapter/rake_tasks.rb +10 -0
  45. data/lib/jdbc_adapter/tsql_helper.rb +69 -0
  46. data/lib/jdbc_adapter/version.rb +5 -0
  47. data/lib/pg.rb +4 -0
  48. data/rails_generators/jdbc_generator.rb +15 -0
  49. data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
  50. data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
  51. data/rakelib/compile.rake +23 -0
  52. data/rakelib/package.rake +91 -0
  53. data/rakelib/rails.rake +41 -0
  54. data/rakelib/test.rake +78 -0
  55. data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +53 -0
  56. data/src/java/jdbc_adapter/JdbcConnectionFactory.java +36 -0
  57. data/src/java/jdbc_adapter/JdbcDerbySpec.java +293 -0
  58. data/src/java/jdbc_adapter/JdbcMySQLSpec.java +134 -0
  59. data/src/java/jdbc_adapter/MssqlRubyJdbcConnection.java +71 -0
  60. data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +55 -0
  61. data/src/java/jdbc_adapter/RubyJdbcConnection.java +1176 -0
  62. data/src/java/jdbc_adapter/SQLBlock.java +27 -0
  63. data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +41 -0
  64. data/test/abstract_db_create.rb +107 -0
  65. data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
  66. data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
  67. data/test/cachedb_simple_test.rb +6 -0
  68. data/test/db/cachedb.rb +9 -0
  69. data/test/db/db2.rb +9 -0
  70. data/test/db/derby.rb +14 -0
  71. data/test/db/h2.rb +11 -0
  72. data/test/db/hsqldb.rb +12 -0
  73. data/test/db/informix.rb +11 -0
  74. data/test/db/jdbc.rb +11 -0
  75. data/test/db/jndi_config.rb +30 -0
  76. data/test/db/logger.rb +3 -0
  77. data/test/db/mssql.rb +9 -0
  78. data/test/db/mysql.rb +10 -0
  79. data/test/db/oracle.rb +34 -0
  80. data/test/db/postgres.rb +9 -0
  81. data/test/db/sqlite3.rb +15 -0
  82. data/test/db2_simple_test.rb +10 -0
  83. data/test/derby_migration_test.rb +21 -0
  84. data/test/derby_multibyte_test.rb +12 -0
  85. data/test/derby_simple_test.rb +21 -0
  86. data/test/generic_jdbc_connection_test.rb +9 -0
  87. data/test/h2_simple_test.rb +6 -0
  88. data/test/has_many_through.rb +79 -0
  89. data/test/helper.rb +5 -0
  90. data/test/hsqldb_simple_test.rb +6 -0
  91. data/test/informix_simple_test.rb +48 -0
  92. data/test/jdbc_adapter/jdbc_db2_test.rb +26 -0
  93. data/test/jdbc_adapter/jdbc_sybase_test.rb +33 -0
  94. data/test/jdbc_common.rb +25 -0
  95. data/test/jndi_callbacks_test.rb +38 -0
  96. data/test/jndi_test.rb +35 -0
  97. data/test/manualTestDatabase.rb +191 -0
  98. data/test/minirunit.rb +109 -0
  99. data/test/minirunit/testConnect.rb +14 -0
  100. data/test/minirunit/testH2.rb +73 -0
  101. data/test/minirunit/testHsqldb.rb +73 -0
  102. data/test/minirunit/testLoadActiveRecord.rb +3 -0
  103. data/test/minirunit/testMysql.rb +83 -0
  104. data/test/minirunit/testRawSelect.rb +24 -0
  105. data/test/models/add_not_null_column_to_table.rb +12 -0
  106. data/test/models/auto_id.rb +18 -0
  107. data/test/models/data_types.rb +28 -0
  108. data/test/models/entry.rb +23 -0
  109. data/test/models/mixed_case.rb +20 -0
  110. data/test/models/reserved_word.rb +18 -0
  111. data/test/models/string_id.rb +18 -0
  112. data/test/models/validates_uniqueness_of_string.rb +19 -0
  113. data/test/mssql_db_create_test.rb +26 -0
  114. data/test/mssql_identity_insert_test.rb +19 -0
  115. data/test/mssql_legacy_types_test.rb +58 -0
  116. data/test/mssql_limit_offset_test.rb +108 -0
  117. data/test/mssql_multibyte_test.rb +18 -0
  118. data/test/mssql_simple_test.rb +49 -0
  119. data/test/mysql_db_create_test.rb +25 -0
  120. data/test/mysql_info_test.rb +62 -0
  121. data/test/mysql_multibyte_test.rb +10 -0
  122. data/test/mysql_nonstandard_primary_key_test.rb +42 -0
  123. data/test/mysql_simple_test.rb +32 -0
  124. data/test/oracle_simple_test.rb +54 -0
  125. data/test/pick_rails_version.rb +3 -0
  126. data/test/postgres_db_create_test.rb +21 -0
  127. data/test/postgres_mixed_case_test.rb +19 -0
  128. data/test/postgres_nonseq_pkey_test.rb +40 -0
  129. data/test/postgres_reserved_test.rb +22 -0
  130. data/test/postgres_schema_search_path_test.rb +46 -0
  131. data/test/postgres_simple_test.rb +13 -0
  132. data/test/simple.rb +494 -0
  133. data/test/sqlite3_simple_test.rb +233 -0
  134. data/test/sybase_jtds_simple_test.rb +6 -0
  135. metadata +230 -0
@@ -0,0 +1,10 @@
1
+ require 'jdbc_common'
2
+ require 'db/mysql'
3
+
4
+ class MySQLMultibyteTest < Test::Unit::TestCase
5
+ include MultibyteTestMethods
6
+ end
7
+
8
+ class MySQLNonUTF8EncodingTest < Test::Unit::TestCase
9
+ include NonUTF8EncodingMethods
10
+ end
@@ -0,0 +1,42 @@
1
+ require 'jdbc_common'
2
+ require 'db/mysql'
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
17
+
18
+ end
19
+
20
+ class MysqlNonstandardPrimaryKeyTest < Test::Unit::TestCase
21
+
22
+ def setup
23
+ Project.up
24
+ end
25
+
26
+ def teardown
27
+ Project.down
28
+ end
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
+ def test_nonstandard_primary_key
38
+ output = standard_dump
39
+ assert_match %r(:primary_key => "project_id"), output, "non-standard primary key not preserved"
40
+ end
41
+
42
+ end
@@ -0,0 +1,32 @@
1
+ # To run this script, run the following in a mysql instance:
2
+ #
3
+ # drop database if exists weblog_development;
4
+ # create database weblog_development;
5
+ # grant all on weblog_development.* to blog@localhost;
6
+ # flush privileges;
7
+
8
+ require 'jdbc_common'
9
+ require 'db/mysql'
10
+
11
+ class MysqlSimpleTest < Test::Unit::TestCase
12
+ include SimpleTestMethods
13
+ include ActiveRecord3TestMethods
14
+
15
+ def test_string_quoting_oddity
16
+ s = "0123456789a'a"
17
+ assert_equal "'0123456789a\\'a'", ActiveRecord::Base.connection.quote(s)
18
+
19
+ s2 = s[10,3]
20
+ assert_equal "a'a", s2
21
+ assert_equal "'a\\'a'", ActiveRecord::Base.connection.quote(s2)
22
+ end
23
+
24
+ def test_table_name_quoting_with_dot
25
+ s = "weblog_development.posts"
26
+ assert_equal "`weblog_development`.`posts`", ActiveRecord::Base.connection.quote_table_name(s)
27
+ end
28
+ end
29
+
30
+ class MysqlHasManyThroughTest < Test::Unit::TestCase
31
+ include HasManyThroughMethods
32
+ end
@@ -0,0 +1,54 @@
1
+ require 'jdbc_common'
2
+ require 'db/oracle'
3
+
4
+ class OracleSimpleTest < Test::Unit::TestCase
5
+ include SimpleTestMethods
6
+ end
7
+
8
+ class OracleSpecificTest < Test::Unit::TestCase
9
+ include MultibyteTestMethods # so we can get @java_con
10
+
11
+ def setup
12
+ super
13
+ @java_con.createStatement.execute "CREATE TABLE DEFAULT_NUMBER (VALUE NUMBER, DATUM DATE)"
14
+ @java_con.createStatement.execute "INSERT INTO DEFAULT_NUMBER (VALUE, DATUM) VALUES (0.076, TIMESTAMP'2009-11-05 00:00:00')"
15
+ @java_con.createStatement.execute "CREATE SYNONYM POSTS FOR ENTRIES"
16
+ @klass = Class.new(ActiveRecord::Base)
17
+ @klass.set_table_name "DEFAULT_NUMBER"
18
+ end
19
+
20
+ def teardown
21
+ @java_con.createStatement.execute "DROP TABLE DEFAULT_NUMBER"
22
+ @java_con.createStatement.execute "DROP SYNONYM POSTS"
23
+ super
24
+ end
25
+
26
+ def test_default_number_precision
27
+ obj = @klass.find(:first)
28
+ assert_equal 0.076, obj.value
29
+ end
30
+
31
+ # JRUBY-3675, ACTIVERECORD_JDBC-22
32
+ def test_load_date
33
+ obj = @klass.find(:first)
34
+ assert_not_nil obj.datum, "no date"
35
+ end
36
+
37
+ def test_load_null_date
38
+ @java_con.createStatement.execute "UPDATE DEFAULT_NUMBER SET DATUM = NULL"
39
+ obj = @klass.find(:first)
40
+ assert obj.datum.nil?
41
+ end
42
+
43
+ def test_model_access_by_synonym
44
+ @klass.set_table_name "POSTS"
45
+ entry_columns = Entry.columns_hash
46
+ @klass.columns.each do |c|
47
+ ec = entry_columns[c.name]
48
+ assert ec
49
+ assert_equal ec.sql_type, c.sql_type
50
+ assert_equal ec.type, c.type
51
+ end
52
+ end
53
+
54
+ end if defined?(JRUBY_VERSION)
@@ -0,0 +1,3 @@
1
+ # Specify version of activerecord with ENV['AR_VERSION'] if desired
2
+ gem 'rails', ENV['AR_VERSION'] if ENV['AR_VERSION']
3
+ require 'active_record/version'
@@ -0,0 +1,21 @@
1
+ require 'abstract_db_create'
2
+ require 'db/postgres'
3
+
4
+ class PostgresDbCreateTest < Test::Unit::TestCase
5
+ include AbstractDbCreate
6
+
7
+ def db_config
8
+ POSTGRES_CONFIG
9
+ end
10
+
11
+ if find_executable?("psql")
12
+ def test_rake_db_create
13
+ Rake::Task["db:create"].invoke
14
+ output = `psql -c '\\l'`
15
+ assert output =~ /#{@db_name}/m
16
+ end
17
+ else
18
+ def test_skipped
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'jdbc_common'
2
+ require 'models/mixed_case'
3
+
4
+ class MixedCaseTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Migration::MixedCase.up
8
+ end
9
+
10
+ def teardown
11
+ Migration::MixedCase.down
12
+ end
13
+
14
+ def test_create
15
+ mixed_case = MixedCase.create :SOME_value => 'some value'
16
+ assert_equal 'some value', mixed_case.SOME_value
17
+ end
18
+
19
+ end
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require 'jdbc_common'
4
+ require 'db/postgres'
5
+
6
+ class CreateUrls < ActiveRecord::Migration
7
+ def self.up
8
+ create_table 'urls', :id => false do |t|
9
+ t.text :uhash, :null => false
10
+ t.text :url, :null => false
11
+ end
12
+ execute "ALTER TABLE urls ADD PRIMARY KEY (uhash)"
13
+ end
14
+ def self.down
15
+ drop_table 'urls'
16
+ end
17
+ end
18
+
19
+ class Url < ActiveRecord::Base
20
+ set_primary_key :uhash
21
+ #Shouldn't be needed: set_sequence_name nil
22
+ end
23
+
24
+ class PostgresNonSeqPKey < Test::Unit::TestCase
25
+ def setup
26
+ CreateUrls.up
27
+ end
28
+
29
+ def teardown
30
+ CreateUrls.down
31
+ end
32
+
33
+ def test_create
34
+ url = Url.create! do |u|
35
+ u.uhash = 'uhash'
36
+ u.url = 'http://url'
37
+ end
38
+ assert_equal( 'uhash', url.uhash )
39
+ end
40
+ end
@@ -0,0 +1,22 @@
1
+ require 'jdbc_common'
2
+ require 'db/postgres'
3
+ require 'models/reserved_word'
4
+
5
+ class PostgresReservedWordsTest < Test::Unit::TestCase
6
+ def setup
7
+ CreateReservedWords.up
8
+ end
9
+ def teardown
10
+ CreateReservedWords.down
11
+ end
12
+
13
+ def test_quote_reserved_word_column
14
+ columns = ReservedWord.column_names - ["id"]
15
+ ReservedWord.connection.add_index :reserved_words, columns
16
+ indexes = ReservedWord.connection.indexes("reserved_words")
17
+ assert_equal 1, indexes.size
18
+ columns.each do |c|
19
+ assert indexes[0].columns.include?(c), "#{indexes[0].columns.inspect} does not include #{c.inspect}"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require 'jdbc_common'
4
+ require 'db/postgres'
5
+
6
+ class CreateSchema < ActiveRecord::Migration
7
+ def self.up
8
+ execute "CREATE SCHEMA test"
9
+ execute "CREATE TABLE test.people (id serial, name text)"
10
+ execute "INSERT INTO test.people (name) VALUES ('Alex')"
11
+ execute "CREATE TABLE public.people (id serial, wrongname text)"
12
+ end
13
+
14
+ def self.down
15
+ execute "DROP SCHEMA test CASCADE"
16
+ execute "DROP TABLE people"
17
+ end
18
+ end
19
+
20
+ class Person < ActiveRecord::Base
21
+ establish_connection POSTGRES_CONFIG.merge(:schema_search_path => 'test')
22
+ end
23
+
24
+ class PostgresSchemaSearchPathTest < Test::Unit::TestCase
25
+ def setup
26
+ CreateSchema.up
27
+ end
28
+
29
+ def teardown
30
+ CreateSchema.down
31
+ end
32
+
33
+ def test_columns
34
+ assert_equal(%w{id name}, Person.column_names)
35
+ end
36
+
37
+ def test_find_right
38
+ assert_not_nil Person.find_by_name("Alex")
39
+ end
40
+
41
+ def test_find_wrong
42
+ assert_raise NoMethodError do
43
+ Person.find_by_wrongname("Alex")
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ # To run this script, set up the following postgres user and database:
2
+ #
3
+ # sudo -u postgres createuser -D -A -P blog
4
+ # sudo -u postgres createdb -O blog weblog_development
5
+ #
6
+
7
+ require 'jdbc_common'
8
+ require 'db/postgres'
9
+
10
+ class PostgresSimpleTest < Test::Unit::TestCase
11
+ include SimpleTestMethods
12
+ include ActiveRecord3TestMethods
13
+ end
data/test/simple.rb ADDED
@@ -0,0 +1,494 @@
1
+ # -*- coding: utf-8 -*-
2
+ ActiveRecord::Schema.verbose = false
3
+ ActiveRecord::Base.time_zone_aware_attributes = true if ActiveRecord::Base.respond_to?(:time_zone_aware_attributes)
4
+ ActiveRecord::Base.default_timezone = :utc
5
+ #just a random zone, unlikely to be local, and not utc
6
+ Time.zone = 'Moscow' if Time.respond_to?(:zone)
7
+
8
+ module MigrationSetup
9
+ def setup
10
+ DbTypeMigration.up
11
+ CreateStringIds.up
12
+ CreateEntries.up
13
+ CreateAutoIds.up
14
+ CreateValidatesUniquenessOf.up
15
+
16
+ @connection = ActiveRecord::Base.connection
17
+ end
18
+
19
+ def teardown
20
+ DbTypeMigration.down
21
+ CreateStringIds.down
22
+ CreateEntries.down
23
+ CreateAutoIds.down
24
+ CreateValidatesUniquenessOf.down
25
+ ActiveRecord::Base.clear_active_connections!
26
+ end
27
+ end
28
+
29
+ module FixtureSetup
30
+ include MigrationSetup
31
+ def setup
32
+ super
33
+ @title = "First post!"
34
+ @content = "Hello from JRuby on Rails!"
35
+ @new_title = "First post updated title"
36
+ @rating = 205.76
37
+ @entry = Entry.create :title => @title, :content => @content, :rating => @rating
38
+ DbType.create
39
+ end
40
+ end
41
+
42
+ module SimpleTestMethods
43
+ include FixtureSetup
44
+
45
+ def test_entries_created
46
+ assert ActiveRecord::Base.connection.tables.find{|t| t =~ /^entries$/i}, "entries not created"
47
+ end
48
+
49
+ def test_entries_empty
50
+ Entry.delete_all
51
+ assert_equal 0, Entry.count
52
+ end
53
+
54
+ def test_find_with_string_slug
55
+ new_entry = Entry.create(:title => "Blah")
56
+ entry = Entry.find(new_entry.to_param)
57
+ assert_equal new_entry.id, entry.id
58
+ end
59
+
60
+ def test_insert_returns_id
61
+ unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
62
+ value = ActiveRecord::Base.connection.insert("INSERT INTO entries (title, content, rating) VALUES('insert_title', 'some content', 1)")
63
+ assert !value.nil?
64
+ entry = Entry.find_by_title('insert_title')
65
+ assert_equal value, entry.id
66
+ end
67
+ end
68
+
69
+ def test_create_new_entry
70
+ Entry.delete_all
71
+
72
+ post = Entry.new
73
+ post.title = @title
74
+ post.content = @content
75
+ post.rating = @rating
76
+ post.save
77
+
78
+ assert_equal 1, Entry.count
79
+ end
80
+
81
+ def test_create_partial_new_entry
82
+ new_entry = Entry.create(:title => "Blah")
83
+ new_entry2 = Entry.create(:title => "Bloh")
84
+ end
85
+
86
+ def test_find_and_update_entry
87
+ post = Entry.find(:first)
88
+ assert_equal @title, post.title
89
+ assert_equal @content, post.content
90
+ assert_equal @rating, post.rating
91
+
92
+ post.title = @new_title
93
+ post.save
94
+
95
+ post = Entry.find(:first)
96
+ assert_equal @new_title, post.title
97
+ end
98
+
99
+ def test_destroy_entry
100
+ prev_count = Entry.count
101
+ post = Entry.find(:first)
102
+ post.destroy
103
+
104
+ assert_equal prev_count - 1, Entry.count
105
+ end
106
+
107
+ if Time.respond_to?(:zone)
108
+ def test_save_time_with_utc
109
+ current_zone = Time.zone
110
+ default_zone = ActiveRecord::Base.default_timezone
111
+ ActiveRecord::Base.default_timezone = Time.zone = :utc
112
+ now = Time.now
113
+ my_time = Time.local now.year, now.month, now.day, now.hour, now.min, now.sec
114
+ m = DbType.create! :sample_datetime => my_time
115
+ m.reload
116
+ assert_equal my_time, m.sample_datetime
117
+ rescue
118
+ Time.zone = current_zone
119
+ ActiveRecord::Base.default_timezone = default_zone
120
+ end
121
+
122
+ def test_save_time
123
+ t = Time.now
124
+ #precision will only be expected to the second.
125
+ time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
126
+ e = DbType.find(:first)
127
+ e.sample_datetime = time
128
+ e.save!
129
+ e = DbType.find(:first)
130
+ assert_equal time.in_time_zone, e.sample_datetime
131
+ end
132
+
133
+ def test_save_date_time
134
+ t = Time.now
135
+ #precision will only be expected to the second.
136
+ time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
137
+ datetime = time.to_datetime
138
+ e = DbType.find(:first)
139
+ e.sample_datetime = datetime
140
+ e.save!
141
+ e = DbType.find(:first)
142
+ assert_equal time, e.sample_datetime.localtime
143
+ end
144
+
145
+ def test_save_time_with_zone
146
+ t = Time.now
147
+ #precision will only be expected to the second.
148
+ original_time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
149
+ time = original_time.in_time_zone
150
+ e = DbType.find(:first)
151
+ e.sample_datetime = time
152
+ e.save!
153
+ e = DbType.find(:first)
154
+ assert_equal time, e.sample_datetime
155
+ end
156
+ end
157
+
158
+ def test_save_float
159
+ e = DbType.find(:first)
160
+ e.sample_float = 12.0
161
+ e.save!
162
+
163
+ e = DbType.find(:first)
164
+ assert_equal(12.0, e.sample_float)
165
+ end
166
+
167
+ def test_save_date
168
+ date = Date.new(2007)
169
+ e = DbType.find(:first)
170
+ e.sample_date = date
171
+ e.save!
172
+ e = DbType.find(:first)
173
+ if DbType.columns_hash["sample_date"].type == :datetime
174
+ # Oracle doesn't distinguish btw date/datetime
175
+ assert_equal date, e.sample_date.to_date
176
+ else
177
+ assert_equal date, e.sample_date
178
+ end
179
+ end
180
+
181
+ def test_boolean
182
+ # An unset boolean should default to nil
183
+ e = DbType.find(:first)
184
+ assert_equal(nil, e.sample_boolean)
185
+
186
+ e.sample_boolean = true
187
+ e.save!
188
+
189
+ e = DbType.find(:first)
190
+ assert_equal(true, e.sample_boolean)
191
+ end
192
+
193
+ def test_integer
194
+ # An unset boolean should default to nil
195
+ e = DbType.find(:first)
196
+ assert_equal(nil, e.sample_integer)
197
+
198
+ e.sample_integer = 10
199
+ e.save!
200
+
201
+ e = DbType.find(:first)
202
+ assert_equal(10, e.sample_integer)
203
+ end
204
+
205
+ def test_text
206
+ # An unset boolean should default to nil
207
+ e = DbType.find(:first)
208
+
209
+ # Oracle adapter initializes all CLOB fields with empty_clob() function,
210
+ # so they all have a initial value of an empty string ''
211
+ assert_equal(nil, e.sample_text) unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
212
+
213
+ e.sample_text = "ooop"
214
+ e.save!
215
+
216
+ e = DbType.find(:first)
217
+ assert_equal("ooop", e.sample_text)
218
+ end
219
+
220
+ def test_string
221
+ e = DbType.find(:first)
222
+
223
+ # An empty string is treated as a null value in Oracle: http://www.techonthenet.com/oracle/questions/empty_null.php
224
+ assert_equal('', e.sample_string) unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
225
+ e.sample_string = "ooop"
226
+ e.save!
227
+
228
+ e = DbType.find(:first)
229
+ assert_equal("ooop", e.sample_string)
230
+ end
231
+
232
+ def test_save_binary
233
+ #string is 60_000 bytes
234
+ binary_string = "\000ABCDEFGHIJKLMNOPQRSTUVWXYZ'\001\003"*1#2_000
235
+ e = DbType.find(:first)
236
+ e.sample_binary = binary_string
237
+ e.send(:write_attribute, :binary, binary_string)
238
+ e.save!
239
+ e = DbType.find(:first)
240
+ assert_equal binary_string, e.sample_binary
241
+ end
242
+
243
+ def test_indexes
244
+ # Only test indexes if we have implemented it for the particular adapter
245
+ if @connection.respond_to?(:indexes)
246
+ indexes = @connection.indexes(:entries)
247
+ assert_equal(0, indexes.size)
248
+
249
+ index_name = "entries_index"
250
+ @connection.add_index(:entries, :updated_on, :name => index_name)
251
+
252
+ indexes = @connection.indexes(:entries)
253
+ assert_equal(1, indexes.size)
254
+ assert_equal "entries", indexes.first.table.to_s
255
+ assert_equal index_name, indexes.first.name
256
+ assert !indexes.first.unique
257
+ assert_equal ["updated_on"], indexes.first.columns
258
+ end
259
+ end
260
+
261
+ def test_dumping_schema
262
+ require 'active_record/schema_dumper'
263
+ @connection.add_index :entries, :title
264
+ StringIO.open do |io|
265
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, io)
266
+ assert_match(/add_index "entries",/, io.string)
267
+ end
268
+ @connection.remove_index :entries, :title
269
+
270
+ end
271
+
272
+ def test_nil_values
273
+ test = AutoId.create('value' => '')
274
+ assert_nil AutoId.find(test.id).value
275
+ end
276
+
277
+ def test_invalid
278
+ e = Entry.new(:title => @title, :content => @content, :rating => ' ')
279
+ assert e.valid?
280
+ end
281
+
282
+ def test_reconnect
283
+ assert_equal 1, Entry.count
284
+ @connection.reconnect!
285
+ assert_equal 1, Entry.count
286
+ end
287
+
288
+ if jruby?
289
+ def test_connection_valid
290
+ assert_raises(ActiveRecord::ActiveRecordError) do
291
+ @connection.raw_connection.with_connection_retry_guard do |c|
292
+ begin
293
+ stmt = c.createStatement
294
+ stmt.execute "bogus sql"
295
+ ensure
296
+ stmt.close rescue nil
297
+ end
298
+ end
299
+ end
300
+ end
301
+
302
+ class Animal < ActiveRecord::Base; end
303
+
304
+ # ENEBO: Is this really ar-jdbc-specific or a bug in our adapter?
305
+ def test_fetching_columns_for_nonexistent_table_should_raise
306
+ assert_raises(ActiveRecord::ActiveRecordError) do
307
+ Animal.columns
308
+ end
309
+ end
310
+ end
311
+
312
+ def test_disconnect
313
+ assert_equal 1, Entry.count
314
+ ActiveRecord::Base.clear_active_connections!
315
+ ActiveRecord::Base.connection_pool.disconnect! if ActiveRecord::Base.respond_to?(:connection_pool)
316
+ assert !ActiveRecord::Base.connected?
317
+ assert_equal 1, Entry.count
318
+ assert ActiveRecord::Base.connected?
319
+ end
320
+
321
+ def test_add_not_null_column_to_table
322
+ AddNotNullColumnToTable.up
323
+ AddNotNullColumnToTable.down
324
+ end
325
+
326
+ def test_validates_uniqueness_of_strings_case_sensitive
327
+ # In MySQL and MsSQL, string cmps are case-insensitive by default, so skip this test
328
+ return if ActiveRecord::Base.connection.config[:adapter] =~ /m[sy]sql/
329
+
330
+ name_lower = ValidatesUniquenessOfString.new(:cs_string => "name", :ci_string => '1')
331
+ name_lower.save!
332
+
333
+ name_upper = ValidatesUniquenessOfString.new(:cs_string => "NAME", :ci_string => '2')
334
+ assert_nothing_raised do
335
+ name_upper.save!
336
+ end
337
+
338
+ name_lower_collision = ValidatesUniquenessOfString.new(:cs_string => "name", :ci_string => '3')
339
+ assert_raise ActiveRecord::RecordInvalid do
340
+ name_lower_collision.save!
341
+ end
342
+
343
+ name_upper_collision = ValidatesUniquenessOfString.new(:cs_string => "NAME", :ci_string => '4')
344
+ assert_raise ActiveRecord::RecordInvalid do
345
+ name_upper_collision.save!
346
+ end
347
+ end
348
+
349
+ def test_validates_uniqueness_of_strings_case_insensitive
350
+ name_lower = ValidatesUniquenessOfString.new(:cs_string => '1', :ci_string => "name")
351
+ name_lower.save!
352
+
353
+ name_upper = ValidatesUniquenessOfString.new(:cs_string => '2', :ci_string => "NAME")
354
+ assert_raise ActiveRecord::RecordInvalid do
355
+ name_upper.save!
356
+ end
357
+
358
+ name_lower_collision = ValidatesUniquenessOfString.new(:cs_string => '3', :ci_string => "name")
359
+ assert_raise ActiveRecord::RecordInvalid do
360
+ name_lower_collision.save!
361
+ end
362
+
363
+ alternate_name_upper = ValidatesUniquenessOfString.new(:cs_string => '4', :ci_string => "ALTERNATE_NAME")
364
+ assert_nothing_raised do
365
+ alternate_name_upper.save!
366
+ end
367
+
368
+ alternate_name_upper_collision = ValidatesUniquenessOfString.new(:cs_string => '5', :ci_string => "ALTERNATE_NAME")
369
+ assert_raise ActiveRecord::RecordInvalid do
370
+ alternate_name_upper_collision.save!
371
+ end
372
+
373
+ alternate_name_lower = ValidatesUniquenessOfString.new(:cs_string => '6', :ci_string => "alternate_name")
374
+ assert_raise ActiveRecord::RecordInvalid do
375
+ alternate_name_lower.save!
376
+ end
377
+ end
378
+
379
+ class ChangeEntriesTable < ActiveRecord::Migration
380
+ def self.up
381
+ change_table :entries do |t|
382
+ t.string :author
383
+ end if respond_to?(:change_table)
384
+ end
385
+ def self.down
386
+ change_table :entries do |t|
387
+ t.remove :author
388
+ end if respond_to?(:change_table)
389
+ end
390
+ end
391
+ def test_change_table
392
+ ChangeEntriesTable.up
393
+ ChangeEntriesTable.down
394
+ end
395
+
396
+ def test_string_id
397
+ f = StringId.new
398
+ f.id = "some_string"
399
+ f.save
400
+ f = StringId.first #reload is essential
401
+ assert_equal "some_string", f.id
402
+ end
403
+ end
404
+
405
+ module MultibyteTestMethods
406
+ include MigrationSetup
407
+
408
+ if defined?(JRUBY_VERSION)
409
+ def setup
410
+ super
411
+ config = ActiveRecord::Base.connection.config
412
+ jdbc_driver = ActiveRecord::ConnectionAdapters::JdbcDriver.new(config[:driver])
413
+ jdbc_driver.load
414
+ @java_con = jdbc_driver.connection(config[:url], config[:username], config[:password])
415
+ @java_con.setAutoCommit(true)
416
+ end
417
+
418
+ def teardown
419
+ @java_con.close
420
+ super
421
+ end
422
+
423
+ def test_select_multibyte_string
424
+ @java_con.createStatement().execute("insert into entries (id, title, content) values (1, 'テスト', '本文')")
425
+ entry = Entry.find(:first)
426
+ assert_equal "テスト", entry.title
427
+ assert_equal "本文", entry.content
428
+ assert_equal entry, Entry.find_by_title("テスト")
429
+ end
430
+
431
+ def test_update_multibyte_string
432
+ Entry.create!(:title => "テスト", :content => "本文")
433
+ rs = @java_con.createStatement().executeQuery("select title, content from entries")
434
+ assert rs.next
435
+ assert_equal "テスト", rs.getString(1)
436
+ assert_equal "本文", rs.getString(2)
437
+ end
438
+ end
439
+
440
+ def test_multibyte_aliasing
441
+ str = "テスト"
442
+ quoted_alias = Entry.connection.quote_column_name(str)
443
+ sql = "SELECT title AS #{quoted_alias} from entries"
444
+ records = Entry.connection.select_all(sql)
445
+ records.each do |rec|
446
+ rec.keys.each do |key|
447
+ assert_equal str, key
448
+ end
449
+ end
450
+ end
451
+
452
+ def test_chinese_word
453
+ chinese_word = '中文'
454
+ new_entry = Entry.create(:title => chinese_word)
455
+ new_entry.reload
456
+ assert_equal chinese_word, new_entry.title
457
+ end
458
+ end
459
+
460
+ module NonUTF8EncodingMethods
461
+ def setup
462
+ @connection = ActiveRecord::Base.remove_connection
463
+ latin2_connection = @connection.dup
464
+ latin2_connection[:encoding] = 'latin2'
465
+ latin2_connection.delete(:url) # pre-gen url gets stashed; remove to re-gen
466
+ ActiveRecord::Base.establish_connection latin2_connection
467
+ CreateEntries.up
468
+ end
469
+
470
+ def teardown
471
+ CreateEntries.down
472
+ ActiveRecord::Base.establish_connection @connection
473
+ end
474
+
475
+ def test_nonutf8_encoding_in_entry
476
+ prague_district = 'hradčany'
477
+ new_entry = Entry.create :title => prague_district
478
+ new_entry.reload
479
+ assert_equal prague_district, new_entry.title
480
+ end
481
+ end
482
+
483
+ module ActiveRecord3TestMethods
484
+ def self.included(base)
485
+ base.send :include, Tests if ActiveRecord::VERSION::MAJOR == 3
486
+ end
487
+
488
+ module Tests
489
+ def test_where
490
+ entries = Entry.where(:title => @entry.title)
491
+ assert_equal @entry, entries.first
492
+ end
493
+ end
494
+ end