activerecord-jdbc-adapter 0.9.3-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.
- data/History.txt +248 -0
- data/LICENSE.txt +21 -0
- data/Manifest.txt +125 -0
- data/README.txt +218 -0
- data/Rakefile +10 -0
- data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/derby_adapter.rb +13 -0
- data/lib/active_record/connection_adapters/h2_adapter.rb +13 -0
- data/lib/active_record/connection_adapters/hsqldb_adapter.rb +13 -0
- data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +640 -0
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +26 -0
- data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +13 -0
- data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +13 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +13 -0
- data/lib/generators/jdbc/jdbc_generator.rb +9 -0
- data/lib/jdbc_adapter.rb +27 -0
- data/lib/jdbc_adapter/jdbc.rake +121 -0
- 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 +203 -0
- data/lib/jdbc_adapter/jdbc_derby.rb +430 -0
- data/lib/jdbc_adapter/jdbc_firebird.rb +109 -0
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +218 -0
- data/lib/jdbc_adapter/jdbc_informix.rb +147 -0
- data/lib/jdbc_adapter/jdbc_mimer.rb +141 -0
- data/lib/jdbc_adapter/jdbc_mssql.rb +337 -0
- data/lib/jdbc_adapter/jdbc_mysql.rb +236 -0
- data/lib/jdbc_adapter/jdbc_oracle.rb +377 -0
- data/lib/jdbc_adapter/jdbc_postgre.rb +498 -0
- data/lib/jdbc_adapter/jdbc_sqlite3.rb +384 -0
- data/lib/jdbc_adapter/jdbc_sybase.rb +50 -0
- data/lib/jdbc_adapter/missing_functionality_helper.rb +87 -0
- data/lib/jdbc_adapter/rake_tasks.rb +10 -0
- data/lib/jdbc_adapter/tsql_helper.rb +60 -0
- data/lib/jdbc_adapter/version.rb +5 -0
- data/lib/pg.rb +4 -0
- data/rails_generators/jdbc_generator.rb +15 -0
- data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
- data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
- data/rakelib/compile.rake +23 -0
- data/rakelib/package.rake +90 -0
- data/rakelib/rails.rake +41 -0
- data/rakelib/test.rake +76 -0
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +53 -0
- data/src/java/jdbc_adapter/JdbcConnectionFactory.java +36 -0
- data/src/java/jdbc_adapter/JdbcDerbySpec.java +293 -0
- data/src/java/jdbc_adapter/JdbcMySQLSpec.java +134 -0
- data/src/java/jdbc_adapter/MssqlRubyJdbcConnection.java +71 -0
- data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +55 -0
- data/src/java/jdbc_adapter/RubyJdbcConnection.java +1162 -0
- data/src/java/jdbc_adapter/SQLBlock.java +27 -0
- data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +41 -0
- data/test/abstract_db_create.rb +107 -0
- data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
- data/test/cachedb_simple_test.rb +6 -0
- data/test/db/cachedb.rb +9 -0
- data/test/db/db2.rb +9 -0
- data/test/db/derby.rb +14 -0
- data/test/db/h2.rb +11 -0
- data/test/db/hsqldb.rb +12 -0
- data/test/db/informix.rb +11 -0
- data/test/db/jdbc.rb +11 -0
- data/test/db/jndi_config.rb +30 -0
- data/test/db/logger.rb +3 -0
- data/test/db/mssql.rb +9 -0
- data/test/db/mysql.rb +10 -0
- data/test/db/oracle.rb +34 -0
- data/test/db/postgres.rb +9 -0
- data/test/db/sqlite3.rb +15 -0
- data/test/db2_simple_test.rb +10 -0
- data/test/derby_migration_test.rb +21 -0
- data/test/derby_multibyte_test.rb +12 -0
- data/test/derby_simple_test.rb +21 -0
- data/test/generic_jdbc_connection_test.rb +9 -0
- data/test/h2_simple_test.rb +6 -0
- data/test/has_many_through.rb +79 -0
- data/test/helper.rb +5 -0
- data/test/hsqldb_simple_test.rb +6 -0
- data/test/informix_simple_test.rb +48 -0
- data/test/jdbc_adapter/jdbc_db2_test.rb +26 -0
- data/test/jdbc_adapter/jdbc_sybase_test.rb +33 -0
- data/test/jdbc_common.rb +25 -0
- data/test/jndi_callbacks_test.rb +38 -0
- data/test/jndi_test.rb +35 -0
- data/test/manualTestDatabase.rb +191 -0
- data/test/minirunit.rb +109 -0
- data/test/minirunit/testConnect.rb +14 -0
- data/test/minirunit/testH2.rb +73 -0
- data/test/minirunit/testHsqldb.rb +73 -0
- data/test/minirunit/testLoadActiveRecord.rb +3 -0
- data/test/minirunit/testMysql.rb +83 -0
- data/test/minirunit/testRawSelect.rb +24 -0
- data/test/models/add_not_null_column_to_table.rb +12 -0
- data/test/models/auto_id.rb +18 -0
- data/test/models/data_types.rb +28 -0
- data/test/models/entry.rb +23 -0
- data/test/models/mixed_case.rb +20 -0
- data/test/models/reserved_word.rb +18 -0
- data/test/models/string_id.rb +18 -0
- data/test/models/validates_uniqueness_of_string.rb +19 -0
- data/test/mssql_simple_test.rb +6 -0
- data/test/mysql_db_create_test.rb +25 -0
- data/test/mysql_multibyte_test.rb +10 -0
- data/test/mysql_nonstandard_primary_key_test.rb +42 -0
- data/test/mysql_simple_test.rb +32 -0
- data/test/oracle_simple_test.rb +29 -0
- data/test/pick_rails_version.rb +3 -0
- data/test/postgres_db_create_test.rb +21 -0
- data/test/postgres_mixed_case_test.rb +19 -0
- data/test/postgres_nonseq_pkey_test.rb +40 -0
- data/test/postgres_reserved_test.rb +22 -0
- data/test/postgres_schema_search_path_test.rb +46 -0
- data/test/postgres_simple_test.rb +13 -0
- data/test/simple.rb +475 -0
- data/test/sqlite3_simple_test.rb +233 -0
- data/test/sybase_jtds_simple_test.rb +6 -0
- metadata +188 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module JdbcSpec
|
|
2
|
+
module ActiveRecordExtensions
|
|
3
|
+
def self.add_method_to_remove_from_ar_base(meth)
|
|
4
|
+
@methods ||= []
|
|
5
|
+
@methods << meth
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.extended(klass)
|
|
9
|
+
(@methods || []).each {|m| (class << klass; self; end).instance_eval { remove_method(m) rescue nil } }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require 'jdbc_adapter/jdbc_mimer'
|
|
15
|
+
require 'jdbc_adapter/jdbc_hsqldb'
|
|
16
|
+
require 'jdbc_adapter/jdbc_oracle'
|
|
17
|
+
require 'jdbc_adapter/jdbc_postgre'
|
|
18
|
+
require 'jdbc_adapter/jdbc_mysql'
|
|
19
|
+
require 'jdbc_adapter/jdbc_derby'
|
|
20
|
+
require 'jdbc_adapter/jdbc_firebird'
|
|
21
|
+
require 'jdbc_adapter/jdbc_db2'
|
|
22
|
+
require 'jdbc_adapter/jdbc_mssql'
|
|
23
|
+
require 'jdbc_adapter/jdbc_cachedb'
|
|
24
|
+
require 'jdbc_adapter/jdbc_sqlite3'
|
|
25
|
+
require 'jdbc_adapter/jdbc_sybase'
|
|
26
|
+
require 'jdbc_adapter/jdbc_informix'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
tried_gem = false
|
|
2
|
+
begin
|
|
3
|
+
require "jdbc/mysql"
|
|
4
|
+
rescue LoadError
|
|
5
|
+
unless tried_gem
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
gem "jdbc-mysql"
|
|
8
|
+
tried_gem = true
|
|
9
|
+
retry
|
|
10
|
+
end
|
|
11
|
+
# trust that the mysql jar is already present
|
|
12
|
+
end
|
|
13
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
tried_gem = false
|
|
2
|
+
begin
|
|
3
|
+
require "jdbc/postgres"
|
|
4
|
+
rescue LoadError
|
|
5
|
+
unless tried_gem
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
gem "jdbc-postgres"
|
|
8
|
+
tried_gem = true
|
|
9
|
+
retry
|
|
10
|
+
end
|
|
11
|
+
# trust that the postgres jar is already present
|
|
12
|
+
end
|
|
13
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
@@ -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.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
if defined?(JRUBY_VERSION)
|
|
2
|
+
begin
|
|
3
|
+
tried_gem ||= false
|
|
4
|
+
require 'active_record/version'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
raise if tried_gem
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
gem 'activerecord'
|
|
9
|
+
tried_gem = true
|
|
10
|
+
retry
|
|
11
|
+
end
|
|
12
|
+
if ActiveRecord::VERSION::MAJOR < 2
|
|
13
|
+
if defined?(RAILS_CONNECTION_ADAPTERS)
|
|
14
|
+
RAILS_CONNECTION_ADAPTERS << %q(jdbc)
|
|
15
|
+
else
|
|
16
|
+
RAILS_CONNECTION_ADAPTERS = %w(jdbc)
|
|
17
|
+
end
|
|
18
|
+
if ActiveRecord::VERSION::MAJOR == 1 && ActiveRecord::VERSION::MINOR == 14
|
|
19
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
20
|
+
end
|
|
21
|
+
else
|
|
22
|
+
require 'active_record'
|
|
23
|
+
require 'active_record/connection_adapters/jdbc_adapter'
|
|
24
|
+
end
|
|
25
|
+
else
|
|
26
|
+
warn "ActiveRecord-JDBC is for use with JRuby only"
|
|
27
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
def redefine_task(*args, &block)
|
|
2
|
+
task_name = Hash === args.first ? args.first.keys[0] : args.first
|
|
3
|
+
existing_task = Rake.application.lookup task_name
|
|
4
|
+
if existing_task
|
|
5
|
+
class << existing_task
|
|
6
|
+
public :instance_variable_set
|
|
7
|
+
attr_reader :actions
|
|
8
|
+
end
|
|
9
|
+
existing_task.instance_variable_set "@prerequisites", FileList[]
|
|
10
|
+
existing_task.actions.shift
|
|
11
|
+
enhancements = existing_task.actions
|
|
12
|
+
existing_task.instance_variable_set "@actions", []
|
|
13
|
+
end
|
|
14
|
+
redefined_task = task(*args, &block)
|
|
15
|
+
enhancements.each {|enhancement| redefined_task.actions << enhancement}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def rails_env
|
|
19
|
+
defined?(Rails.env) ? Rails.env : RAILS_ENV
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
namespace :db do
|
|
23
|
+
redefine_task :create => :environment do
|
|
24
|
+
create_database(ActiveRecord::Base.configurations[rails_env])
|
|
25
|
+
end
|
|
26
|
+
task :create => :load_config if Rake.application.lookup(:load_config)
|
|
27
|
+
|
|
28
|
+
redefine_task :drop => :environment do
|
|
29
|
+
config = ActiveRecord::Base.configurations[rails_env]
|
|
30
|
+
begin
|
|
31
|
+
ActiveRecord::Base.establish_connection(config)
|
|
32
|
+
db = ActiveRecord::Base.connection.database_name
|
|
33
|
+
ActiveRecord::Base.connection.drop_database(db)
|
|
34
|
+
rescue
|
|
35
|
+
drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
task :drop => :load_config if Rake.application.lookup(:load_config)
|
|
39
|
+
|
|
40
|
+
namespace :create do
|
|
41
|
+
task :all => :environment
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
namespace :drop do
|
|
45
|
+
task :all => :environment
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class << self
|
|
49
|
+
alias_method :previous_create_database, :create_database
|
|
50
|
+
alias_method :previous_drop_database, :drop_database
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def create_database(config)
|
|
54
|
+
begin
|
|
55
|
+
ActiveRecord::Base.establish_connection(config)
|
|
56
|
+
ActiveRecord::Base.connection
|
|
57
|
+
rescue
|
|
58
|
+
begin
|
|
59
|
+
if url = config['url'] && url =~ /^(.*(?<!\/)\/)(?=\w)/
|
|
60
|
+
url = $1
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
|
|
64
|
+
ActiveRecord::Base.connection.create_database(config['database'])
|
|
65
|
+
ActiveRecord::Base.establish_connection(config)
|
|
66
|
+
rescue
|
|
67
|
+
previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def drop_database(config)
|
|
73
|
+
previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
namespace :structure do
|
|
77
|
+
redefine_task :dump => :environment do
|
|
78
|
+
abcs = ActiveRecord::Base.configurations
|
|
79
|
+
ActiveRecord::Base.establish_connection(abcs[rails_env])
|
|
80
|
+
File.open("db/#{rails_env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
|
|
81
|
+
if ActiveRecord::Base.connection.supports_migrations?
|
|
82
|
+
File.open("db/#{rails_env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
namespace :test do
|
|
88
|
+
redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
|
89
|
+
abcs = ActiveRecord::Base.configurations
|
|
90
|
+
abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
|
|
91
|
+
ActiveRecord::Base.establish_connection(abcs["test"])
|
|
92
|
+
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
|
|
93
|
+
IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
|
|
94
|
+
begin
|
|
95
|
+
ActiveRecord::Base.connection.execute(ddl.chomp(';'))
|
|
96
|
+
rescue Exception => ex
|
|
97
|
+
puts ex.message
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
redefine_task :purge => :environment do
|
|
103
|
+
abcs = ActiveRecord::Base.configurations
|
|
104
|
+
config = abcs['test'].dup
|
|
105
|
+
if config['adapter'] =~ /postgresql/i
|
|
106
|
+
if config['url']
|
|
107
|
+
db = config['url'][/\/([^\/]*)$/, 1]
|
|
108
|
+
config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
|
|
109
|
+
else
|
|
110
|
+
db = config['database']
|
|
111
|
+
config['database'] = 'postgres'
|
|
112
|
+
end
|
|
113
|
+
ActiveRecord::Base.establish_connection(config)
|
|
114
|
+
else
|
|
115
|
+
ActiveRecord::Base.establish_connection(config)
|
|
116
|
+
db = ActiveRecord::Base.connection.database_name
|
|
117
|
+
end
|
|
118
|
+
ActiveRecord::Base.connection.recreate_database(db)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
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.adapter_matcher(name, *)
|
|
17
|
+
name =~ /cache/i ? self : false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.column_selector
|
|
21
|
+
[ /cache/i, lambda { | cfg, col | col.extend( ::JdbcSpec::CacheDB::Column ) } ]
|
|
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
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
module JdbcSpec
|
|
2
|
+
module DB2
|
|
3
|
+
def self.adapter_matcher(name, config)
|
|
4
|
+
if name =~ /db2/i
|
|
5
|
+
return config[:url] =~ /^jdbc:derby:net:/ ? ::JdbcSpec::Derby : self
|
|
6
|
+
end
|
|
7
|
+
false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.adapter_selector
|
|
11
|
+
[/db2/i, lambda {|cfg,adapt|
|
|
12
|
+
if cfg[:url] =~ /^jdbc:derby:net:/
|
|
13
|
+
adapt.extend(::JdbcSpec::Derby)
|
|
14
|
+
else
|
|
15
|
+
adapt.extend(::JdbcSpec::DB2)
|
|
16
|
+
end }]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module Column
|
|
20
|
+
def type_cast(value)
|
|
21
|
+
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
|
22
|
+
case type
|
|
23
|
+
when :string then value
|
|
24
|
+
when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
|
25
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
|
26
|
+
when :float then value.to_f
|
|
27
|
+
when :datetime then cast_to_date_or_time(value)
|
|
28
|
+
when :timestamp then cast_to_time(value)
|
|
29
|
+
when :time then cast_to_time(value)
|
|
30
|
+
else value
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
def cast_to_date_or_time(value)
|
|
34
|
+
return value if value.is_a? Date
|
|
35
|
+
return nil if value.blank?
|
|
36
|
+
guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def cast_to_time(value)
|
|
40
|
+
return value if value.is_a? Time
|
|
41
|
+
time_array = ParseDate.parsedate value
|
|
42
|
+
time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
|
|
43
|
+
Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def guess_date_or_time(value)
|
|
47
|
+
(value.hour == 0 and value.min == 0 and value.sec == 0) ?
|
|
48
|
+
Date.new(value.year, value.month, value.day) : value
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
|
|
53
|
+
id = super
|
|
54
|
+
unless id
|
|
55
|
+
table_name = sql.split(/\s/)[2]
|
|
56
|
+
result = select(ActiveRecord::Base.send(:sanitize_sql,
|
|
57
|
+
%[select IDENTITY_VAL_LOCAL() as last_insert_id from #{table_name}],
|
|
58
|
+
nil))
|
|
59
|
+
id = result.last['last_insert_id']
|
|
60
|
+
end
|
|
61
|
+
id
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def modify_types(tp)
|
|
65
|
+
tp[:primary_key] = 'int not null generated by default as identity (start with 1) primary key'
|
|
66
|
+
tp[:string][:limit] = 255
|
|
67
|
+
tp[:integer][:limit] = nil
|
|
68
|
+
tp[:boolean][:limit] = nil
|
|
69
|
+
tp
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def add_limit_offset!(sql, options)
|
|
73
|
+
if limit = options[:limit]
|
|
74
|
+
offset = options[:offset] || 0
|
|
75
|
+
sql.gsub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
|
|
76
|
+
sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def quote_column_name(column_name)
|
|
81
|
+
column_name
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def quote(value, column = nil) # :nodoc:
|
|
85
|
+
if column && column.type == :primary_key
|
|
86
|
+
return value.to_s
|
|
87
|
+
end
|
|
88
|
+
if column && (column.type == :decimal || column.type == :integer) && value
|
|
89
|
+
return value.to_s
|
|
90
|
+
end
|
|
91
|
+
case value
|
|
92
|
+
when String
|
|
93
|
+
if column && column.type == :binary
|
|
94
|
+
"BLOB('#{quote_string(value)}')"
|
|
95
|
+
else
|
|
96
|
+
"'#{quote_string(value)}'"
|
|
97
|
+
end
|
|
98
|
+
else super
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def quote_string(string)
|
|
103
|
+
string.gsub(/'/, "''") # ' (for ruby-mode)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def quoted_true
|
|
107
|
+
'1'
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def quoted_false
|
|
111
|
+
'0'
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def recreate_database(name)
|
|
115
|
+
do_not_drop = ["stmg_dbsize_info","hmon_atm_info","hmon_collection","policy"]
|
|
116
|
+
tables.each do |table|
|
|
117
|
+
unless do_not_drop.include?(table)
|
|
118
|
+
drop_table(table)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def remove_index(table_name, options = { })
|
|
124
|
+
execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# This method makes tests pass without understanding why.
|
|
128
|
+
# Don't use this in production.
|
|
129
|
+
def columns(table_name, name = nil)
|
|
130
|
+
super.select do |col|
|
|
131
|
+
# strip out "magic" columns from DB2 (?)
|
|
132
|
+
!/rolename|roleid|create_time|auditpolicyname|auditpolicyid|remarks/.match(col.name)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def add_quotes(name)
|
|
137
|
+
return name unless name
|
|
138
|
+
%Q{"#{name}"}
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def strip_quotes(str)
|
|
142
|
+
return str unless str
|
|
143
|
+
return str unless /^(["']).*\1$/ =~ str
|
|
144
|
+
str[1..-2]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def expand_double_quotes(name)
|
|
148
|
+
return name unless name && name['"']
|
|
149
|
+
name.gsub(/"/,'""')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def structure_dump #:nodoc:
|
|
154
|
+
definition=""
|
|
155
|
+
rs = @connection.connection.meta_data.getTables(nil,nil,nil,["TABLE"].to_java(:string))
|
|
156
|
+
while rs.next
|
|
157
|
+
tname = rs.getString(3)
|
|
158
|
+
definition << "CREATE TABLE #{tname} (\n"
|
|
159
|
+
rs2 = @connection.connection.meta_data.getColumns(nil,nil,tname,nil)
|
|
160
|
+
first_col = true
|
|
161
|
+
while rs2.next
|
|
162
|
+
col_name = add_quotes(rs2.getString(4));
|
|
163
|
+
default = ""
|
|
164
|
+
d1 = rs2.getString(13)
|
|
165
|
+
default = d1 ? " DEFAULT #{d1}" : ""
|
|
166
|
+
|
|
167
|
+
type = rs2.getString(6)
|
|
168
|
+
col_size = rs2.getString(7)
|
|
169
|
+
nulling = (rs2.getString(18) == 'NO' ? " NOT NULL" : "")
|
|
170
|
+
create_col_string = add_quotes(expand_double_quotes(strip_quotes(col_name))) +
|
|
171
|
+
" " +
|
|
172
|
+
type +
|
|
173
|
+
"" +
|
|
174
|
+
nulling +
|
|
175
|
+
default
|
|
176
|
+
if !first_col
|
|
177
|
+
create_col_string = ",\n #{create_col_string}"
|
|
178
|
+
else
|
|
179
|
+
create_col_string = " #{create_col_string}"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
definition << create_col_string
|
|
183
|
+
|
|
184
|
+
first_col = false
|
|
185
|
+
end
|
|
186
|
+
definition << ");\n\n"
|
|
187
|
+
end
|
|
188
|
+
definition
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def dump_schema_information
|
|
192
|
+
begin
|
|
193
|
+
if (current_schema = ActiveRecord::Migrator.current_version) > 0
|
|
194
|
+
#TODO: Find a way to get the DB2 instace name to properly form the statement
|
|
195
|
+
return "INSERT INTO DB2INST2.SCHEMA_INFO (version) VALUES (#{current_schema})"
|
|
196
|
+
end
|
|
197
|
+
rescue ActiveRecord::StatementInvalid
|
|
198
|
+
# No Schema Info
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
end
|