kb-activerecord-jdbc-adapter 0.9.7.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. data/History.txt +296 -0
  2. data/LICENSE.txt +21 -0
  3. data/Manifest.txt +139 -0
  4. data/README.txt +219 -0
  5. data/Rakefile +10 -0
  6. data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -0
  7. data/lib/active_record/connection_adapters/derby_adapter.rb +13 -0
  8. data/lib/active_record/connection_adapters/h2_adapter.rb +13 -0
  9. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +13 -0
  10. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  11. data/lib/active_record/connection_adapters/jdbc_adapter.rb +661 -0
  12. data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +26 -0
  13. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  14. data/lib/active_record/connection_adapters/mssql_adapter.rb +13 -0
  15. data/lib/active_record/connection_adapters/mysql_adapter.rb +13 -0
  16. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/postgresql_adapter.rb +13 -0
  18. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +13 -0
  19. data/lib/activerecord-jdbc-adapter.rb +6 -0
  20. data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
  21. data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
  22. data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
  23. data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +6 -0
  24. data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
  25. data/lib/generators/jdbc/jdbc_generator.rb +9 -0
  26. data/lib/jdbc_adapter.rb +27 -0
  27. data/lib/jdbc_adapter/jdbc.rake +122 -0
  28. data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
  29. data/lib/jdbc_adapter/jdbc_cachedb.rb +33 -0
  30. data/lib/jdbc_adapter/jdbc_db2.rb +222 -0
  31. data/lib/jdbc_adapter/jdbc_derby.rb +426 -0
  32. data/lib/jdbc_adapter/jdbc_firebird.rb +109 -0
  33. data/lib/jdbc_adapter/jdbc_hsqldb.rb +221 -0
  34. data/lib/jdbc_adapter/jdbc_informix.rb +147 -0
  35. data/lib/jdbc_adapter/jdbc_mimer.rb +145 -0
  36. data/lib/jdbc_adapter/jdbc_mssql.rb +468 -0
  37. data/lib/jdbc_adapter/jdbc_mysql.rb +260 -0
  38. data/lib/jdbc_adapter/jdbc_oracle.rb +397 -0
  39. data/lib/jdbc_adapter/jdbc_postgre.rb +531 -0
  40. data/lib/jdbc_adapter/jdbc_sqlite3.rb +386 -0
  41. data/lib/jdbc_adapter/jdbc_sybase.rb +50 -0
  42. data/lib/jdbc_adapter/missing_functionality_helper.rb +87 -0
  43. data/lib/jdbc_adapter/railtie.rb +9 -0
  44. data/lib/jdbc_adapter/rake_tasks.rb +10 -0
  45. data/lib/jdbc_adapter/tsql_helper.rb +69 -0
  46. data/lib/jdbc_adapter/version.rb +5 -0
  47. data/lib/pg.rb +4 -0
  48. data/rails_generators/jdbc_generator.rb +15 -0
  49. data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
  50. data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
  51. data/rakelib/compile.rake +23 -0
  52. data/rakelib/package.rake +91 -0
  53. data/rakelib/rails.rake +41 -0
  54. data/rakelib/test.rake +78 -0
  55. data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +53 -0
  56. data/src/java/jdbc_adapter/JdbcConnectionFactory.java +36 -0
  57. data/src/java/jdbc_adapter/JdbcDerbySpec.java +293 -0
  58. data/src/java/jdbc_adapter/JdbcMySQLSpec.java +134 -0
  59. data/src/java/jdbc_adapter/MssqlRubyJdbcConnection.java +71 -0
  60. data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +55 -0
  61. data/src/java/jdbc_adapter/RubyJdbcConnection.java +1176 -0
  62. data/src/java/jdbc_adapter/SQLBlock.java +27 -0
  63. data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +41 -0
  64. data/test/abstract_db_create.rb +107 -0
  65. data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
  66. data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
  67. data/test/cachedb_simple_test.rb +6 -0
  68. data/test/db/cachedb.rb +9 -0
  69. data/test/db/db2.rb +9 -0
  70. data/test/db/derby.rb +14 -0
  71. data/test/db/h2.rb +11 -0
  72. data/test/db/hsqldb.rb +12 -0
  73. data/test/db/informix.rb +11 -0
  74. data/test/db/jdbc.rb +11 -0
  75. data/test/db/jndi_config.rb +30 -0
  76. data/test/db/logger.rb +3 -0
  77. data/test/db/mssql.rb +9 -0
  78. data/test/db/mysql.rb +10 -0
  79. data/test/db/oracle.rb +34 -0
  80. data/test/db/postgres.rb +9 -0
  81. data/test/db/sqlite3.rb +15 -0
  82. data/test/db2_simple_test.rb +10 -0
  83. data/test/derby_migration_test.rb +21 -0
  84. data/test/derby_multibyte_test.rb +12 -0
  85. data/test/derby_simple_test.rb +21 -0
  86. data/test/generic_jdbc_connection_test.rb +9 -0
  87. data/test/h2_simple_test.rb +6 -0
  88. data/test/has_many_through.rb +79 -0
  89. data/test/helper.rb +5 -0
  90. data/test/hsqldb_simple_test.rb +6 -0
  91. data/test/informix_simple_test.rb +48 -0
  92. data/test/jdbc_adapter/jdbc_db2_test.rb +26 -0
  93. data/test/jdbc_adapter/jdbc_sybase_test.rb +33 -0
  94. data/test/jdbc_common.rb +25 -0
  95. data/test/jndi_callbacks_test.rb +38 -0
  96. data/test/jndi_test.rb +35 -0
  97. data/test/manualTestDatabase.rb +191 -0
  98. data/test/minirunit.rb +109 -0
  99. data/test/minirunit/testConnect.rb +14 -0
  100. data/test/minirunit/testH2.rb +73 -0
  101. data/test/minirunit/testHsqldb.rb +73 -0
  102. data/test/minirunit/testLoadActiveRecord.rb +3 -0
  103. data/test/minirunit/testMysql.rb +83 -0
  104. data/test/minirunit/testRawSelect.rb +24 -0
  105. data/test/models/add_not_null_column_to_table.rb +12 -0
  106. data/test/models/auto_id.rb +18 -0
  107. data/test/models/data_types.rb +28 -0
  108. data/test/models/entry.rb +23 -0
  109. data/test/models/mixed_case.rb +20 -0
  110. data/test/models/reserved_word.rb +18 -0
  111. data/test/models/string_id.rb +18 -0
  112. data/test/models/validates_uniqueness_of_string.rb +19 -0
  113. data/test/mssql_db_create_test.rb +26 -0
  114. data/test/mssql_identity_insert_test.rb +19 -0
  115. data/test/mssql_legacy_types_test.rb +58 -0
  116. data/test/mssql_limit_offset_test.rb +108 -0
  117. data/test/mssql_multibyte_test.rb +18 -0
  118. data/test/mssql_simple_test.rb +49 -0
  119. data/test/mysql_db_create_test.rb +25 -0
  120. data/test/mysql_info_test.rb +62 -0
  121. data/test/mysql_multibyte_test.rb +10 -0
  122. data/test/mysql_nonstandard_primary_key_test.rb +42 -0
  123. data/test/mysql_simple_test.rb +32 -0
  124. data/test/oracle_simple_test.rb +54 -0
  125. data/test/pick_rails_version.rb +3 -0
  126. data/test/postgres_db_create_test.rb +21 -0
  127. data/test/postgres_mixed_case_test.rb +19 -0
  128. data/test/postgres_nonseq_pkey_test.rb +40 -0
  129. data/test/postgres_reserved_test.rb +22 -0
  130. data/test/postgres_schema_search_path_test.rb +46 -0
  131. data/test/postgres_simple_test.rb +13 -0
  132. data/test/simple.rb +494 -0
  133. data/test/sqlite3_simple_test.rb +233 -0
  134. data/test/sybase_jtds_simple_test.rb +6 -0
  135. metadata +230 -0
