activerecord-jdbc-adapter 0.8 → 0.8.1
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/History.txt +21 -0
- data/Manifest.txt +12 -0
- data/README.txt +1 -0
- data/Rakefile +19 -13
- data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +22 -5
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +3 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +13 -0
- data/lib/jdbc_adapter/jdbc.rake +32 -29
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_cachedb.rb +33 -0
- data/lib/jdbc_adapter/jdbc_db2.rb +96 -7
- data/lib/jdbc_adapter/jdbc_derby.rb +35 -28
- data/lib/jdbc_adapter/jdbc_mssql.rb +62 -103
- data/lib/jdbc_adapter/jdbc_mysql.rb +34 -25
- data/lib/jdbc_adapter/jdbc_oracle.rb +7 -7
- data/lib/jdbc_adapter/jdbc_postgre.rb +1 -1
- data/lib/jdbc_adapter/jdbc_sqlite3.rb +188 -0
- data/lib/jdbc_adapter/jdbc_sybase.rb +39 -0
- data/lib/jdbc_adapter/tsql_helper.rb +59 -0
- data/lib/jdbc_adapter/version.rb +1 -1
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +66 -40
- data/src/java/jdbc_adapter/JdbcMySQLSpec.java +2 -2
- data/test/cachedb_simple_test.rb +6 -0
- data/test/db/cachedb.rb +9 -0
- data/test/db/mssql.rb +9 -0
- data/test/db/oracle.rb +22 -2
- data/test/db/sqlite3.rb +11 -0
- data/test/db2_simple_test.rb +4 -0
- data/test/jdbc_common.rb +3 -1
- data/test/manualTestDatabase.rb +1 -5
- data/test/models/entry.rb +1 -1
- data/test/mssql_simple_test.rb +6 -0
- data/test/mysql_simple_test.rb +9 -0
- data/test/oracle_simple_test.rb +23 -0
- data/test/simple.rb +3 -2
- data/test/sqlite3_simple_test.rb +6 -0
- metadata +14 -2
data/History.txt
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
== 0.8.1
|
2
|
+
|
3
|
+
- Now sporting a JDBC sqlite3 adapter! Thanks Joseph Athman.
|
4
|
+
- Added support for InterSystems Cache database (Ryan Bell)
|
5
|
+
- Fix for JRUBY-2256
|
6
|
+
- JRUBY-1638, JRUBY-2404, JRUBY-2463: schema.table handling and Oracle NUMBER fixes (Darcy Schultz & Jesse Hu)
|
7
|
+
- Add structure dump and other DDL-ish for DB2 (courtesy abedra and stuarthalloway)
|
8
|
+
- Fix missing quote_table_name function under Rails 1.2.6 and earlier
|
9
|
+
- Small tweaks to jdbc.rake to select proper config
|
10
|
+
- JRUBY-2011: Fix MSSQL string un-quoting issue (Silvio Fonseca)
|
11
|
+
- JRUBY-1977, 17427: Fix information_schema select issue with MSSQL (Matt Burke)
|
12
|
+
- 20479: Improve get_table_name for MSSQL (Aslak Hellesøy)
|
13
|
+
- 20243: numerics improvements for MSSQL (Aslak Hellesøy)
|
14
|
+
- 20172: don't quote table names for MSSQL (Thor Marius Henrichsen)
|
15
|
+
- 19729: check for primary key existence in postgres during insert (Martin Luder)
|
16
|
+
- JRUBY-2297, 18846: retrying failing SQL statements is harmful when not autocommitting (Craig McMillan)
|
17
|
+
- 10021: very preliminary sybase support. (Mark Atkinson) Not usable until collision w/ sqlserver driver is resolved.
|
18
|
+
- JRUBY-2312, JRUBY-2319, JRUBY-2322: Oracle timestamping issues (Jesse Hu & Michael König)
|
19
|
+
- JRUBY-2422: Fix MySQL referential integrity and rollback issues
|
20
|
+
- JRUBY-2382: mysql string quoting fails with ArrayIndexOutofBoundsException
|
21
|
+
|
1
22
|
== 0.8
|
2
23
|
|
3
24
|
- NOTE: This release is only compatible with JRuby 1.1RC3 or later.
|
data/Manifest.txt
CHANGED
@@ -3,6 +3,7 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
LICENSE.txt
|
6
|
+
lib/active_record/connection_adapters/cachedb_adapter.rb
|
6
7
|
lib/active_record/connection_adapters/derby_adapter.rb
|
7
8
|
lib/active_record/connection_adapters/h2_adapter.rb
|
8
9
|
lib/active_record/connection_adapters/hsqldb_adapter.rb
|
@@ -12,6 +13,8 @@ lib/active_record/connection_adapters/jndi_adapter.rb
|
|
12
13
|
lib/active_record/connection_adapters/mysql_adapter.rb
|
13
14
|
lib/active_record/connection_adapters/oracle_adapter.rb
|
14
15
|
lib/active_record/connection_adapters/postgresql_adapter.rb
|
16
|
+
lib/active_record/connection_adapters/sqlite3_adapter.rb
|
17
|
+
lib/jdbc_adapter/jdbc_cachedb.rb
|
15
18
|
lib/jdbc_adapter/jdbc_db2.rb
|
16
19
|
lib/jdbc_adapter/jdbc_derby.rb
|
17
20
|
lib/jdbc_adapter/jdbc_firebird.rb
|
@@ -21,13 +24,18 @@ lib/jdbc_adapter/jdbc_mssql.rb
|
|
21
24
|
lib/jdbc_adapter/jdbc_mysql.rb
|
22
25
|
lib/jdbc_adapter/jdbc_oracle.rb
|
23
26
|
lib/jdbc_adapter/jdbc_postgre.rb
|
27
|
+
lib/jdbc_adapter/jdbc_sqlite3.rb
|
28
|
+
lib/jdbc_adapter/jdbc_sybase.rb
|
24
29
|
lib/jdbc_adapter/missing_functionality_helper.rb
|
25
30
|
lib/jdbc_adapter/rake_tasks.rb
|
31
|
+
lib/jdbc_adapter/tsql_helper.rb
|
26
32
|
lib/jdbc_adapter/version.rb
|
27
33
|
lib/jdbc_adapter.rb
|
28
34
|
lib/jdbc_adapter/jdbc_adapter_internal.jar
|
29
35
|
test/activerecord/connection_adapters/type_conversion_test.rb
|
30
36
|
test/activerecord/connections/native_jdbc_mysql/connection.rb
|
37
|
+
test/cachedb_simple_test.rb
|
38
|
+
test/db/cachedb.rb
|
31
39
|
test/db/db2.rb
|
32
40
|
test/db/derby.rb
|
33
41
|
test/db/h2.rb
|
@@ -35,9 +43,11 @@ test/db/hsqldb.rb
|
|
35
43
|
test/db/jdbc.rb
|
36
44
|
test/db/jndi_config.rb
|
37
45
|
test/db/logger.rb
|
46
|
+
test/db/mssql.rb
|
38
47
|
test/db/mysql.rb
|
39
48
|
test/db/oracle.rb
|
40
49
|
test/db/postgres.rb
|
50
|
+
test/db/sqlite3.rb
|
41
51
|
test/db2_simple_test.rb
|
42
52
|
test/derby_multibyte_test.rb
|
43
53
|
test/derby_simple_test.rb
|
@@ -61,12 +71,14 @@ test/models/auto_id.rb
|
|
61
71
|
test/models/data_types.rb
|
62
72
|
test/models/entry.rb
|
63
73
|
test/models/reserved_word.rb
|
74
|
+
test/mssql_simple_test.rb
|
64
75
|
test/mysql_multibyte_test.rb
|
65
76
|
test/mysql_simple_test.rb
|
66
77
|
test/oracle_simple_test.rb
|
67
78
|
test/postgres_reserved_test.rb
|
68
79
|
test/postgres_simple_test.rb
|
69
80
|
test/simple.rb
|
81
|
+
test/sqlite3_simple_test.rb
|
70
82
|
lib/jdbc_adapter/jdbc.rake
|
71
83
|
src/java/jdbc_adapter/JdbcAdapterInternalService.java
|
72
84
|
src/java/jdbc_adapter/JdbcConnectionFactory.java
|
data/README.txt
CHANGED
@@ -26,6 +26,7 @@ What's there, and what is not there:
|
|
26
26
|
* rename_column
|
27
27
|
* HSQLDB - Complete
|
28
28
|
* H2 - Complete
|
29
|
+
* SQLite3 - work in progress
|
29
30
|
|
30
31
|
Other databases will require testing and likely a custom configuration module. Please join the jruby-extras mailing-list[http://rubyforge.org/mail/?group_id=2014] to help us discover support for more databases.
|
31
32
|
|
data/Rakefile
CHANGED
@@ -5,14 +5,16 @@ task :default => [:java_compile, :test]
|
|
5
5
|
|
6
6
|
def java_classpath_arg # myriad of ways to discover JRuby classpath
|
7
7
|
begin
|
8
|
-
|
8
|
+
cpath = Java::java.lang.System.getProperty('java.class.path').split(File::PATH_SEPARATOR)
|
9
|
+
cpath += Java::java.lang.System.getProperty('sun.boot.class.path').split(File::PATH_SEPARATOR)
|
10
|
+
jruby_cpath = cpath.compact.join(File::PATH_SEPARATOR)
|
9
11
|
rescue => e
|
10
12
|
end
|
11
13
|
unless jruby_cpath
|
12
14
|
jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
|
13
15
|
FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
|
14
16
|
end
|
15
|
-
jruby_cpath ? "-cp #{jruby_cpath}" : ""
|
17
|
+
jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
|
16
18
|
end
|
17
19
|
|
18
20
|
desc "Compile the native Java code."
|
@@ -25,23 +27,13 @@ task :java_compile do
|
|
25
27
|
end
|
26
28
|
file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile
|
27
29
|
|
28
|
-
task :more_clean do
|
29
|
-
rm_rf FileList['derby*']
|
30
|
-
rm_rf FileList['test.db.*']
|
31
|
-
rm_rf "test/reports"
|
32
|
-
rm_f FileList['lib/**/*.jar']
|
33
|
-
rm_f "manifest.mf"
|
34
|
-
end
|
35
|
-
|
36
|
-
task :clean => :more_clean
|
37
|
-
|
38
30
|
task :filelist do
|
39
31
|
puts FileList['pkg/**/*'].inspect
|
40
32
|
end
|
41
33
|
|
42
34
|
if RUBY_PLATFORM =~ /java/
|
43
35
|
# TODO: add more databases into the standard tests here.
|
44
|
-
task :test => [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2]
|
36
|
+
task :test => [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2, :test_sqlite3]
|
45
37
|
else
|
46
38
|
task :test => [:test_mysql]
|
47
39
|
end
|
@@ -85,6 +77,17 @@ Rake::TestTask.new(:test_db2) do |t|
|
|
85
77
|
t.libs << 'test'
|
86
78
|
end
|
87
79
|
|
80
|
+
# Ensure InterSystems CacheDB driver is on your classpath before launching rake
|
81
|
+
Rake::TestTask.new(:test_cachedb) do | t |
|
82
|
+
t.test_files = FileList[ 'test/cachedb_simple_test.rb' ]
|
83
|
+
t.libs << 'test'
|
84
|
+
end
|
85
|
+
|
86
|
+
# Ensure that the jTDS driver in on your classpath before launching rake
|
87
|
+
Rake::TestTask.new(:test_mssql) do | t |
|
88
|
+
t.test_files = FileList[ 'test/mssql_simple_test.rb' ]
|
89
|
+
t.libs << 'test'
|
90
|
+
end
|
88
91
|
|
89
92
|
MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt",
|
90
93
|
"Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
|
@@ -159,3 +162,6 @@ end
|
|
159
162
|
task "all:release" => "#{prefix}:release"
|
160
163
|
end
|
161
164
|
end
|
165
|
+
|
166
|
+
require 'rake/clean'
|
167
|
+
CLEAN.include 'derby*', 'test.db.*','test/reports', 'test.sqlite3','lib/**/*.jar','manifest.mf'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
@@ -135,6 +135,7 @@ module ActiveRecord
|
|
135
135
|
lambda {|r| r['type_name'] =~ /^decimal$/i},
|
136
136
|
lambda {|r| r['type_name'] =~ /^numeric$/i},
|
137
137
|
lambda {|r| r['type_name'] =~ /^number$/i},
|
138
|
+
lambda {|r| r['type_name'] =~ /^real$/i},
|
138
139
|
lambda {|r| r['precision'] == '38'},
|
139
140
|
lambda {|r| r['data_type'] == '2'}],
|
140
141
|
:float => [ lambda {|r| [Jdbc::Types::FLOAT,Jdbc::Types::DOUBLE, Jdbc::Types::REAL].include?(r['data_type'].to_i)},
|
@@ -146,17 +147,21 @@ module ActiveRecord
|
|
146
147
|
:datetime => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
|
147
148
|
lambda {|r| r['type_name'] =~ /^datetime$/i},
|
148
149
|
lambda {|r| r['type_name'] =~ /^timestamp$/i},
|
149
|
-
lambda {|r| r['type_name'] =~ /^date/i}
|
150
|
+
lambda {|r| r['type_name'] =~ /^date/i},
|
151
|
+
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
150
152
|
:timestamp => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
|
151
153
|
lambda {|r| r['type_name'] =~ /^timestamp$/i},
|
152
154
|
lambda {|r| r['type_name'] =~ /^datetime/i},
|
153
|
-
lambda {|r| r['type_name'] =~ /^date/i}
|
155
|
+
lambda {|r| r['type_name'] =~ /^date/i},
|
156
|
+
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
154
157
|
:time => [ lambda {|r| Jdbc::Types::TIME == r['data_type'].to_i},
|
155
158
|
lambda {|r| r['type_name'] =~ /^time$/i},
|
156
|
-
lambda {|r| r['type_name'] =~ /^date/i}
|
159
|
+
lambda {|r| r['type_name'] =~ /^date/i},
|
160
|
+
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
|
157
161
|
:date => [ lambda {|r| Jdbc::Types::DATE == r['data_type'].to_i},
|
158
162
|
lambda {|r| r['type_name'] =~ /^date$/i},
|
159
|
-
lambda {|r| r['type_name'] =~ /^date/i}
|
163
|
+
lambda {|r| r['type_name'] =~ /^date/i},
|
164
|
+
lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver3
|
160
165
|
:binary => [ lambda {|r| [Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB].include?(r['data_type'].to_i)},
|
161
166
|
lambda {|r| r['type_name'] =~ /^blob/i},
|
162
167
|
lambda {|r| r['type_name'] =~ /sub_type 0$/i}, # For FireBird
|
@@ -166,7 +171,8 @@ module ActiveRecord
|
|
166
171
|
lambda {|r| r['type_name'] =~ /^bool/i},
|
167
172
|
lambda {|r| r['data_type'] == '-7'},
|
168
173
|
lambda {|r| r['type_name'] =~ /^tinyint$/i},
|
169
|
-
lambda {|r| r['type_name'] =~ /^decimal$/i}
|
174
|
+
lambda {|r| r['type_name'] =~ /^decimal$/i},
|
175
|
+
lambda {|r| r['type_name'] =~ /^integer$/i}]
|
170
176
|
}
|
171
177
|
|
172
178
|
def initialize(types)
|
@@ -414,8 +420,19 @@ module ActiveRecord
|
|
414
420
|
end
|
415
421
|
end
|
416
422
|
|
423
|
+
module CompatibilityMethods
|
424
|
+
def self.needed?(base)
|
425
|
+
!base.instance_methods.include?("quote_table_name")
|
426
|
+
end
|
427
|
+
|
428
|
+
def quote_table_name(name)
|
429
|
+
quote_column_name(name)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
417
433
|
class JdbcAdapter < AbstractAdapter
|
418
434
|
extend ShadowCoreMethods
|
435
|
+
include CompatibilityMethods if CompatibilityMethods.needed?(self)
|
419
436
|
|
420
437
|
attr_reader :config
|
421
438
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
tried_gem = false
|
2
|
+
begin
|
3
|
+
require "jdbc/sqlite3"
|
4
|
+
rescue LoadError
|
5
|
+
unless tried_gem
|
6
|
+
require 'rubygems'
|
7
|
+
gem "jdbc-sqlite3"
|
8
|
+
tried_gem = true
|
9
|
+
retry
|
10
|
+
end
|
11
|
+
# trust that the sqlite jar is already present
|
12
|
+
end
|
13
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
data/lib/jdbc_adapter/jdbc.rake
CHANGED
@@ -10,44 +10,46 @@ def redefine_task(*args, &block)
|
|
10
10
|
end
|
11
11
|
|
12
12
|
namespace :db do
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
if Rake::Task["db:create"]
|
14
|
+
redefine_task :create => :environment do
|
15
|
+
create_database(ActiveRecord::Base.configurations[RAILS_ENV])
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
begin
|
20
|
-
ActiveRecord::Base.establish_connection(config)
|
21
|
-
ActiveRecord::Base.connection
|
22
|
-
rescue
|
18
|
+
class << self; alias_method :previous_create_database, :create_database; end
|
19
|
+
def create_database(config)
|
23
20
|
begin
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
ActiveRecord::Base.establish_connection(config)
|
22
|
+
ActiveRecord::Base.connection
|
23
|
+
rescue
|
24
|
+
begin
|
25
|
+
url = config['url']
|
26
|
+
if url
|
27
|
+
if url =~ /^(.*\/)/
|
28
|
+
url = $1
|
29
|
+
end
|
28
30
|
end
|
31
|
+
|
32
|
+
ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
|
33
|
+
ActiveRecord::Base.connection.create_database(config['database'])
|
34
|
+
ActiveRecord::Base.establish_connection(config)
|
35
|
+
rescue
|
36
|
+
previous_create_database(config)
|
29
37
|
end
|
38
|
+
end
|
39
|
+
end
|
30
40
|
|
31
|
-
|
32
|
-
|
41
|
+
redefine_task :drop => :environment do
|
42
|
+
config = ActiveRecord::Base.configurations[RAILS_ENV]
|
43
|
+
begin
|
33
44
|
ActiveRecord::Base.establish_connection(config)
|
45
|
+
db = ActiveRecord::Base.connection.database_name
|
46
|
+
ActiveRecord::Base.connection.drop_database(db)
|
34
47
|
rescue
|
35
|
-
|
48
|
+
drop_database(config)
|
36
49
|
end
|
37
50
|
end
|
38
51
|
end
|
39
52
|
|
40
|
-
redefine_task :drop => :environment do
|
41
|
-
config = ActiveRecord::Base.configurations[RAILS_ENV]
|
42
|
-
begin
|
43
|
-
ActiveRecord::Base.establish_connection(config)
|
44
|
-
db = ActiveRecord::Base.connection.database_name
|
45
|
-
ActiveRecord::Base.connection.drop_database(db)
|
46
|
-
rescue
|
47
|
-
drop_database(config)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
53
|
namespace :structure do
|
52
54
|
redefine_task :dump => :environment do
|
53
55
|
abcs = ActiveRecord::Base.configurations
|
@@ -58,10 +60,11 @@ namespace :db do
|
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
63
|
+
|
61
64
|
namespace :test do
|
62
65
|
redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
63
66
|
abcs = ActiveRecord::Base.configurations
|
64
|
-
ActiveRecord::Base.establish_connection(:test)
|
67
|
+
ActiveRecord::Base.establish_connection(abcs[:test])
|
65
68
|
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
|
66
69
|
IO.readlines("db/#{RAILS_ENV}_structure.sql").join.split(";\n\n").each do |ddl|
|
67
70
|
ActiveRecord::Base.connection.execute(ddl)
|
@@ -70,7 +73,7 @@ namespace :db do
|
|
70
73
|
|
71
74
|
redefine_task :purge => :environment do
|
72
75
|
abcs = ActiveRecord::Base.configurations
|
73
|
-
ActiveRecord::Base.establish_connection(:test)
|
76
|
+
ActiveRecord::Base.establish_connection(abcs[:test])
|
74
77
|
db = ActiveRecord::Base.connection.database_name
|
75
78
|
ActiveRecord::Base.connection.recreate_database(db)
|
76
79
|
end
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'jdbc_adapter/tsql_helper'
|
2
|
+
|
3
|
+
module ::JdbcSpec
|
4
|
+
module ActiveRecordExtensions
|
5
|
+
def cachedb_connection( config )
|
6
|
+
config[:port] ||= 1972
|
7
|
+
config[:url] ||= "jdbc:Cache://#{config[:host]}:#{config[:port]}/#{ config[:database]}"
|
8
|
+
config[:driver] ||= "com.intersys.jdbc.CacheDriver"
|
9
|
+
jdbc_connection( config )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module CacheDB
|
14
|
+
include TSqlMethods
|
15
|
+
|
16
|
+
def self.column_selector
|
17
|
+
[ /cache/i, lambda { | cfg, col | col.extend( ::JdbcSpec::CacheDB::Column ) } ]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.adapter_selector
|
21
|
+
[ /cache/i, lambda { | cfg, adapt | adapt.extend( ::JdbcSpec::CacheDB ) } ]
|
22
|
+
end
|
23
|
+
|
24
|
+
module Column
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_table(name, options = { })
|
28
|
+
super(name, options)
|
29
|
+
primary_key = options[:primary_key] || "id"
|
30
|
+
execute "ALTER TABLE #{name} ADD CONSTRAINT #{name}_PK PRIMARY KEY(#{primary_key})" unless options[:id] == false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -17,14 +17,14 @@ module JdbcSpec
|
|
17
17
|
adapt.extend(::JdbcSpec::DB2)
|
18
18
|
end }]
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
module Column
|
22
22
|
def type_cast(value)
|
23
23
|
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
24
24
|
case type
|
25
25
|
when :string then value
|
26
26
|
when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
27
|
-
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
27
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
28
28
|
when :float then value.to_f
|
29
29
|
when :datetime then cast_to_date_or_time(value)
|
30
30
|
when :timestamp then cast_to_time(value)
|
@@ -50,7 +50,7 @@ module JdbcSpec
|
|
50
50
|
Date.new(value.year, value.month, value.day) : value
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def modify_types(tp)
|
55
55
|
tp[:primary_key] = 'int generated by default as identity (start with 42) primary key'
|
56
56
|
tp[:string][:limit] = 255
|
@@ -58,7 +58,7 @@ module JdbcSpec
|
|
58
58
|
tp[:boolean][:limit] = nil
|
59
59
|
tp
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def add_limit_offset!(sql, options)
|
63
63
|
if limit = options[:limit]
|
64
64
|
offset = options[:offset] || 0
|
@@ -66,7 +66,7 @@ module JdbcSpec
|
|
66
66
|
sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def quote_column_name(column_name)
|
71
71
|
column_name
|
72
72
|
end
|
@@ -79,7 +79,7 @@ module JdbcSpec
|
|
79
79
|
return value.to_s
|
80
80
|
end
|
81
81
|
case value
|
82
|
-
when String
|
82
|
+
when String
|
83
83
|
if column && column.type == :binary
|
84
84
|
"BLOB('#{quote_string(value)}')"
|
85
85
|
else
|
@@ -88,7 +88,7 @@ module JdbcSpec
|
|
88
88
|
else super
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
def quote_string(string)
|
93
93
|
string.gsub(/'/, "''") # ' (for ruby-mode)
|
94
94
|
end
|
@@ -100,5 +100,94 @@ module JdbcSpec
|
|
100
100
|
def quoted_false
|
101
101
|
'0'
|
102
102
|
end
|
103
|
+
|
104
|
+
def recreate_database(name)
|
105
|
+
do_not_drop = ["stmg_dbsize_info","hmon_atm_info","hmon_collection","policy"]
|
106
|
+
tables.each do |table|
|
107
|
+
unless do_not_drop.include?(table)
|
108
|
+
drop_table(table)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def remove_index(table_name, options = { })
|
114
|
+
execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
|
115
|
+
end
|
116
|
+
|
117
|
+
# This method makes tests pass without understanding why.
|
118
|
+
# Don't use this in production.
|
119
|
+
def columns(table_name, name = nil)
|
120
|
+
super.select do |col|
|
121
|
+
# strip out "magic" columns from DB2 (?)
|
122
|
+
!/rolename|roleid|create_time|auditpolicyname|auditpolicyid|remarks/.match(col.name)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_quotes(name)
|
127
|
+
return name unless name
|
128
|
+
%Q{"#{name}"}
|
129
|
+
end
|
130
|
+
|
131
|
+
def strip_quotes(str)
|
132
|
+
return str unless str
|
133
|
+
return str unless /^(["']).*\1$/ =~ str
|
134
|
+
str[1..-2]
|
135
|
+
end
|
136
|
+
|
137
|
+
def expand_double_quotes(name)
|
138
|
+
return name unless name && name['"']
|
139
|
+
name.gsub(/"/,'""')
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
def structure_dump #:nodoc:
|
144
|
+
definition=""
|
145
|
+
rs = @connection.connection.meta_data.getTables(nil,nil,nil,["TABLE"].to_java(:string))
|
146
|
+
while rs.next
|
147
|
+
tname = rs.getString(3)
|
148
|
+
definition << "CREATE TABLE #{tname} (\n"
|
149
|
+
rs2 = @connection.connection.meta_data.getColumns(nil,nil,tname,nil)
|
150
|
+
first_col = true
|
151
|
+
while rs2.next
|
152
|
+
col_name = add_quotes(rs2.getString(4));
|
153
|
+
default = ""
|
154
|
+
d1 = rs2.getString(13)
|
155
|
+
default = d1 ? " DEFAULT #{d1}" : ""
|
156
|
+
|
157
|
+
type = rs2.getString(6)
|
158
|
+
col_size = rs2.getString(7)
|
159
|
+
nulling = (rs2.getString(18) == 'NO' ? " NOT NULL" : "")
|
160
|
+
create_col_string = add_quotes(expand_double_quotes(strip_quotes(col_name))) +
|
161
|
+
" " +
|
162
|
+
type +
|
163
|
+
"" +
|
164
|
+
nulling +
|
165
|
+
default
|
166
|
+
if !first_col
|
167
|
+
create_col_string = ",\n #{create_col_string}"
|
168
|
+
else
|
169
|
+
create_col_string = " #{create_col_string}"
|
170
|
+
end
|
171
|
+
|
172
|
+
definition << create_col_string
|
173
|
+
|
174
|
+
first_col = false
|
175
|
+
end
|
176
|
+
definition << ");\n\n"
|
177
|
+
end
|
178
|
+
definition
|
179
|
+
end
|
180
|
+
|
181
|
+
def dump_schema_information
|
182
|
+
begin
|
183
|
+
if (current_schema = ActiveRecord::Migrator.current_version) > 0
|
184
|
+
#TODO: Find a way to get the DB2 instace name to properly form the statement
|
185
|
+
return "INSERT INTO DB2INST2.SCHEMA_INFO (version) VALUES (#{current_schema})"
|
186
|
+
end
|
187
|
+
rescue ActiveRecord::StatementInvalid
|
188
|
+
# No Schema Info
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
103
192
|
end
|
104
193
|
end
|