activerecord-jdbc-adapter 0.9.0.1 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +31 -0
- data/Manifest.txt +7 -0
- data/README.txt +15 -2
- data/Rakefile +28 -30
- data/lib/active_record/connection_adapters/h2_adapter.rb +13 -1
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +78 -96
- data/lib/jdbc_adapter/jdbc.rake +15 -5
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_cachedb.rb +4 -4
- data/lib/jdbc_adapter/jdbc_db2.rb +5 -7
- data/lib/jdbc_adapter/jdbc_derby.rb +57 -30
- data/lib/jdbc_adapter/jdbc_firebird.rb +2 -2
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +53 -46
- data/lib/jdbc_adapter/jdbc_informix.rb +4 -5
- data/lib/jdbc_adapter/jdbc_mimer.rb +2 -2
- data/lib/jdbc_adapter/jdbc_mssql.rb +25 -23
- data/lib/jdbc_adapter/jdbc_mysql.rb +20 -22
- data/lib/jdbc_adapter/jdbc_oracle.rb +115 -117
- data/lib/jdbc_adapter/jdbc_postgre.rb +129 -59
- data/lib/jdbc_adapter/jdbc_sqlite3.rb +149 -28
- data/lib/jdbc_adapter/jdbc_sybase.rb +13 -2
- data/lib/jdbc_adapter/missing_functionality_helper.rb +12 -3
- data/lib/jdbc_adapter/version.rb +1 -1
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +6 -1101
- data/src/java/jdbc_adapter/JdbcDerbySpec.java +26 -23
- data/src/java/jdbc_adapter/JdbcMySQLSpec.java +79 -28
- data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +35 -0
- data/src/java/jdbc_adapter/RubyJdbcConnection.java +1149 -0
- data/src/java/jdbc_adapter/SQLBlock.java +12 -3
- data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +41 -0
- data/test/activerecord/connection_adapters/type_conversion_test.rb +1 -1
- data/test/db/derby.rb +0 -3
- data/test/db/h2.rb +0 -3
- data/test/db/hsqldb.rb +1 -4
- data/test/db/mysql.rb +1 -0
- data/test/db/oracle.rb +5 -0
- data/test/db/sqlite3.rb +7 -3
- data/test/derby_migration_test.rb +21 -0
- data/test/has_many_through.rb +11 -4
- data/test/jdbc_common.rb +13 -1
- data/test/models/data_types.rb +11 -1
- data/test/models/mixed_case.rb +20 -0
- data/test/mysql_multibyte_test.rb +4 -0
- data/test/oracle_simple_test.rb +1 -1
- data/test/postgres_mixed_case_test.rb +19 -0
- data/test/simple.rb +220 -41
- data/test/sqlite3_simple_test.rb +83 -0
- data/test/sybase_jtds_simple_test.rb +6 -0
- metadata +12 -10
@@ -6,13 +6,22 @@
|
|
6
6
|
package jdbc_adapter;
|
7
7
|
|
8
8
|
import java.sql.Connection;
|
9
|
+
import java.sql.ResultSet;
|
9
10
|
import java.sql.SQLException;
|
10
|
-
import
|
11
|
+
import java.sql.Statement;
|
11
12
|
|
12
13
|
/**
|
13
14
|
*
|
14
15
|
* @author nicksieger
|
15
16
|
*/
|
16
|
-
public
|
17
|
-
|
17
|
+
public abstract class SQLBlock {
|
18
|
+
abstract Object call(Connection c) throws SQLException;
|
19
|
+
|
20
|
+
public void close(Statement statement) {
|
21
|
+
RubyJdbcConnection.close(statement);
|
22
|
+
}
|
23
|
+
|
24
|
+
public void close(ResultSet resultSet) {
|
25
|
+
RubyJdbcConnection.close(resultSet);
|
26
|
+
}
|
18
27
|
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/*
|
2
|
+
* To change this template, choose Tools | Templates
|
3
|
+
* and open the template in the editor.
|
4
|
+
*/
|
5
|
+
|
6
|
+
package jdbc_adapter;
|
7
|
+
|
8
|
+
import org.jruby.Ruby;
|
9
|
+
import org.jruby.RubyClass;
|
10
|
+
import org.jruby.runtime.ObjectAllocator;
|
11
|
+
import org.jruby.runtime.ThreadContext;
|
12
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
13
|
+
|
14
|
+
/**
|
15
|
+
*
|
16
|
+
* @author enebo
|
17
|
+
*/
|
18
|
+
public class Sqlite3RubyJdbcConnection extends RubyJdbcConnection {
|
19
|
+
protected Sqlite3RubyJdbcConnection(Ruby runtime, RubyClass metaClass) {
|
20
|
+
super(runtime, metaClass);
|
21
|
+
}
|
22
|
+
|
23
|
+
public static RubyClass createSqlite3JdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
|
24
|
+
RubyClass clazz = RubyJdbcConnection.getConnectionAdapters(runtime).defineClassUnder("Sqlite3JdbcConnection",
|
25
|
+
jdbcConnection, SQLITE3_JDBCCONNECTION_ALLOCATOR);
|
26
|
+
clazz.defineAnnotatedMethods(Sqlite3RubyJdbcConnection.class);
|
27
|
+
|
28
|
+
return clazz;
|
29
|
+
}
|
30
|
+
|
31
|
+
private static ObjectAllocator SQLITE3_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
|
32
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
33
|
+
return new Sqlite3RubyJdbcConnection(runtime, klass);
|
34
|
+
}
|
35
|
+
};
|
36
|
+
|
37
|
+
@Override
|
38
|
+
protected IRubyObject tables(ThreadContext context, String catalog, String schemaPattern, String tablePattern, String[] types) {
|
39
|
+
return (IRubyObject) withConnectionAndRetry(context, tableLookupBlock(context.getRuntime(), catalog, schemaPattern, tablePattern, types, true));
|
40
|
+
}
|
41
|
+
}
|
data/test/db/derby.rb
CHANGED
data/test/db/h2.rb
CHANGED
data/test/db/hsqldb.rb
CHANGED
@@ -4,12 +4,9 @@ config = {
|
|
4
4
|
}
|
5
5
|
|
6
6
|
ActiveRecord::Base.establish_connection(config)
|
7
|
-
logger = Logger.new 'hsqldb-testdb.log'
|
8
|
-
logger.level = Logger::DEBUG
|
9
|
-
ActiveRecord::Base.logger = logger
|
10
7
|
|
11
8
|
at_exit {
|
12
9
|
# Clean up hsqldb when done
|
13
10
|
Dir['test.db*'].each {|f| File.delete(f)}
|
14
|
-
File.delete('hsqldb-testdb.log')
|
11
|
+
File.delete('hsqldb-testdb.log') rescue nil #can't delete on windows
|
15
12
|
}
|
data/test/db/mysql.rb
CHANGED
data/test/db/oracle.rb
CHANGED
@@ -11,8 +11,13 @@ ActiveRecord::Base.establish_connection(config)
|
|
11
11
|
# Here are some notes of things I had to do to get running on Oracle
|
12
12
|
# XE.
|
13
13
|
#
|
14
|
+
# ON Linux:
|
14
15
|
# create tablespace weblog_development
|
15
16
|
# datafile '/usr/lib/oracle/xe/oradata/XE/weblog_development.dbf';
|
17
|
+
# ON Windows XP:
|
18
|
+
# create tablespace weblog_development
|
19
|
+
# datafile 'C:\ORACLEXE\ORADATA\XE\WEBLOGD.DBF' size 16m;
|
20
|
+
#
|
16
21
|
# create user blog identified by blog
|
17
22
|
# default tablespace weblog_development;
|
18
23
|
# grant all privileges to blog;
|
data/test/db/sqlite3.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
+
require 'jdbc/sqlite3' if jruby?
|
2
|
+
|
1
3
|
config = {
|
2
|
-
:adapter => 'sqlite3',
|
3
|
-
:
|
4
|
+
:adapter => jruby? ? 'jdbcsqlite3' : 'sqlite3',
|
5
|
+
:dbfile => 'test.sqlite3.db'
|
6
|
+
# :url => 'jdbc:sqlite:test.sqlite3.db',
|
7
|
+
# :driver => 'org.sqlite.JDBC'
|
4
8
|
}
|
5
9
|
|
6
10
|
ActiveRecord::Base.establish_connection(config)
|
7
11
|
|
8
12
|
at_exit {
|
9
|
-
# Clean up
|
13
|
+
# Clean up sqlite3 db when done
|
10
14
|
Dir['test.sqlite3*'].each {|f| File.delete(f)}
|
11
15
|
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'jdbc_common'
|
2
|
+
require 'db/derby'
|
3
|
+
|
4
|
+
class CreateDummies < ActiveRecord::Migration
|
5
|
+
def self.up
|
6
|
+
create_table :dummies, :force => true do |t|
|
7
|
+
t.string :year, :default => "", :null => false
|
8
|
+
end
|
9
|
+
add_index :dummies, :year, :unique => true
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class DerbyQuotingTest < Test::Unit::TestCase
|
15
|
+
include FixtureSetup
|
16
|
+
|
17
|
+
def test_create_table_column_quoting_vs_keywords
|
18
|
+
CreateDummies.up
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/test/has_many_through.rb
CHANGED
@@ -19,6 +19,7 @@ class CreateRbac < ActiveRecord::Migration
|
|
19
19
|
t.column :name, :string
|
20
20
|
t.column :controller_name, :string
|
21
21
|
t.column :actions, :string
|
22
|
+
t.column :hours, :float, :null => false
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -61,12 +62,18 @@ module HasManyThroughMethods
|
|
61
62
|
end
|
62
63
|
|
63
64
|
def test_has_many_through
|
64
|
-
role_rights = Right.create( {:name => "Administrator - Full Access To Roles", :actions => "*", :controller_name => "Admin::RolesController"} )
|
65
|
-
right_rights = Right.create( {:name => "Administrator - Full Access To Rights", :actions => "*", :controller_name => "Admin::RightsController"} )
|
66
|
-
|
67
65
|
admin_role = Role.create( {:name => "Administrator", :description => "System defined super user - access to right and role management."} )
|
66
|
+
admin_role.save
|
67
|
+
|
68
|
+
assert_equal(0, admin_role.rights.sum(:hours))
|
69
|
+
|
70
|
+
role_rights = Right.create( {:name => "Administrator - Full Access To Roles", :actions => "*", :controller_name => "Admin::RolesController", :hours => 0} )
|
71
|
+
right_rights = Right.create( {:name => "Administrator - Full Access To Rights", :actions => "*", :controller_name => "Admin::RightsController", :hours => 1.5} )
|
72
|
+
|
68
73
|
admin_role.rights << role_rights
|
69
74
|
admin_role.rights << right_rights
|
70
75
|
admin_role.save
|
76
|
+
|
77
|
+
assert_equal(1.5, admin_role.rights.sum(:hours))
|
71
78
|
end
|
72
|
-
end
|
79
|
+
end
|
data/test/jdbc_common.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
|
+
# Simple method to reduce the boilerplate
|
2
|
+
def jruby?
|
3
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
4
|
+
end
|
5
|
+
|
1
6
|
require 'rubygems'
|
2
7
|
# Specify version of activerecord with ENV['AR_VERSION'] if desired
|
3
8
|
gem 'activerecord', ENV['AR_VERSION'] if ENV['AR_VERSION']
|
4
|
-
require '
|
9
|
+
require 'active_record/version'
|
10
|
+
require 'jdbc_adapter' if jruby?
|
5
11
|
puts "Using activerecord version #{ActiveRecord::VERSION::STRING}"
|
6
12
|
puts "Specify version with AR_VERSION=={version} or RUBYLIB={path}"
|
7
13
|
require 'models/auto_id'
|
8
14
|
require 'models/entry'
|
15
|
+
require 'models/data_types'
|
9
16
|
require 'models/add_not_null_column_to_table'
|
10
17
|
require 'simple'
|
11
18
|
require 'has_many_through'
|
12
19
|
require 'test/unit'
|
20
|
+
|
21
|
+
# Comment/uncomment to enable logging to be loaded for any of the database adapters
|
22
|
+
# require 'db/logger'
|
23
|
+
|
24
|
+
|
data/test/models/data_types.rb
CHANGED
@@ -5,7 +5,17 @@ class DbTypeMigration < ActiveRecord::Migration
|
|
5
5
|
def self.up
|
6
6
|
create_table "db_types", :force => true do |t|
|
7
7
|
t.column :sample_timestamp, :timestamp
|
8
|
-
t.column :
|
8
|
+
t.column :sample_datetime, :datetime
|
9
|
+
t.column :sample_date, :date
|
10
|
+
t.column :sample_time, :time
|
11
|
+
t.column :sample_decimal, :decimal, :precision => 15, :scale => 0
|
12
|
+
t.column :sample_small_decimal, :decimal, :precision => 3, :scale => 2
|
13
|
+
t.column :sample_float, :float
|
14
|
+
t.column :sample_binary, :binary
|
15
|
+
t.column :sample_boolean, :boolean
|
16
|
+
t.column :sample_string, :string, :default => ''
|
17
|
+
t.column :sample_integer, :integer, :limit => 5
|
18
|
+
t.column :sample_text, :text
|
9
19
|
end
|
10
20
|
end
|
11
21
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
module Migration
|
5
|
+
class MixedCase < ActiveRecord::Migration
|
6
|
+
|
7
|
+
def self.up
|
8
|
+
create_table "mixed_cases" do |t|
|
9
|
+
t.column :SOME_value, :string
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
drop_table "mixed_cases"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class MixedCase < ActiveRecord::Base
|
20
|
+
end
|
data/test/oracle_simple_test.rb
CHANGED
@@ -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
|
data/test/simple.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
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)
|
3
7
|
|
4
8
|
module MigrationSetup
|
5
9
|
def setup
|
10
|
+
DbTypeMigration.up
|
6
11
|
CreateEntries.up
|
7
12
|
CreateAutoIds.up
|
8
13
|
|
@@ -10,6 +15,7 @@ module MigrationSetup
|
|
10
15
|
end
|
11
16
|
|
12
17
|
def teardown
|
18
|
+
DbTypeMigration.down
|
13
19
|
CreateEntries.down
|
14
20
|
CreateAutoIds.down
|
15
21
|
ActiveRecord::Base.clear_active_connections!
|
@@ -25,6 +31,7 @@ module FixtureSetup
|
|
25
31
|
@new_title = "First post updated title"
|
26
32
|
@rating = 205.76
|
27
33
|
Entry.create :title => @title, :content => @content, :rating => @rating
|
34
|
+
DbType.create
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
@@ -40,6 +47,15 @@ module SimpleTestMethods
|
|
40
47
|
assert_equal 0, Entry.count
|
41
48
|
end
|
42
49
|
|
50
|
+
def test_insert_returns_id
|
51
|
+
unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
|
52
|
+
value = ActiveRecord::Base.connection.insert("INSERT INTO entries (title, content, rating) VALUES('insert_title', 'some content', 1)")
|
53
|
+
assert !value.nil?
|
54
|
+
entry = Entry.find_by_title('insert_title')
|
55
|
+
assert_equal value, entry.id
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
43
59
|
def test_create_new_entry
|
44
60
|
Entry.delete_all
|
45
61
|
|
@@ -78,15 +94,132 @@ module SimpleTestMethods
|
|
78
94
|
assert_equal prev_count - 1, Entry.count
|
79
95
|
end
|
80
96
|
|
97
|
+
if Time.respond_to?(:zone)
|
98
|
+
def test_save_time
|
99
|
+
t = Time.now
|
100
|
+
#precision will only be expected to the second.
|
101
|
+
time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
|
102
|
+
e = DbType.find(:first)
|
103
|
+
e.sample_datetime = time
|
104
|
+
e.save!
|
105
|
+
e = DbType.find(:first)
|
106
|
+
assert_equal time.in_time_zone, e.sample_datetime
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_save_date_time
|
110
|
+
t = Time.now
|
111
|
+
#precision will only be expected to the second.
|
112
|
+
time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
|
113
|
+
datetime = time.to_datetime
|
114
|
+
e = DbType.find(:first)
|
115
|
+
e.sample_datetime = datetime
|
116
|
+
e.save!
|
117
|
+
e = DbType.find(:first)
|
118
|
+
assert_equal time, e.sample_datetime.localtime
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_save_time_with_zone
|
122
|
+
t = Time.now
|
123
|
+
#precision will only be expected to the second.
|
124
|
+
original_time = Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)
|
125
|
+
time = original_time.in_time_zone
|
126
|
+
e = DbType.find(:first)
|
127
|
+
e.sample_datetime = time
|
128
|
+
e.save!
|
129
|
+
e = DbType.find(:first)
|
130
|
+
assert_equal time, e.sample_datetime
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_save_float
|
135
|
+
e = DbType.find(:first)
|
136
|
+
e.sample_float = 12.0
|
137
|
+
e.save!
|
138
|
+
|
139
|
+
e = DbType.find(:first)
|
140
|
+
assert_equal(12.0, e.sample_float)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_save_date
|
144
|
+
date = Date.new(2007)
|
145
|
+
e = DbType.find(:first)
|
146
|
+
e.sample_date = date
|
147
|
+
e.save!
|
148
|
+
e = DbType.find(:first)
|
149
|
+
assert_equal date, e.sample_date
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_boolean
|
153
|
+
# An unset boolean should default to nil
|
154
|
+
e = DbType.find(:first)
|
155
|
+
assert_equal(nil, e.sample_boolean)
|
156
|
+
|
157
|
+
e.sample_boolean = true
|
158
|
+
e.save!
|
159
|
+
|
160
|
+
e = DbType.find(:first)
|
161
|
+
assert_equal(true, e.sample_boolean)
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_integer
|
165
|
+
# An unset boolean should default to nil
|
166
|
+
e = DbType.find(:first)
|
167
|
+
assert_equal(nil, e.sample_integer)
|
168
|
+
|
169
|
+
e.sample_integer = 10
|
170
|
+
e.save!
|
171
|
+
|
172
|
+
e = DbType.find(:first)
|
173
|
+
assert_equal(10, e.sample_integer)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_text
|
177
|
+
# An unset boolean should default to nil
|
178
|
+
e = DbType.find(:first)
|
179
|
+
|
180
|
+
# Oracle adapter initializes all CLOB fields with empty_clob() function,
|
181
|
+
# so they all have a initial value of an empty string ''
|
182
|
+
assert_equal(nil, e.sample_text) unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
|
183
|
+
|
184
|
+
e.sample_text = "ooop"
|
185
|
+
e.save!
|
186
|
+
|
187
|
+
e = DbType.find(:first)
|
188
|
+
assert_equal("ooop", e.sample_text)
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_string
|
192
|
+
e = DbType.find(:first)
|
193
|
+
|
194
|
+
# An empty string is treated as a null value in Oracle: http://www.techonthenet.com/oracle/questions/empty_null.php
|
195
|
+
assert_equal('', e.sample_string) unless ActiveRecord::Base.connection.adapter_name =~ /oracle/i
|
196
|
+
e.sample_string = "ooop"
|
197
|
+
e.save!
|
198
|
+
|
199
|
+
e = DbType.find(:first)
|
200
|
+
assert_equal("ooop", e.sample_string)
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_save_binary
|
204
|
+
#string is 60_000 bytes
|
205
|
+
binary_string = "\000ABCDEFGHIJKLMNOPQRSTUVWXYZ'\001\003"*1#2_000
|
206
|
+
e = DbType.find(:first)
|
207
|
+
e.sample_binary = binary_string
|
208
|
+
e.send(:write_attribute, :binary, binary_string)
|
209
|
+
e.save!
|
210
|
+
e = DbType.find(:first)
|
211
|
+
assert_equal binary_string, e.sample_binary
|
212
|
+
end
|
213
|
+
|
81
214
|
def test_indexes
|
82
215
|
# Only test indexes if we have implemented it for the particular adapter
|
83
216
|
if @connection.respond_to?(:indexes)
|
84
217
|
indexes = @connection.indexes(:entries)
|
85
218
|
assert_equal(0, indexes.size)
|
86
|
-
|
219
|
+
|
87
220
|
index_name = "entries_index"
|
88
221
|
@connection.add_index(:entries, :updated_on, :name => index_name)
|
89
|
-
|
222
|
+
|
90
223
|
indexes = @connection.indexes(:entries)
|
91
224
|
assert_equal(1, indexes.size)
|
92
225
|
assert_equal "entries", indexes.first.table.to_s
|
@@ -123,17 +256,28 @@ module SimpleTestMethods
|
|
123
256
|
assert_equal 1, Entry.count
|
124
257
|
end
|
125
258
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
259
|
+
if jruby?
|
260
|
+
def test_connection_valid
|
261
|
+
assert_raises(ActiveRecord::ActiveRecordError) do
|
262
|
+
@connection.raw_connection.with_connection_retry_guard do |c|
|
263
|
+
begin
|
264
|
+
stmt = c.createStatement
|
265
|
+
stmt.execute "bogus sql"
|
266
|
+
ensure
|
267
|
+
stmt.close rescue nil
|
268
|
+
end
|
134
269
|
end
|
135
270
|
end
|
136
271
|
end
|
272
|
+
|
273
|
+
class Animal < ActiveRecord::Base; end
|
274
|
+
|
275
|
+
# ENEBO: Is this really ar-jdbc-specific or a bug in our adapter?
|
276
|
+
def test_fetching_columns_for_nonexistent_table_should_raise
|
277
|
+
assert_raises(ActiveRecord::ActiveRecordError) do
|
278
|
+
Animal.columns
|
279
|
+
end
|
280
|
+
end
|
137
281
|
end
|
138
282
|
|
139
283
|
def test_disconnect
|
@@ -150,29 +294,57 @@ module SimpleTestMethods
|
|
150
294
|
AddNotNullColumnToTable.down
|
151
295
|
end
|
152
296
|
|
153
|
-
class
|
154
|
-
|
155
|
-
|
156
|
-
|
297
|
+
class ChangeEntriesTable < ActiveRecord::Migration
|
298
|
+
def self.up
|
299
|
+
change_table :entries do |t|
|
300
|
+
t.string :author
|
301
|
+
end if respond_to?(:change_table)
|
157
302
|
end
|
303
|
+
def self.down
|
304
|
+
change_table :entries do |t|
|
305
|
+
t.remove :author
|
306
|
+
end if respond_to?(:change_table)
|
307
|
+
end
|
308
|
+
end
|
309
|
+
def test_change_table
|
310
|
+
ChangeEntriesTable.up
|
311
|
+
ChangeEntriesTable.down
|
158
312
|
end
|
159
313
|
end
|
160
314
|
|
161
315
|
module MultibyteTestMethods
|
162
316
|
include MigrationSetup
|
163
317
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
318
|
+
if defined?(JRUBY_VERSION)
|
319
|
+
def setup
|
320
|
+
super
|
321
|
+
config = ActiveRecord::Base.connection.config
|
322
|
+
jdbc_driver = ActiveRecord::ConnectionAdapters::JdbcDriver.new(config[:driver])
|
323
|
+
jdbc_driver.load
|
324
|
+
@java_con = jdbc_driver.connection(config[:url], config[:username], config[:password])
|
325
|
+
@java_con.setAutoCommit(true)
|
326
|
+
end
|
172
327
|
|
173
|
-
|
174
|
-
|
175
|
-
|
328
|
+
def teardown
|
329
|
+
@java_con.close
|
330
|
+
super
|
331
|
+
end
|
332
|
+
|
333
|
+
def test_select_multibyte_string
|
334
|
+
@java_con.createStatement().execute("insert into entries (id, title, content) values (1, 'テスト', '本文')")
|
335
|
+
entry = Entry.find(:first)
|
336
|
+
assert_equal "テスト", entry.title
|
337
|
+
assert_equal "本文", entry.content
|
338
|
+
assert_equal entry, Entry.find_by_title("テスト")
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_update_multibyte_string
|
342
|
+
Entry.create!(:title => "テスト", :content => "本文")
|
343
|
+
rs = @java_con.createStatement().executeQuery("select title, content from entries")
|
344
|
+
assert rs.next
|
345
|
+
assert_equal "テスト", rs.getString(1)
|
346
|
+
assert_equal "本文", rs.getString(2)
|
347
|
+
end
|
176
348
|
end
|
177
349
|
|
178
350
|
def test_multibyte_aliasing
|
@@ -186,23 +358,7 @@ module MultibyteTestMethods
|
|
186
358
|
end
|
187
359
|
end
|
188
360
|
end
|
189
|
-
|
190
|
-
def test_select_multibyte_string
|
191
|
-
@java_con.createStatement().execute("insert into entries (id, title, content) values (1, 'テスト', '本文')")
|
192
|
-
entry = Entry.find(:first)
|
193
|
-
assert_equal "テスト", entry.title
|
194
|
-
assert_equal "本文", entry.content
|
195
|
-
assert_equal entry, Entry.find_by_title("テスト")
|
196
|
-
end
|
197
361
|
|
198
|
-
def test_update_multibyte_string
|
199
|
-
Entry.create!(:title => "テスト", :content => "本文")
|
200
|
-
rs = @java_con.createStatement().executeQuery("select title, content from entries")
|
201
|
-
assert rs.next
|
202
|
-
assert_equal "テスト", rs.getString(1)
|
203
|
-
assert_equal "本文", rs.getString(2)
|
204
|
-
end
|
205
|
-
|
206
362
|
def test_chinese_word
|
207
363
|
chinese_word = '中文'
|
208
364
|
new_entry = Entry.create(:title => chinese_word)
|
@@ -210,3 +366,26 @@ module MultibyteTestMethods
|
|
210
366
|
assert_equal chinese_word, new_entry.title
|
211
367
|
end
|
212
368
|
end
|
369
|
+
|
370
|
+
module NonUTF8EncodingMethods
|
371
|
+
def setup
|
372
|
+
@connection = ActiveRecord::Base.remove_connection
|
373
|
+
latin2_connection = @connection.dup
|
374
|
+
latin2_connection[:encoding] = 'latin2'
|
375
|
+
latin2_connection.delete(:url) # pre-gen url gets stashed; remove to re-gen
|
376
|
+
ActiveRecord::Base.establish_connection latin2_connection
|
377
|
+
CreateEntries.up
|
378
|
+
end
|
379
|
+
|
380
|
+
def teardown
|
381
|
+
CreateEntries.down
|
382
|
+
ActiveRecord::Base.establish_connection @connection
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_nonutf8_encoding_in_entry
|
386
|
+
prague_district = 'hradčany'
|
387
|
+
new_entry = Entry.create :title => prague_district
|
388
|
+
new_entry.reload
|
389
|
+
assert_equal prague_district, new_entry.title
|
390
|
+
end
|
391
|
+
end
|