@@ -0,0 +1,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/jtds"
4
+ rescue LoadError
5
+ unless tried_gem
6
+ require 'rubygems'
7
+ gem "jdbc-mssql"
8
+ tried_gem = true
9
+ retry
10
+ end
11
+ # trust that the jtds 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/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'
@@ -0,0 +1,6 @@
1
+ require 'jdbc_adapter'
2
+ begin
3
+ require 'jdbc_adapter/railtie'
4
+ rescue LoadError
5
+ # Assume we don't have railties in this version of AR
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'arel/engines/sql/compilers/ibm_db_compiler'
2
+
3
+ module Arel
4
+ module SqlCompiler
5
+ class DB2Compiler < IBM_DBCompiler
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,6 @@
1
+ module Arel
2
+ module SqlCompiler
3
+ class DerbyCompiler < GenericCompiler
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Arel
2
+ module SqlCompiler
3
+ class H2Compiler < GenericCompiler
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Arel
2
+ module SqlCompiler
3
+ class HsqldbCompiler < GenericCompiler
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Arel
2
+ module SqlCompiler
3
+ class JDBCCompiler < GenericCompiler
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ class JdbcGenerator < Rails::Generators::Base
2
+ def self.source_root
3
+ @source_root ||= File.expand_path('../../../../rails_generators/templates', __FILE__)
4
+ end
5
+
6
+ def create_jdbc_files
7
+ directory '.', '.'
8
+ end
9
+ end
@@ -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,122 @@
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 => e
67
+ raise e unless config['adapter'] =~ /mysql|postgresql|sqlite/
68
+ previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
69
+ end
70
+ end
71
+ end
72
+
73
+ def drop_database(config)
74
+ previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
75
+ end
76
+
77
+ namespace :structure do
78
+ redefine_task :dump => :environment do
79
+ abcs = ActiveRecord::Base.configurations
80
+ ActiveRecord::Base.establish_connection(abcs[rails_env])
81
+ File.open("db/#{rails_env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
82
+ if ActiveRecord::Base.connection.supports_migrations?
83
+ File.open("db/#{rails_env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
84
+ end
85
+ end
86
+ end
87
+
88
+ namespace :test do
89
+ redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
90
+ abcs = ActiveRecord::Base.configurations
91
+ abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
92
+ ActiveRecord::Base.establish_connection(abcs["test"])
93
+ ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
94
+ IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
95
+ begin
96
+ ActiveRecord::Base.connection.execute(ddl.chomp(';'))
97
+ rescue Exception => ex
98
+ puts ex.message
99
+ end
100
+ end
101
+ end
102
+
103
+ redefine_task :purge => :environment do
104
+ abcs = ActiveRecord::Base.configurations
105
+ config = abcs['test'].dup
106
+ if config['adapter'] =~ /postgresql/i
107
+ if config['url']
108
+ db = config['url'][/\/([^\/]*)$/, 1]
109
+ config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
110
+ else
111
+ db = config['database']
112
+ config['database'] = 'postgres'
113
+ end
114
+ ActiveRecord::Base.establish_connection(config)
115
+ else
116
+ ActiveRecord::Base.establish_connection(config)
117
+ db = ActiveRecord::Base.connection.database_name
118
+ end
119
+ ActiveRecord::Base.connection.recreate_database(db)
120
+ end
121
+ end
122
+ end
@@ -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,222 @@
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
+ def self.extended(obj)
20
+ # Ignore these 4 system tables
21
+ ActiveRecord::SchemaDumper.ignore_tables |= %w{hmon_atm_info hmon_collection policy stmg_dbsize_info}
22
+ end
23
+
24
+ module Column
25
+ def type_cast(value)
26
+ return nil if value.nil? || value =~ /^\s*null\s*$/i
27
+ case type
28
+ when :string then value
29
+ when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
30
+ when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
31
+ when :float then value.to_f
32
+ when :datetime then cast_to_date_or_time(value)
33
+ when :timestamp then cast_to_time(value)
34
+ when :time then cast_to_time(value)
35
+ else value
36
+ end
37
+ end
38
+ def cast_to_date_or_time(value)
39
+ return value if value.is_a? Date
40
+ return nil if value.blank?
41
+ guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
42
+ end
43
+
44
+ def cast_to_time(value)
45
+ return value if value.is_a? Time
46
+ time_array = ParseDate.parsedate value
47
+ time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
48
+ Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
49
+ end
50
+
51
+ def guess_date_or_time(value)
52
+ (value.hour == 0 and value.min == 0 and value.sec == 0) ?
53
+ Date.new(value.year, value.month, value.day) : value
54
+ end
55
+ end
56
+
57
+ def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
58
+ id = super
59
+ unless id
60
+ table_name = sql.split(/\s/)[2]
61
+ result = select(ActiveRecord::Base.send(:sanitize_sql,
62
+ %[select IDENTITY_VAL_LOCAL() as last_insert_id from #{table_name}],
63
+ nil))
64
+ id = result.last['last_insert_id']
65
+ end
66
+ id
67
+ end
68
+
69
+ def modify_types(tp)
70
+ tp[:primary_key] = 'int not null generated by default as identity (start with 1) primary key'
71
+ tp[:string][:limit] = 255
72
+ tp[:integer][:limit] = nil
73
+ tp[:boolean][:limit] = nil
74
+ tp
75
+ end
76
+
77
+ def adapter_name
78
+ 'DB2'
79
+ end
80
+
81
+ def add_limit_offset!(sql, options)
82
+ if limit = options[:limit]
83
+ offset = options[:offset] || 0
84
+ sql.gsub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
85
+ sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
86
+ end
87
+ end
88
+
89
+ def pk_and_sequence_for(table)
90
+ # In JDBC/DB2 side, only upcase names of table and column are handled.
91
+ keys = super(table.upcase)
92
+ if keys[0]
93
+ # In ActiveRecord side, only downcase names of table and column are handled.
94
+ keys[0] = keys[0].downcase
95
+ end
96
+ keys
97
+ end
98
+
99
+ def quote_column_name(column_name)
100
+ column_name
101
+ end
102
+
103
+ def quote(value, column = nil) # :nodoc:
104
+ if column && column.type == :primary_key
105
+ return value.to_s
106
+ end
107
+ if column && (column.type == :decimal || column.type == :integer) && value
108
+ return value.to_s
109
+ end
110
+ case value
111
+ when String
112
+ if column && column.type == :binary
113
+ "BLOB('#{quote_string(value)}')"
114
+ else
115
+ "'#{quote_string(value)}'"
116
+ end
117
+ else super
118
+ end
119
+ end
120
+
121
+ def quote_string(string)
122
+ string.gsub(/'/, "''") # ' (for ruby-mode)
123
+ end
124
+
125
+ def quoted_true
126
+ '1'
127
+ end
128
+
129
+ def quoted_false
130
+ '0'
131
+ end
132
+
133
+ def recreate_database(name)
134
+ do_not_drop = ["stmg_dbsize_info","hmon_atm_info","hmon_collection","policy"]
135
+ tables.each do |table|
136
+ unless do_not_drop.include?(table)
137
+ drop_table(table)
138
+ end
139
+ end
140
+ end
141
+
142
+ def remove_index(table_name, options = { })
143
+ execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
144
+ end
145
+
146
+ # This method makes tests pass without understanding why.
147
+ # Don't use this in production.
148
+ def columns(table_name, name = nil)
149
+ super.select do |col|
150
+ # strip out "magic" columns from DB2 (?)
151
+ !/rolename|roleid|create_time|auditpolicyname|auditpolicyid|remarks/.match(col.name)
152
+ end
153
+ end
154
+
155
+ def add_quotes(name)
156
+ return name unless name
157
+ %Q{"#{name}"}
158
+ end
159
+
160
+ def strip_quotes(str)
161
+ return str unless str
162
+ return str unless /^(["']).*\1$/ =~ str
163
+ str[1..-2]
164
+ end
165
+
166
+ def expand_double_quotes(name)
167
+ return name unless name && name['"']
168
+ name.gsub(/"/,'""')
169
+ end
170
+
171
+
172
+ def structure_dump #:nodoc:
173
+ definition=""
174
+ rs = @connection.connection.meta_data.getTables(nil,nil,nil,["TABLE"].to_java(:string))
175
+ while rs.next
176
+ tname = rs.getString(3)
177
+ definition << "CREATE TABLE #{tname} (\n"
178
+ rs2 = @connection.connection.meta_data.getColumns(nil,nil,tname,nil)
179
+ first_col = true
180
+ while rs2.next
181
+ col_name = add_quotes(rs2.getString(4));
182
+ default = ""
183
+ d1 = rs2.getString(13)
184
+ default = d1 ? " DEFAULT #{d1}" : ""
185
+
186
+ type = rs2.getString(6)
187
+ col_size = rs2.getString(7)
188
+ nulling = (rs2.getString(18) == 'NO' ? " NOT NULL" : "")
189
+ create_col_string = add_quotes(expand_double_quotes(strip_quotes(col_name))) +
190
+ " " +
191
+ type +
192
+ "" +
193
+ nulling +
194
+ default
195
+ if !first_col
196
+ create_col_string = ",\n #{create_col_string}"
197
+ else
198
+ create_col_string = " #{create_col_string}"
199
+ end
200
+
201
+ definition << create_col_string
202
+
203
+ first_col = false
204
+ end
205
+ definition << ");\n\n"
206
+ end
207
+ definition
208
+ end
209
+
210
+ def dump_schema_information
211
+ begin
212
+ if (current_schema = ActiveRecord::Migrator.current_version) > 0
213
+ #TODO: Find a way to get the DB2 instace name to properly form the statement
214
+ return "INSERT INTO DB2INST2.SCHEMA_INFO (version) VALUES (#{current_schema})"
215
+ end
216
+ rescue ActiveRecord::StatementInvalid
217
+ # No Schema Info
218
+ end
219
+ end
220
+
221
+ end
222
+ end