activerecord-jdbc-adapter 1.1.1 → 1.1.2
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/.gemtest +0 -0
- data/History.txt +39 -0
- data/Manifest.txt +3 -0
- data/lib/arel/visitors/firebird.rb +17 -0
- data/lib/arel/visitors/sql_server.rb +2 -4
- data/lib/arjdbc/db2/adapter.rb +8 -0
- data/lib/arjdbc/derby/adapter.rb +7 -3
- data/lib/arjdbc/firebird/adapter.rb +5 -0
- data/lib/arjdbc/hsqldb/adapter.rb +5 -7
- data/lib/arjdbc/jdbc/adapter.rb +1 -1
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/column.rb +13 -4
- data/lib/arjdbc/jdbc/connection.rb +7 -5
- data/lib/arjdbc/jdbc/discover.rb +2 -2
- data/lib/arjdbc/jdbc/driver.rb +4 -13
- data/lib/arjdbc/jdbc/jdbc.rake +6 -2
- data/lib/arjdbc/mssql/adapter.rb +1 -1
- data/lib/arjdbc/mssql/limit_helpers.rb +13 -7
- data/lib/arjdbc/mysql/adapter.rb +12 -3
- data/lib/arjdbc/oracle/adapter.rb +16 -10
- data/lib/arjdbc/postgresql/adapter.rb +30 -11
- data/lib/arjdbc/sqlite3/adapter.rb +1 -1
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/package.rake +1 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +62 -0
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +2 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +59 -36
- data/test/models/add_not_null_column_to_table.rb +0 -3
- data/test/models/auto_id.rb +0 -3
- data/test/models/data_types.rb +5 -3
- data/test/models/entry.rb +0 -3
- data/test/models/mixed_case.rb +0 -3
- data/test/models/reserved_word.rb +0 -3
- data/test/models/string_id.rb +0 -3
- data/test/mysql_info_test.rb +1 -1
- data/test/postgres_db_create_test.rb +1 -1
- data/test/postgres_information_schema_leak_test.rb +29 -0
- data/test/postgres_schema_search_path_test.rb +5 -1
- data/test/postgres_simple_test.rb +25 -0
- data/test/simple.rb +14 -3
- metadata +8 -4
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
== 1.1.2
|
2
|
+
|
3
|
+
- Update version of H2 driver from 1.1.107 to 1.3.153 (Ketan
|
4
|
+
Padegaonkar, Jeremy Stephens)
|
5
|
+
- Fix errors in db:test:clone_structure with PostgreSQL (Andrea Campi)
|
6
|
+
- Fixing limit for sqlServer2000 if primary key is not named 'id'
|
7
|
+
(Luca Simone)
|
8
|
+
- DB2: define jdbc_columns (fixes table_exists? bug) (Nick Kreucher)
|
9
|
+
- ACTIVERECORD_JDBC-152 - omitting limit when dumping bytea fields
|
10
|
+
(Gregor Schmidt)
|
11
|
+
- Postgres doesn't support a limit for bytea columns (Alex Tambellini)
|
12
|
+
- JRUBY-5642: Default to schema public if no schema given for postgres
|
13
|
+
(Anthony Juckel)
|
14
|
+
- Sqlite3 supports float data type so use float (Alex Tambellini)
|
15
|
+
- GH #21: Now using sqlite3 driver from
|
16
|
+
http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC (thanks Ukabu)
|
17
|
+
- GH #65: PG: Respect integer sizes (Alex Tambellini)
|
18
|
+
- GH #59: PG: Properly escape bytea-escaped string
|
19
|
+
- GH #53: oracle: allow configuration of schema through schema: key
|
20
|
+
- GH #50: PG: support multiple schema in search_path (Daniel
|
21
|
+
Schreiber)
|
22
|
+
- GH #25: Reload ArJdbc.column_types if number of constants changed
|
23
|
+
- GH #47: Allow table statistics for indexes to be approximate; speeds
|
24
|
+
up Oracle
|
25
|
+
- GH #67: Change primary_keys to use the same catalog/schema/table
|
26
|
+
separation logic as columns_internal (Marcus Brito). This change
|
27
|
+
allows set_table_name to specify a custom schema.
|
28
|
+
- GH #49: mssql: quote table names like column names
|
29
|
+
- GH #56: mssql: Fix 'select 1' behavior introduced by AR 3.0.7
|
30
|
+
- GH #55: Make decimal columns with no precision or scale stay
|
31
|
+
decimals
|
32
|
+
- GH #45: Add Arel limit support for Firebird (Systho))
|
33
|
+
- GH #39: PG: allow negative integer default values
|
34
|
+
- GH #19: Make a stub Mysql::Error class
|
35
|
+
- ACTIVERECORD_JDBC-148: mssql: Ensure regex doesn't match 'from' in a
|
36
|
+
field name
|
37
|
+
- GH#31: mssql: Remove extra code breaking mssql w/o limit
|
38
|
+
- ACTIVERECORD_JDBC-156: mssql: Logic fix for detecting select_count?
|
39
|
+
|
1
40
|
== 1.1.1
|
2
41
|
|
3
42
|
- Arel 2.0.7 compatibility: fix bugs arising from use of Arel 2.0.7 +
|
data/Manifest.txt
CHANGED
@@ -28,6 +28,7 @@ lib/arel/engines/sql/compilers/mssql_compiler.rb
|
|
28
28
|
lib/arel/visitors/compat.rb
|
29
29
|
lib/arel/visitors/db2.rb
|
30
30
|
lib/arel/visitors/derby.rb
|
31
|
+
lib/arel/visitors/firebird.rb
|
31
32
|
lib/arel/visitors/hsqldb.rb
|
32
33
|
lib/arel/visitors/sql_server.rb
|
33
34
|
lib/arjdbc/db2.rb
|
@@ -122,6 +123,7 @@ test/oracle_specific_test.rb
|
|
122
123
|
test/pick_rails_version.rb
|
123
124
|
test/postgres_db_create_test.rb
|
124
125
|
test/postgres_drop_db_test.rb
|
126
|
+
test/postgres_information_schema_leak_test.rb
|
125
127
|
test/postgres_mixed_case_test.rb
|
126
128
|
test/postgres_nonseq_pkey_test.rb
|
127
129
|
test/postgres_reserved_test.rb
|
@@ -155,6 +157,7 @@ test/models/reserved_word.rb
|
|
155
157
|
test/models/string_id.rb
|
156
158
|
test/models/validates_uniqueness_of_string.rb
|
157
159
|
lib/arjdbc/jdbc/jdbc.rake
|
160
|
+
src/java/arjdbc/db2/DB2RubyJdbcConnection.java
|
158
161
|
src/java/arjdbc/derby/DerbyModule.java
|
159
162
|
src/java/arjdbc/h2/H2RubyJdbcConnection.java
|
160
163
|
src/java/arjdbc/informix/InformixRubyJdbcConnection.java
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'arel/visitors/compat'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
module Visitors
|
5
|
+
class Firebird < Arel::Visitors::ToSql
|
6
|
+
def visit_Arel_Nodes_SelectStatement o
|
7
|
+
[
|
8
|
+
o.cores.map { |x| visit_Arel_Nodes_SelectCore x }.join,
|
9
|
+
("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
|
10
|
+
("ROWS #{limit_for(o.limit)} " if o.limit),
|
11
|
+
("TO #{o.offset} " if o.offset),
|
12
|
+
].compact.join ' '
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -7,8 +7,8 @@ module Arel
|
|
7
7
|
|
8
8
|
def select_count? o
|
9
9
|
sel = o.cores.length == 1 && o.cores.first
|
10
|
-
projections = sel.projections.length == 1 && sel.projections
|
11
|
-
Arel::Nodes::Count === projections.first
|
10
|
+
projections = sel && sel.projections.length == 1 && sel.projections
|
11
|
+
projections && Arel::Nodes::Count === projections.first
|
12
12
|
end
|
13
13
|
|
14
14
|
# Need to mimic the subquery logic in ARel 1.x for select count with limit
|
@@ -30,8 +30,6 @@ module Arel
|
|
30
30
|
order ||= "ORDER BY #{@connection.determine_order_clause(sql)}"
|
31
31
|
replace_limit_offset!(sql, limit_for(o.limit).to_i, o.offset && o.offset.value.to_i, order)
|
32
32
|
sql = "SELECT COUNT(*) AS count_id FROM (#{sql}) AS subquery" if subquery
|
33
|
-
elsif order
|
34
|
-
sql << " #{order}"
|
35
33
|
else
|
36
34
|
sql = super
|
37
35
|
end
|
data/lib/arjdbc/db2/adapter.rb
CHANGED
@@ -5,6 +5,10 @@ module ArJdbc
|
|
5
5
|
lambda { |cfg, column| column.extend(::ArJdbc::DB2::Column) } ]
|
6
6
|
end
|
7
7
|
|
8
|
+
def self.jdbc_connection_class
|
9
|
+
::ActiveRecord::ConnectionAdapters::DB2JdbcConnection
|
10
|
+
end
|
11
|
+
|
8
12
|
module Column
|
9
13
|
def type_cast(value)
|
10
14
|
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
@@ -319,6 +323,10 @@ module ArJdbc
|
|
319
323
|
cols
|
320
324
|
end
|
321
325
|
|
326
|
+
def jdbc_columns(table_name, name = nil)
|
327
|
+
columns(table_name, name)
|
328
|
+
end
|
329
|
+
|
322
330
|
def indexes(table_name, name = nil)
|
323
331
|
@connection.indexes(table_name, name, db2_schema)
|
324
332
|
end
|
data/lib/arjdbc/derby/adapter.rb
CHANGED
@@ -37,9 +37,13 @@ module ::ArJdbc
|
|
37
37
|
|
38
38
|
module Column
|
39
39
|
def simplified_type(field_type)
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
case field_type
|
41
|
+
when /smallint/i then :boolean
|
42
|
+
when /real/i then :float
|
43
|
+
when /decimal/i then :decimal
|
44
|
+
else
|
45
|
+
super
|
46
|
+
end
|
43
47
|
end
|
44
48
|
|
45
49
|
# Post process default value from JDBC into a Rails-friendly format (columns{-internal})
|
@@ -23,6 +23,11 @@ module ::ArJdbc
|
|
23
23
|
'Firebird'
|
24
24
|
end
|
25
25
|
|
26
|
+
def arel2_visitors
|
27
|
+
require 'arel/visitors/firebird'
|
28
|
+
{'firebird' => ::Arel::Visitors::Firebird, 'firebirdsql' => ::Arel::Visitors::Firebird}
|
29
|
+
end
|
30
|
+
|
26
31
|
def modify_types(tp)
|
27
32
|
tp[:primary_key] = 'INTEGER NOT NULL PRIMARY KEY'
|
28
33
|
tp[:string][:limit] = 252
|
@@ -8,14 +8,12 @@ module ::ArJdbc
|
|
8
8
|
private
|
9
9
|
def simplified_type(field_type)
|
10
10
|
case field_type
|
11
|
-
when /longvarchar/i
|
12
|
-
|
13
|
-
when /
|
14
|
-
|
15
|
-
when /real/i
|
16
|
-
:float
|
11
|
+
when /longvarchar/i then :text
|
12
|
+
when /tinyint/i then :boolean
|
13
|
+
when /real/i then :float
|
14
|
+
when /decimal/i then :decimal
|
17
15
|
else
|
18
|
-
super
|
16
|
+
super
|
19
17
|
end
|
20
18
|
end
|
21
19
|
|
data/lib/arjdbc/jdbc/adapter.rb
CHANGED
Binary file
|
data/lib/arjdbc/jdbc/column.rb
CHANGED
@@ -17,13 +17,22 @@ module ActiveRecord
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.column_types
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
# GH #25: reset the column types if the # of constants changed
|
21
|
+
# since last call
|
22
|
+
if ::ArJdbc.constants.size != driver_constants.size
|
23
|
+
@driver_constants = nil
|
24
|
+
@column_types = nil
|
25
|
+
end
|
26
|
+
@column_types ||= driver_constants.select {|c|
|
27
|
+
c.respond_to? :column_selector }.map {|c|
|
28
|
+
c.column_selector }.inject({}) {|h,val|
|
24
29
|
h[val[0]] = val[1]; h }
|
25
30
|
end
|
26
31
|
|
32
|
+
def self.driver_constants
|
33
|
+
@driver_constants ||= ::ArJdbc.constants.map {|c| ::ArJdbc.const_get c }
|
34
|
+
end
|
35
|
+
|
27
36
|
protected
|
28
37
|
def call_discovered_column_callbacks(config)
|
29
38
|
dialect = config[:dialect] || config[:driver]
|
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
attr_reader :config
|
6
6
|
|
7
7
|
def config=(config)
|
8
|
-
@config = config.symbolize_keys
|
8
|
+
@config = config.symbolize_keys
|
9
9
|
end
|
10
10
|
|
11
11
|
def configure_connection
|
@@ -62,9 +62,7 @@ module ActiveRecord
|
|
62
62
|
user = config[:username].to_s
|
63
63
|
pass = config[:password].to_s
|
64
64
|
url = configure_url
|
65
|
-
|
66
|
-
jdbc_driver = JdbcDriver.new(driver)
|
67
|
-
jdbc_driver.load
|
65
|
+
jdbc_driver = (config[:driver_instance] ||= JdbcDriver.new(driver))
|
68
66
|
@connection_factory = JdbcConnectionFactory.impl do
|
69
67
|
jdbc_driver.connection(url, user, pass)
|
70
68
|
end
|
@@ -90,13 +88,17 @@ module ActiveRecord
|
|
90
88
|
rescue ::ActiveRecord::ActiveRecordError
|
91
89
|
raise
|
92
90
|
rescue Exception => e
|
93
|
-
raise "The driver encountered an unknown error: #{e}"
|
91
|
+
raise ::ActiveRecord::JDBCError.new("The driver encountered an unknown error: #{e}").tap do |err|
|
92
|
+
err.errno = 0
|
93
|
+
err.sql_exception = e
|
94
|
+
end
|
94
95
|
end
|
95
96
|
|
96
97
|
def adapter=(adapter)
|
97
98
|
@adapter = adapter
|
98
99
|
@native_database_types = dup_native_types
|
99
100
|
@adapter.modify_types(@native_database_types)
|
101
|
+
@adapter.config.replace(config)
|
100
102
|
end
|
101
103
|
|
102
104
|
# Duplicate all native types into new hash structure so it can be modified
|
data/lib/arjdbc/jdbc/discover.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArJdbc
|
2
2
|
def self.discover_extensions
|
3
|
-
if defined?(::Gem)
|
4
|
-
files = Gem.find_files('arjdbc/discover')
|
3
|
+
if defined?(::Gem) && ::Gem.respond_to?(:find_files)
|
4
|
+
files = ::Gem.find_files('arjdbc/discover')
|
5
5
|
else
|
6
6
|
files = $LOAD_PATH.map do |p|
|
7
7
|
discover = File.join(p, 'arjdbc','discover.rb')
|
data/lib/arjdbc/jdbc/driver.rb
CHANGED
@@ -3,6 +3,7 @@ module ActiveRecord
|
|
3
3
|
class JdbcDriver
|
4
4
|
def initialize(name)
|
5
5
|
@name = name
|
6
|
+
@driver = driver_class.new
|
6
7
|
end
|
7
8
|
|
8
9
|
def driver_class
|
@@ -12,32 +13,22 @@ module ActiveRecord
|
|
12
13
|
unless Jdbc.const_defined?(driver_class_const)
|
13
14
|
driver_class_name = @name
|
14
15
|
Jdbc.module_eval do
|
15
|
-
|
16
|
+
java_import(driver_class_name) { driver_class_const }
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
19
20
|
driver_class = Jdbc.const_get(driver_class_const)
|
20
|
-
raise "You specify a driver for your JDBC connection" unless driver_class
|
21
|
+
raise "You must specify a driver for your JDBC connection" unless driver_class
|
21
22
|
driver_class
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
def load
|
26
|
-
Jdbc::DriverManager.registerDriver(create)
|
27
|
-
end
|
28
|
-
|
29
26
|
def connection(url, user, pass)
|
30
|
-
Jdbc::DriverManager.getConnection(url, user, pass)
|
31
|
-
rescue
|
32
27
|
# bypass DriverManager to get around problem with dynamically loaded jdbc drivers
|
33
28
|
props = java.util.Properties.new
|
34
29
|
props.setProperty("user", user)
|
35
30
|
props.setProperty("password", pass)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def create
|
40
|
-
driver_class.new
|
31
|
+
@driver.connect(url, props)
|
41
32
|
end
|
42
33
|
end
|
43
34
|
end
|
data/lib/arjdbc/jdbc/jdbc.rake
CHANGED
@@ -54,8 +54,12 @@ namespace :db do
|
|
54
54
|
if config['adapter'] =~ /postgresql/i
|
55
55
|
config = config.dup
|
56
56
|
if config['url']
|
57
|
-
|
58
|
-
|
57
|
+
url = config['url'].dup
|
58
|
+
db = url[/\/([^\/]*)$/, 1]
|
59
|
+
if db
|
60
|
+
url[/\/([^\/]*)$/, 1] = 'postgres'
|
61
|
+
config['url'] = url
|
62
|
+
end
|
59
63
|
else
|
60
64
|
db = config['database']
|
61
65
|
config['database'] = 'postgres'
|
data/lib/arjdbc/mssql/adapter.rb
CHANGED
@@ -5,7 +5,7 @@ module ::ArJdbc
|
|
5
5
|
def get_table_name(sql)
|
6
6
|
if sql =~ /^\s*insert\s+into\s+([^\(\s,]+)\s*|^\s*update\s+([^\(\s,]+)\s*/i
|
7
7
|
$1
|
8
|
-
elsif sql =~
|
8
|
+
elsif sql =~ /\bfrom\s+([^\(\s,]+)\s*/i
|
9
9
|
$1
|
10
10
|
else
|
11
11
|
nil
|
@@ -31,14 +31,15 @@ module ::ArJdbc
|
|
31
31
|
rest = rest_of_query[/FROM/i=~ rest_of_query.. -1]
|
32
32
|
#need the table name for avoiding amiguity
|
33
33
|
table_name = LimitHelpers.get_table_name(sql)
|
34
|
+
primary_key = order[/(\w*id\w*)/i]
|
34
35
|
#I am not sure this will cover all bases. but all the tests pass
|
35
|
-
new_order = "ORDER BY #{order}, #{table_name}
|
36
|
+
new_order = "ORDER BY #{order}, #{table_name}.#{primary_key}" if order.index("#{table_name}.#{primary_key}").nil?
|
36
37
|
new_order ||= order
|
37
38
|
|
38
39
|
if (rest_of_query.match(/WHERE/).nil?)
|
39
|
-
new_sql = "#{select} TOP #{limit} #{rest_of_query} WHERE #{table_name}
|
40
|
+
new_sql = "#{select} TOP #{limit} #{rest_of_query} WHERE #{table_name}.#{primary_key} NOT IN (#{select} TOP #{offset} #{table_name}.#{primary_key} #{rest} #{new_order}) #{order} "
|
40
41
|
else
|
41
|
-
new_sql = "#{select} TOP #{limit} #{rest_of_query} AND #{table_name}
|
42
|
+
new_sql = "#{select} TOP #{limit} #{rest_of_query} AND #{table_name}.#{primary_key} NOT IN (#{select} TOP #{offset} #{table_name}.#{primary_key} #{rest} #{new_order}) #{order} "
|
42
43
|
end
|
43
44
|
|
44
45
|
sql.replace(new_sql)
|
@@ -67,10 +68,15 @@ module ::ArJdbc
|
|
67
68
|
end_row = offset + limit.to_i
|
68
69
|
find_select = /\b(SELECT(?:\s+DISTINCT)?)\b(.*)/im
|
69
70
|
whole, select, rest_of_query = find_select.match(sql).to_a
|
70
|
-
|
71
|
-
|
71
|
+
rest_of_query.strip!
|
72
|
+
if rest_of_query.first == "1"
|
73
|
+
rest_of_query[0] = "*"
|
72
74
|
end
|
73
|
-
|
75
|
+
if rest_of_query.first == "*"
|
76
|
+
from_table = LimitHelpers.get_table_name(rest_of_query)
|
77
|
+
rest_of_query = from_table + '.' + rest_of_query
|
78
|
+
end
|
79
|
+
new_sql = "#{select} t.* FROM (SELECT ROW_NUMBER() OVER(#{order}) AS _row_num, #{rest_of_query}"
|
74
80
|
new_sql << ") AS t WHERE t._row_num BETWEEN #{start_row.to_s} AND #{end_row.to_s}"
|
75
81
|
sql.replace(new_sql)
|
76
82
|
end
|
data/lib/arjdbc/mysql/adapter.rb
CHANGED
@@ -39,9 +39,13 @@ module ::ArJdbc
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def simplified_type(field_type)
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
case field_type
|
43
|
+
when /tinyint\(1\)|bit/i then :boolean
|
44
|
+
when /enum/i then :string
|
45
|
+
when /decimal/i then :decimal
|
46
|
+
else
|
47
|
+
super
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
def extract_limit(sql_type)
|
@@ -410,6 +414,11 @@ module ActiveRecord::ConnectionAdapters
|
|
410
414
|
end
|
411
415
|
|
412
416
|
module Mysql # :nodoc:
|
417
|
+
remove_const(:Error) if const_defined?(:Error)
|
418
|
+
|
419
|
+
class Error < ::ActiveRecord::JDBCError
|
420
|
+
end
|
421
|
+
|
413
422
|
def self.client_version
|
414
423
|
50400 # faked out for AR tests
|
415
424
|
end
|
@@ -23,9 +23,9 @@ module ::ArJdbc
|
|
23
23
|
end
|
24
24
|
require 'arjdbc/jdbc/quoted_primary_key'
|
25
25
|
ActiveRecord::Base.extend ArJdbc::QuotedPrimaryKeyExtension
|
26
|
-
mod.
|
27
|
-
alias_chained_method :insert, :query_dirty, :
|
28
|
-
alias_chained_method :columns, :query_cache, :
|
26
|
+
(class << mod; self; end).class_eval do
|
27
|
+
alias_chained_method :insert, :query_dirty, :ora_insert
|
28
|
+
alias_chained_method :columns, :query_cache, :ora_columns
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -68,6 +68,7 @@ module ::ArJdbc
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def self.guess_date_or_time(value)
|
71
|
+
return value if Date === value
|
71
72
|
(value && value.hour == 0 && value.min == 0 && value.sec == 0) ?
|
72
73
|
Date.new(value.year, value.month, value.day) : value
|
73
74
|
end
|
@@ -128,7 +129,7 @@ module ::ArJdbc
|
|
128
129
|
|
129
130
|
def create_table(name, options = {}) #:nodoc:
|
130
131
|
super(name, options)
|
131
|
-
seq_name = options[:sequence_name] ||
|
132
|
+
seq_name = options[:sequence_name] || default_sequence_name(name)
|
132
133
|
start_value = options[:sequence_start_value] || 10000
|
133
134
|
raise ActiveRecord::StatementInvalid.new("name #{seq_name} too long") if seq_name.length > table_alias_length
|
134
135
|
execute "CREATE SEQUENCE #{seq_name} START WITH #{start_value}" unless options[:id] == false
|
@@ -140,8 +141,8 @@ module ::ArJdbc
|
|
140
141
|
end
|
141
142
|
|
142
143
|
def drop_table(name, options = {}) #:nodoc:
|
143
|
-
super(name)
|
144
|
-
seq_name = options[:sequence_name] ||
|
144
|
+
super(name) rescue nil
|
145
|
+
seq_name = options[:sequence_name] || default_sequence_name(name)
|
145
146
|
execute "DROP SEQUENCE #{seq_name}" rescue nil
|
146
147
|
end
|
147
148
|
|
@@ -162,7 +163,7 @@ module ::ArJdbc
|
|
162
163
|
defined?(::Arel::SqlLiteral) && ::Arel::SqlLiteral === value
|
163
164
|
end
|
164
165
|
|
165
|
-
def
|
166
|
+
def ora_insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
|
166
167
|
if (id_value && !sql_literal?(id_value)) || pk.nil?
|
167
168
|
# Pre-assigned id or table without a primary key
|
168
169
|
# Presence of #to_sql means an Arel literal bind variable
|
@@ -333,7 +334,7 @@ module ::ArJdbc
|
|
333
334
|
@connection.tables(nil, oracle_schema)
|
334
335
|
end
|
335
336
|
|
336
|
-
def
|
337
|
+
def ora_columns(table_name, name=nil)
|
337
338
|
@connection.columns_internal(table_name, name, oracle_schema)
|
338
339
|
end
|
339
340
|
|
@@ -394,10 +395,15 @@ module ::ArJdbc
|
|
394
395
|
end
|
395
396
|
|
396
397
|
private
|
397
|
-
# In Oracle, schemas are created under your username:
|
398
|
+
# In Oracle, schemas are usually created under your username:
|
398
399
|
# http://www.oracle.com/technology/obe/2day_dba/schema/schema.htm
|
400
|
+
# But allow separate configuration as "schema:" anyway (GH #53)
|
399
401
|
def oracle_schema
|
400
|
-
|
402
|
+
if @config[:schema]
|
403
|
+
@config[:schema].to_s
|
404
|
+
elsif @config[:username]
|
405
|
+
@config[:username].to_s
|
406
|
+
end
|
401
407
|
end
|
402
408
|
|
403
409
|
def select(sql, name=nil)
|
@@ -5,8 +5,9 @@ end
|
|
5
5
|
module ::ArJdbc
|
6
6
|
module PostgreSQL
|
7
7
|
def self.extended(mod)
|
8
|
-
mod.
|
9
|
-
alias_chained_method :insert, :query_dirty, :
|
8
|
+
(class << mod; self; end).class_eval do
|
9
|
+
alias_chained_method :insert, :query_dirty, :pg_insert
|
10
|
+
alias_chained_method :columns, :query_cache, :pg_columns
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
@@ -28,9 +29,13 @@ module ::ArJdbc
|
|
28
29
|
|
29
30
|
def extract_limit(sql_type)
|
30
31
|
case sql_type
|
31
|
-
when /^
|
32
|
+
when /^int2/i; 2
|
32
33
|
when /^smallint/i; 2
|
33
|
-
when /^
|
34
|
+
when /^int4/i; nil
|
35
|
+
when /^integer/i; nil
|
36
|
+
when /^int8/i; 8
|
37
|
+
when /^bigint/i; 8
|
38
|
+
when /^(bool|text|date|time|bytea)/i; nil # ACTIVERECORD_JDBC-135,139
|
34
39
|
else super
|
35
40
|
end
|
36
41
|
end
|
@@ -43,6 +48,7 @@ module ::ArJdbc
|
|
43
48
|
return :float if field_type =~ /^(?:real|double precision)$/i
|
44
49
|
return :binary if field_type =~ /^bytea/i
|
45
50
|
return :boolean if field_type =~ /^bool/i
|
51
|
+
return :decimal if field_type == 'numeric(131089)'
|
46
52
|
super
|
47
53
|
end
|
48
54
|
|
@@ -65,7 +71,7 @@ module ::ArJdbc
|
|
65
71
|
return $1 if value =~ /^'(.*)'::(bpchar|text|character varying|bytea)$/
|
66
72
|
|
67
73
|
# Numeric values
|
68
|
-
return value if value =~
|
74
|
+
return value.delete("()") if value =~ /^\(?-?[0-9]+(\.[0-9]*)?\)?/
|
69
75
|
|
70
76
|
# Fixed dates / timestamp
|
71
77
|
return $1 if value =~ /^'(.+)'::(date|timestamp)/
|
@@ -239,7 +245,7 @@ module ::ArJdbc
|
|
239
245
|
nil
|
240
246
|
end
|
241
247
|
|
242
|
-
def
|
248
|
+
def pg_insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
|
243
249
|
# Extract the table from the insert sql. Yuck.
|
244
250
|
table = sql.split(" ", 4)[2].gsub('"', '')
|
245
251
|
|
@@ -273,14 +279,27 @@ module ::ArJdbc
|
|
273
279
|
id_value
|
274
280
|
end
|
275
281
|
|
276
|
-
def
|
282
|
+
def pg_columns(table_name, name=nil)
|
277
283
|
schema_name = @config[:schema_search_path]
|
278
284
|
if table_name =~ /\./
|
279
285
|
parts = table_name.split(/\./)
|
280
286
|
table_name = parts.pop
|
281
287
|
schema_name = parts.join(".")
|
282
288
|
end
|
283
|
-
|
289
|
+
schema_list = if schema_name.nil?
|
290
|
+
[]
|
291
|
+
else
|
292
|
+
schema_name.split(/\s*,\s*/)
|
293
|
+
end
|
294
|
+
while schema_list.size > 1
|
295
|
+
s = schema_list.shift
|
296
|
+
begin
|
297
|
+
return @connection.columns_internal(table_name, name, s)
|
298
|
+
rescue ActiveRecord::JDBCError=>ignored_for_next_schema
|
299
|
+
end
|
300
|
+
end
|
301
|
+
s = schema_list.shift
|
302
|
+
return @connection.columns_internal(table_name, name, s)
|
284
303
|
end
|
285
304
|
|
286
305
|
# From postgresql_adapter.rb
|
@@ -418,7 +437,7 @@ module ::ArJdbc
|
|
418
437
|
return super unless column
|
419
438
|
|
420
439
|
if value.kind_of?(String) && column.type == :binary
|
421
|
-
"'#{escape_bytea(value)}'"
|
440
|
+
"E'#{escape_bytea(value)}'"
|
422
441
|
elsif value.kind_of?(String) && column.sql_type == 'xml'
|
423
442
|
"xml '#{quote_string(value)}'"
|
424
443
|
elsif value.kind_of?(Numeric) && column.sql_type == 'money'
|
@@ -557,9 +576,9 @@ module ::ArJdbc
|
|
557
576
|
def translate_exception(exception, message)
|
558
577
|
case exception.message
|
559
578
|
when /duplicate key value violates unique constraint/
|
560
|
-
RecordNotUnique.new(message, exception)
|
579
|
+
::ActiveRecord::RecordNotUnique.new(message, exception)
|
561
580
|
when /violates foreign key constraint/
|
562
|
-
InvalidForeignKey.new(message, exception)
|
581
|
+
::ActiveRecord::InvalidForeignKey.new(message, exception)
|
563
582
|
else
|
564
583
|
super
|
565
584
|
end
|
@@ -108,7 +108,7 @@ module ::ArJdbc
|
|
108
108
|
tp[:primary_key] = "integer primary key autoincrement not null"
|
109
109
|
tp[:string] = { :name => "varchar", :limit => 255 }
|
110
110
|
tp[:text] = { :name => "text" }
|
111
|
-
tp[:float] = { :name => "
|
111
|
+
tp[:float] = { :name => "float" }
|
112
112
|
tp[:decimal] = { :name => "decimal" }
|
113
113
|
tp[:datetime] = { :name => "datetime" }
|
114
114
|
tp[:timestamp] = { :name => "datetime" }
|
data/lib/arjdbc/version.rb
CHANGED
data/rakelib/package.rake
CHANGED
@@ -12,6 +12,7 @@ require File.dirname(__FILE__) + "/../lib/arjdbc/version"
|
|
12
12
|
begin
|
13
13
|
require 'hoe'
|
14
14
|
Hoe.plugin :gemcutter
|
15
|
+
Hoe.plugin :rubyforge
|
15
16
|
hoe = Hoe.spec("activerecord-jdbc-adapter") do |p|
|
16
17
|
p.version = ArJdbc::Version::VERSION
|
17
18
|
p.spec_extras[:files] = MANIFEST
|
@@ -0,0 +1,62 @@
|
|
1
|
+
/*
|
2
|
+
**** BEGIN LICENSE BLOCK *****
|
3
|
+
* Copyright (c) 2006-2010 Nick Sieger <nick@nicksieger.com>
|
4
|
+
* Copyright (c) 2006-2007 Ola Bini <ola.bini@gmail.com>
|
5
|
+
* Copyright (c) 2008-2009 Thomas E Enebo <enebo@acm.org>
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
* a copy of this software and associated documentation files (the
|
9
|
+
* "Software"), to deal in the Software without restriction, including
|
10
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
* the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be
|
16
|
+
* included in all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
***** END LICENSE BLOCK *****/
|
26
|
+
package arjdbc.db2;
|
27
|
+
|
28
|
+
import org.jruby.Ruby;
|
29
|
+
import org.jruby.RubyClass;
|
30
|
+
import org.jruby.runtime.ObjectAllocator;
|
31
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
32
|
+
|
33
|
+
import arjdbc.jdbc.RubyJdbcConnection;
|
34
|
+
|
35
|
+
/**
|
36
|
+
*
|
37
|
+
* @author mikestone
|
38
|
+
*/
|
39
|
+
public class DB2RubyJdbcConnection extends RubyJdbcConnection {
|
40
|
+
protected DB2RubyJdbcConnection(Ruby runtime, RubyClass metaClass) {
|
41
|
+
super(runtime, metaClass);
|
42
|
+
}
|
43
|
+
|
44
|
+
@Override
|
45
|
+
protected boolean databaseSupportsSchemas() {
|
46
|
+
return true;
|
47
|
+
}
|
48
|
+
|
49
|
+
public static RubyClass createDB2JdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
|
50
|
+
RubyClass clazz = RubyJdbcConnection.getConnectionAdapters(runtime).defineClassUnder("DB2JdbcConnection",
|
51
|
+
jdbcConnection, DB2_JDBCCONNECTION_ALLOCATOR);
|
52
|
+
clazz.defineAnnotatedMethods(DB2RubyJdbcConnection.class);
|
53
|
+
|
54
|
+
return clazz;
|
55
|
+
}
|
56
|
+
|
57
|
+
private static ObjectAllocator DB2_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
|
58
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
59
|
+
return new DB2RubyJdbcConnection(runtime, klass);
|
60
|
+
}
|
61
|
+
};
|
62
|
+
}
|
@@ -28,6 +28,7 @@ package arjdbc.jdbc;
|
|
28
28
|
|
29
29
|
import java.io.IOException;
|
30
30
|
|
31
|
+
import arjdbc.db2.DB2RubyJdbcConnection;
|
31
32
|
import arjdbc.derby.DerbyModule;
|
32
33
|
import arjdbc.h2.H2RubyJdbcConnection;
|
33
34
|
import arjdbc.informix.InformixRubyJdbcConnection;
|
@@ -57,6 +58,7 @@ public class AdapterJavaService implements BasicLibraryService {
|
|
57
58
|
Sqlite3RubyJdbcConnection.createSqlite3JdbcConnectionClass(runtime, jdbcConnection);
|
58
59
|
H2RubyJdbcConnection.createH2JdbcConnectionClass(runtime, jdbcConnection);
|
59
60
|
MySQLRubyJdbcConnection.createMySQLJdbcConnectionClass(runtime, jdbcConnection);
|
61
|
+
DB2RubyJdbcConnection.createDB2JdbcConnectionClass(runtime, jdbcConnection);
|
60
62
|
RubyModule arJdbc = runtime.getOrCreateModule("ArJdbc");
|
61
63
|
rubyApi = JavaEmbedUtils.newObjectAdapter();
|
62
64
|
MySQLModule.load(arJdbc);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
**** BEGIN LICENSE BLOCK *****
|
3
|
-
* Copyright (c) 2006-
|
3
|
+
* Copyright (c) 2006-2011 Nick Sieger <nick@nicksieger.com>
|
4
4
|
* Copyright (c) 2006-2007 Ola Bini <ola.bini@gmail.com>
|
5
5
|
* Copyright (c) 2008-2009 Thomas E Enebo <enebo@acm.org>
|
6
6
|
*
|
@@ -122,45 +122,20 @@ public class RubyJdbcConnection extends RubyObject {
|
|
122
122
|
public Object call(Connection c) throws SQLException {
|
123
123
|
ResultSet results = null, pkeys = null;
|
124
124
|
try {
|
125
|
-
String
|
126
|
-
String
|
127
|
-
|
128
|
-
final String[] name_parts = table_name.split( "\\." );
|
129
|
-
if ( name_parts.length > 3 ) {
|
130
|
-
throw new SQLException("Table name '" + table_name + "' should not contain more than 2 '.'");
|
131
|
-
}
|
132
|
-
|
133
|
-
DatabaseMetaData metadata = c.getMetaData();
|
134
|
-
String clzName = metadata.getClass().getName().toLowerCase();
|
135
|
-
boolean isDB2 = clzName.indexOf("db2") != -1 || clzName.indexOf("as400") != -1;
|
136
|
-
|
137
|
-
String catalog = c.getCatalog();
|
138
|
-
if( name_parts.length == 2 ) {
|
139
|
-
schemaName = name_parts[0];
|
140
|
-
table_name = name_parts[1];
|
141
|
-
}
|
142
|
-
else if ( name_parts.length == 3 ) {
|
143
|
-
catalog = name_parts[0];
|
144
|
-
schemaName = name_parts[1];
|
145
|
-
table_name = name_parts[2];
|
146
|
-
}
|
147
|
-
|
148
|
-
if(args.length > 2 && schemaName == null) schemaName = toStringOrNull(args[2]);
|
149
|
-
|
150
|
-
if (schemaName != null) schemaName = caseConvertIdentifierForJdbc(metadata, schemaName);
|
151
|
-
table_name = caseConvertIdentifierForJdbc(metadata, table_name);
|
152
|
-
|
153
|
-
if (schemaName != null && !isDB2 && !databaseSupportsSchemas()) { catalog = schemaName; }
|
125
|
+
String defaultSchema = args.length > 2 ? toStringOrNull(args[2]) : null;
|
126
|
+
String tableName = rubyApi.convertToRubyString(args[0]).getUnicodeValue();
|
127
|
+
TableNameComponents components = extractTableNameComponents(c, defaultSchema, tableName);
|
154
128
|
|
155
129
|
String[] tableTypes = new String[]{"TABLE","VIEW","SYNONYM"};
|
156
130
|
RubyArray matchingTables = (RubyArray) tableLookupBlock(context.getRuntime(),
|
157
|
-
catalog,
|
131
|
+
components.catalog, components.schema, components.table, tableTypes, false).call(c);
|
158
132
|
if (matchingTables.isEmpty()) {
|
159
|
-
throw new SQLException("Table " +
|
133
|
+
throw new SQLException("Table " + tableName + " does not exist");
|
160
134
|
}
|
161
135
|
|
162
|
-
|
163
|
-
|
136
|
+
DatabaseMetaData metadata = c.getMetaData();
|
137
|
+
results = metadata.getColumns(components.catalog, components.schema, components.table, null);
|
138
|
+
pkeys = metadata.getPrimaryKeys(components.catalog, components.schema, components.table);
|
164
139
|
return unmarshal_columns(context, metadata, results, pkeys);
|
165
140
|
} finally {
|
166
141
|
close(results);
|
@@ -387,7 +362,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
387
362
|
ResultSet resultSet = null;
|
388
363
|
List indexes = new ArrayList();
|
389
364
|
try {
|
390
|
-
resultSet = metadata.getIndexInfo(null, schemaName, tableName, false,
|
365
|
+
resultSet = metadata.getIndexInfo(null, schemaName, tableName, false, true);
|
391
366
|
List primaryKeys = primaryKeys(context, tableName);
|
392
367
|
String currentIndex = null;
|
393
368
|
RubyModule indexDefinitionClass = getConnectionAdapters(runtime).getClass("IndexDefinition");
|
@@ -486,7 +461,8 @@ public class RubyJdbcConnection extends RubyObject {
|
|
486
461
|
ResultSet resultSet = null;
|
487
462
|
List keyNames = new ArrayList();
|
488
463
|
try {
|
489
|
-
|
464
|
+
TableNameComponents components = extractTableNameComponents(c, null, tableName);
|
465
|
+
resultSet = metadata.getPrimaryKeys(components.catalog, components.schema, components.table);
|
490
466
|
|
491
467
|
while (resultSet.next()) {
|
492
468
|
keyNames.add(RubyString.newUnicodeString(runtime,
|
@@ -1272,6 +1248,41 @@ public class RubyJdbcConnection extends RubyObject {
|
|
1272
1248
|
return true;
|
1273
1249
|
}
|
1274
1250
|
|
1251
|
+
private TableNameComponents extractTableNameComponents(Connection connection, String defaultSchema, String tableName) throws SQLException {
|
1252
|
+
String schemaName = null;
|
1253
|
+
|
1254
|
+
final String[] name_parts = tableName.split("\\.");
|
1255
|
+
if (name_parts.length > 3) {
|
1256
|
+
throw new SQLException("Table name '" + tableName + "' should not contain more than 2 '.'");
|
1257
|
+
}
|
1258
|
+
|
1259
|
+
DatabaseMetaData metadata = connection.getMetaData();
|
1260
|
+
String clzName = metadata.getClass().getName().toLowerCase();
|
1261
|
+
boolean isPostgres = clzName.contains("postgresql");
|
1262
|
+
|
1263
|
+
String catalog = connection.getCatalog();
|
1264
|
+
if (name_parts.length == 2) {
|
1265
|
+
schemaName = name_parts[0];
|
1266
|
+
tableName = name_parts[1];
|
1267
|
+
} else if (name_parts.length == 3) {
|
1268
|
+
catalog = name_parts[0];
|
1269
|
+
schemaName = name_parts[1];
|
1270
|
+
tableName = name_parts[2];
|
1271
|
+
}
|
1272
|
+
|
1273
|
+
if (schemaName == null && defaultSchema != null) schemaName = defaultSchema;
|
1274
|
+
|
1275
|
+
// The postgres JDBC driver will default to searching every schema if no
|
1276
|
+
// schema search path is given. Default to the public schema instead.
|
1277
|
+
if (schemaName == null && isPostgres) schemaName = "public";
|
1278
|
+
if (schemaName != null) schemaName = caseConvertIdentifierForJdbc(metadata, schemaName);
|
1279
|
+
tableName = caseConvertIdentifierForJdbc(metadata, tableName);
|
1280
|
+
|
1281
|
+
if (schemaName != null && !databaseSupportsSchemas()) { catalog = schemaName; }
|
1282
|
+
|
1283
|
+
return new TableNameComponents(catalog, schemaName, tableName);
|
1284
|
+
}
|
1285
|
+
|
1275
1286
|
public static class ColumnData {
|
1276
1287
|
public IRubyObject name;
|
1277
1288
|
public int index;
|
@@ -1302,4 +1313,16 @@ public class RubyJdbcConnection extends RubyObject {
|
|
1302
1313
|
return columns;
|
1303
1314
|
}
|
1304
1315
|
}
|
1316
|
+
|
1317
|
+
private static class TableNameComponents {
|
1318
|
+
private String catalog;
|
1319
|
+
private String schema;
|
1320
|
+
private String table;
|
1321
|
+
|
1322
|
+
private TableNameComponents(String catalog, String schema, String table) {
|
1323
|
+
this.catalog = catalog;
|
1324
|
+
this.schema = schema;
|
1325
|
+
this.table = table;
|
1326
|
+
}
|
1327
|
+
}
|
1305
1328
|
}
|
data/test/models/auto_id.rb
CHANGED
data/test/models/data_types.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'active_record'
|
3
|
-
|
4
1
|
class DbTypeMigration < ActiveRecord::Migration
|
5
2
|
def self.up
|
6
3
|
create_table "db_types", :force => true do |t|
|
@@ -10,11 +7,16 @@ class DbTypeMigration < ActiveRecord::Migration
|
|
10
7
|
t.column :sample_time, :time
|
11
8
|
t.column :sample_decimal, :decimal, :precision => 15, :scale => 0
|
12
9
|
t.column :sample_small_decimal, :decimal, :precision => 3, :scale => 2
|
10
|
+
t.column :sample_default_decimal, :decimal
|
13
11
|
t.column :sample_float, :float
|
14
12
|
t.column :sample_binary, :binary
|
15
13
|
t.column :sample_boolean, :boolean
|
16
14
|
t.column :sample_string, :string, :default => ''
|
17
15
|
t.column :sample_integer, :integer, :limit => 5
|
16
|
+
t.column :sample_integer_with_limit_2, :integer, :limit => 2
|
17
|
+
t.column :sample_integer_with_limit_8, :integer, :limit => 8
|
18
|
+
t.column :sample_integer_no_limit, :integer
|
19
|
+
t.column :sample_integer_negative_default, :integer, :default => -1
|
18
20
|
t.column :sample_text, :text
|
19
21
|
end
|
20
22
|
end
|
data/test/models/entry.rb
CHANGED
data/test/models/mixed_case.rb
CHANGED
data/test/models/string_id.rb
CHANGED
data/test/mysql_info_test.rb
CHANGED
@@ -81,7 +81,7 @@ class MysqlInfoTest < Test::Unit::TestCase
|
|
81
81
|
dump = strio.string
|
82
82
|
dump.grep(/datetime/).each {|line| assert line !~ /limit/ }
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
def test_schema_dump_should_not_have_limits_on_date
|
86
86
|
strio = StringIO.new
|
87
87
|
ActiveRecord::SchemaDumper::dump(@connection, strio)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'jdbc_common'
|
2
|
+
require 'db/postgres'
|
3
|
+
|
4
|
+
class CreateISLSchema < ActiveRecord::Migration
|
5
|
+
def self.up
|
6
|
+
execute "CREATE TABLE domains (id int, name varchar(16))"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.down
|
10
|
+
execute "DROP TABLE domains"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Domain < ActiveRecord::Base
|
15
|
+
end
|
16
|
+
|
17
|
+
class PostgresInformationSchemaLeakTest < Test::Unit::TestCase
|
18
|
+
def setup
|
19
|
+
CreateISLSchema.up
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
CreateISLSchema.down
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_columns
|
27
|
+
assert_equal(%w{id name}, Domain.column_names)
|
28
|
+
end
|
29
|
+
end
|
@@ -16,7 +16,7 @@ class CreateSchema < ActiveRecord::Migration
|
|
16
16
|
end
|
17
17
|
|
18
18
|
class Person < ActiveRecord::Base
|
19
|
-
establish_connection POSTGRES_CONFIG.merge(:schema_search_path => 'test')
|
19
|
+
establish_connection POSTGRES_CONFIG.merge(:schema_search_path => 'test,public')
|
20
20
|
end
|
21
21
|
|
22
22
|
class PostgresSchemaSearchPathTest < Test::Unit::TestCase
|
@@ -41,4 +41,8 @@ class PostgresSchemaSearchPathTest < Test::Unit::TestCase
|
|
41
41
|
Person.find_by_wrongname("Alex")
|
42
42
|
end
|
43
43
|
end
|
44
|
+
def test_column_information
|
45
|
+
assert Person.columns.map{|col| col.name}.include?("name")
|
46
|
+
assert !Person.columns.map{|col| col.name}.include?("wrongname")
|
47
|
+
end
|
44
48
|
end
|
@@ -56,10 +56,35 @@ class PostgresSchemaDumperTest < Test::Unit::TestCase
|
|
56
56
|
lines.each {|line| assert line !~ /limit/ }
|
57
57
|
end
|
58
58
|
|
59
|
+
|
60
|
+
def test_schema_dump_should_not_have_limits_on_binaries
|
61
|
+
lines = @dump.grep(/binary/)
|
62
|
+
assert !lines.empty?, 'no binary type definitions found'
|
63
|
+
lines.each {|line| assert line !~ /limit/, 'binary definition contains limit' }
|
64
|
+
end
|
65
|
+
|
59
66
|
# http://kenai.com/jira/browse/ACTIVERECORD_JDBC-139
|
60
67
|
def test_schema_dump_should_not_have_limits_on_text_or_date
|
61
68
|
lines = @dump.grep(/date|text/)
|
62
69
|
assert !lines.empty?
|
63
70
|
lines.each {|line| assert line !~ /limit/ }
|
64
71
|
end
|
72
|
+
|
73
|
+
def test_schema_dump_integer_with_no_limit_should_have_no_limit
|
74
|
+
lines = @dump.grep(/sample_integer_no_limit/)
|
75
|
+
assert !lines.empty?
|
76
|
+
lines.each {|line| assert line !~ /:limit/ }
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_schema_dump_integer_with_limit_2_should_have_limit_2
|
80
|
+
lines = @dump.grep(/sample_integer_with_limit_2/)
|
81
|
+
assert !lines.empty?
|
82
|
+
lines.each {|line| assert line =~ /limit => 2/ }
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_schema_dump_integer_with_limit_8_should_have_limit_8
|
86
|
+
lines = @dump.grep(/sample_integer_with_limit_8/)
|
87
|
+
assert !lines.empty?
|
88
|
+
lines.each {|line| assert line =~ /limit => 8/ }
|
89
|
+
end
|
65
90
|
end
|
data/test/simple.rb
CHANGED
@@ -256,6 +256,17 @@ module SimpleTestMethods
|
|
256
256
|
assert_equal binary_string, e.sample_binary
|
257
257
|
end
|
258
258
|
|
259
|
+
def test_default_decimal_should_keep_fractional_part
|
260
|
+
expected = 7.3
|
261
|
+
actual = DbType.create(:sample_default_decimal => expected).sample_default_decimal
|
262
|
+
assert_equal expected, actual
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_negative_default_value
|
266
|
+
assert_equal -1, DbType.columns_hash['sample_integer_negative_default'].default
|
267
|
+
assert_equal -1, DbType.new.sample_integer_negative_default
|
268
|
+
end
|
269
|
+
|
259
270
|
def test_indexes
|
260
271
|
# Only test indexes if we have implemented it for the particular adapter
|
261
272
|
if @connection.respond_to?(:indexes)
|
@@ -461,14 +472,14 @@ module MultibyteTestMethods
|
|
461
472
|
def setup
|
462
473
|
super
|
463
474
|
config = ActiveRecord::Base.connection.config
|
464
|
-
jdbc_driver = ActiveRecord::ConnectionAdapters::JdbcDriver.new(config[:driver])
|
465
|
-
jdbc_driver.
|
466
|
-
@java_con = jdbc_driver.connection(config[:url], config[:username], config[:password])
|
475
|
+
@jdbc_driver = ActiveRecord::ConnectionAdapters::JdbcDriver.new(config[:driver])
|
476
|
+
@java_con = @jdbc_driver.connection(config[:url], config[:username], config[:password])
|
467
477
|
@java_con.setAutoCommit(true)
|
468
478
|
end
|
469
479
|
|
470
480
|
def teardown
|
471
481
|
@java_con.close
|
482
|
+
@jdbc_driver = nil
|
472
483
|
super
|
473
484
|
end
|
474
485
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: activerecord-jdbc-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.1.
|
5
|
+
version: 1.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Nick Sieger, Ola Bini and JRuby contributors
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-20 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 2.
|
35
|
+
version: 2.9.4
|
36
36
|
type: :development
|
37
37
|
version_requirements: *id002
|
38
38
|
description: |-
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/arel/visitors/compat.rb
|
81
81
|
- lib/arel/visitors/db2.rb
|
82
82
|
- lib/arel/visitors/derby.rb
|
83
|
+
- lib/arel/visitors/firebird.rb
|
83
84
|
- lib/arel/visitors/hsqldb.rb
|
84
85
|
- lib/arel/visitors/sql_server.rb
|
85
86
|
- lib/arjdbc/db2.rb
|
@@ -174,6 +175,7 @@ files:
|
|
174
175
|
- test/pick_rails_version.rb
|
175
176
|
- test/postgres_db_create_test.rb
|
176
177
|
- test/postgres_drop_db_test.rb
|
178
|
+
- test/postgres_information_schema_leak_test.rb
|
177
179
|
- test/postgres_mixed_case_test.rb
|
178
180
|
- test/postgres_nonseq_pkey_test.rb
|
179
181
|
- test/postgres_reserved_test.rb
|
@@ -207,6 +209,7 @@ files:
|
|
207
209
|
- test/models/string_id.rb
|
208
210
|
- test/models/validates_uniqueness_of_string.rb
|
209
211
|
- lib/arjdbc/jdbc/jdbc.rake
|
212
|
+
- src/java/arjdbc/db2/DB2RubyJdbcConnection.java
|
210
213
|
- src/java/arjdbc/derby/DerbyModule.java
|
211
214
|
- src/java/arjdbc/h2/H2RubyJdbcConnection.java
|
212
215
|
- src/java/arjdbc/informix/InformixRubyJdbcConnection.java
|
@@ -228,6 +231,7 @@ files:
|
|
228
231
|
- rails_generators/jdbc_generator.rb
|
229
232
|
- rails_generators/templates/config/initializers/jdbc.rb
|
230
233
|
- rails_generators/templates/lib/tasks/jdbc.rake
|
234
|
+
- .gemtest
|
231
235
|
has_rdoc: true
|
232
236
|
homepage: http://jruby-extras.rubyforge.org/activerecord-jdbc-adapter
|
233
237
|
licenses: []
|
@@ -256,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
260
|
requirements: []
|
257
261
|
|
258
262
|
rubyforge_project: jruby-extras
|
259
|
-
rubygems_version: 1.
|
263
|
+
rubygems_version: 1.5.1
|
260
264
|
signing_key:
|
261
265
|
specification_version: 3
|
262
266
|
summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
|