ibm_db 1.1.0 → 1.1.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/CHANGES +6 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +39 -7
- data/test/cases/associations/eager_test.rb +12 -0
- data/test/cases/base_test.rb +2 -2
- data/test/cases/calculations_test.rb +8 -14
- data/test/cases/finder_test.rb +7 -1
- data/test/cases/fixtures_test.rb +5 -0
- data/test/cases/migration_test.rb +1 -0
- data/test/cases/schema_dumper_test.rb +19 -7
- data/test/cases/validations_test.rb +2 -0
- data/test/connections/native_ibm_db/connection.rb +2 -0
- data/test/schema/i5/ibm_db_specific_schema.rb +1 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +1 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +1 -0
- data/test/schema/schema.rb +15 -0
- data/test/schema/zOS/ibm_db_specific_schema.rb +1 -0
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
Change Log
|
2
2
|
==============
|
3
|
+
2009/07/28 (IBM_DB adapter 1.1.1, driver 1.1.0) :
|
4
|
+
- Fixed bug [26705] --> Fixed the problem of primary key value starting with 100
|
5
|
+
- Support for Activerecord-2.3.3
|
6
|
+
- Added method primary_key, which returns the primary key column name of the specified table
|
7
|
+
- Test suite updated
|
8
|
+
|
3
9
|
2009/06/17 (IBM_DB adapter 1.1.0, driver 1.1.0) :
|
4
10
|
- Support for Activerecord's Query Cache Mechanism
|
5
11
|
- rename_column support for DB2 on LUW version 9.7, DB2 on zOS 9 and enhanced rename_column support for Informix Dynamic Server
|
@@ -466,6 +466,13 @@ module ActiveRecord
|
|
466
466
|
|
467
467
|
# Executes the +set schema+ statement using the schema identifier provided
|
468
468
|
@servertype.set_schema(@schema) if @schema && @schema != @username
|
469
|
+
|
470
|
+
# Check for the start value for id (primary key column). By default it is 1
|
471
|
+
if config.has_key?(:start_id)
|
472
|
+
@start_id = config[:start_id]
|
473
|
+
else
|
474
|
+
@start_id = 1
|
475
|
+
end
|
469
476
|
end
|
470
477
|
|
471
478
|
# Optional connection attribute: database name space qualifier
|
@@ -973,7 +980,7 @@ module ActiveRecord
|
|
973
980
|
# database types
|
974
981
|
def native_database_types
|
975
982
|
{
|
976
|
-
:primary_key => { :name => @servertype.
|
983
|
+
:primary_key => { :name => @servertype.primary_key_definition(@start_id)},
|
977
984
|
:string => { :name => "varchar", :limit => 255 },
|
978
985
|
:text => { :name => "clob" },
|
979
986
|
:integer => { :name => "integer" },
|
@@ -1064,6 +1071,31 @@ module ActiveRecord
|
|
1064
1071
|
return tables
|
1065
1072
|
end
|
1066
1073
|
|
1074
|
+
# Returns the primary key of the mentioned table
|
1075
|
+
def primary_key(table_name)
|
1076
|
+
pk_name = nil
|
1077
|
+
if stmt = IBM_DB.primary_keys( @connection, nil,
|
1078
|
+
@servertype.set_case(@schema),
|
1079
|
+
@servertype.set_case(table_name))
|
1080
|
+
begin
|
1081
|
+
if ( pk_index_row = IBM_DB.fetch_array(stmt) )
|
1082
|
+
pk_name = pk_index_row[3].downcase
|
1083
|
+
end
|
1084
|
+
rescue StandardError # Handle driver fetch errors
|
1085
|
+
error_msg = IBM_DB.conn_errormsg
|
1086
|
+
error_msg = IBM_DB.stmt_errormsg if error_msg.empty?
|
1087
|
+
if error_msg && !error_msg.empty?
|
1088
|
+
raise "Failed to retrieve primarykey metadata during fetch: #{error_msg}"
|
1089
|
+
else
|
1090
|
+
raise "An unexpected error occurred during retrieval of primary metadata"
|
1091
|
+
end
|
1092
|
+
ensure # Free resources associated with the statement
|
1093
|
+
IBM_DB.free_result(stmt) if stmt
|
1094
|
+
end
|
1095
|
+
end
|
1096
|
+
return pk_name
|
1097
|
+
end
|
1098
|
+
|
1067
1099
|
# Returns an array of non-primary key indexes for a specified table name
|
1068
1100
|
def indexes(table_name, name = nil)
|
1069
1101
|
# to_s required because +table_name+ may be a symbol.
|
@@ -1176,8 +1208,8 @@ module ActiveRecord
|
|
1176
1208
|
i = 0
|
1177
1209
|
indexes.each do |index|
|
1178
1210
|
if pk_index && index.columns == pk_index.columns
|
1179
|
-
|
1180
|
-
|
1211
|
+
indexes.delete_at(i)
|
1212
|
+
end
|
1181
1213
|
i = i+1
|
1182
1214
|
end
|
1183
1215
|
# Returns the indexes array
|
@@ -1503,8 +1535,8 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1503
1535
|
raise NotImplementedError, "rename_column is not implemented yet in the IBM_DB Adapter"
|
1504
1536
|
end
|
1505
1537
|
|
1506
|
-
def
|
1507
|
-
return "INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH
|
1538
|
+
def primary_key_definition(start_id)
|
1539
|
+
return "INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH #{start_id}) PRIMARY KEY"
|
1508
1540
|
end
|
1509
1541
|
|
1510
1542
|
# Returns the last automatically generated ID.
|
@@ -2040,8 +2072,8 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2040
2072
|
end #End of begin
|
2041
2073
|
end # End of rename_column
|
2042
2074
|
|
2043
|
-
def
|
2044
|
-
return "SERIAL(
|
2075
|
+
def primary_key_definition(start_id)
|
2076
|
+
return "SERIAL(#{start_id}) PRIMARY KEY"
|
2045
2077
|
end
|
2046
2078
|
|
2047
2079
|
def change_column(table_name, column_name, type, options)
|
@@ -223,6 +223,18 @@ class EagerAssociationTest < ActiveRecord::TestCase
|
|
223
223
|
end
|
224
224
|
end
|
225
225
|
|
226
|
+
def test_eager_association_loading_with_belongs_to_and_conditions_hash
|
227
|
+
comments = []
|
228
|
+
assert_nothing_raised do
|
229
|
+
comments = Comment.find(:all, :include => :post, :conditions => {:posts => {:id => 4}}, :limit => 3, :order => 'comments.id')
|
230
|
+
end
|
231
|
+
assert_equal 3, comments.length
|
232
|
+
assert_equal [5,6,7], comments.collect { |c| c.id }
|
233
|
+
assert_no_queries do
|
234
|
+
comments.first.post
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
226
238
|
def test_eager_association_loading_with_belongs_to_and_conditions_string_with_quoted_table_name
|
227
239
|
quoted_posts_id= Comment.connection.quote_table_name('posts') + '.' + Comment.connection.quote_column_name('id')
|
228
240
|
assert_nothing_raised do
|
data/test/cases/base_test.rb
CHANGED
@@ -1763,7 +1763,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1763
1763
|
end
|
1764
1764
|
|
1765
1765
|
def test_scoped_find_with_group_and_having
|
1766
|
-
developers = Developer.with_scope(:find => { :group => 'salary', :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary" }) do
|
1766
|
+
developers = Developer.with_scope(:find => { :group => 'developers.salary', :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary" }) do
|
1767
1767
|
Developer.find(:all)
|
1768
1768
|
end
|
1769
1769
|
assert_equal 3, developers.size
|
@@ -2021,7 +2021,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
2021
2021
|
|
2022
2022
|
def test_inspect_instance
|
2023
2023
|
topic = topics(:first)
|
2024
|
-
assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, type: nil>), topic.inspect
|
2024
|
+
assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, parent_title: nil, type: nil>), topic.inspect
|
2025
2025
|
end
|
2026
2026
|
|
2027
2027
|
def test_inspect_new_instance
|
@@ -2,6 +2,9 @@ require "cases/helper"
|
|
2
2
|
require 'models/company'
|
3
3
|
require 'models/topic'
|
4
4
|
require 'models/edge'
|
5
|
+
require 'models/owner'
|
6
|
+
require 'models/pet'
|
7
|
+
require 'models/toy'
|
5
8
|
|
6
9
|
Company.has_many :accounts
|
7
10
|
|
@@ -10,7 +13,7 @@ class NumericData < ActiveRecord::Base
|
|
10
13
|
end
|
11
14
|
|
12
15
|
class CalculationsTest < ActiveRecord::TestCase
|
13
|
-
fixtures :companies, :accounts, :topics
|
16
|
+
fixtures :companies, :accounts, :topics, :owners, :pets, :toys
|
14
17
|
|
15
18
|
def test_should_sum_field
|
16
19
|
assert_equal 318, Account.sum(:credit_limit)
|
@@ -264,19 +267,6 @@ class CalculationsTest < ActiveRecord::TestCase
|
|
264
267
|
assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit)
|
265
268
|
end
|
266
269
|
|
267
|
-
def test_should_count_scoped_select
|
268
|
-
Account.update_all("credit_limit = NULL")
|
269
|
-
assert_equal 0, Account.scoped(:select => "credit_limit").count
|
270
|
-
end
|
271
|
-
|
272
|
-
def test_should_count_scoped_select_with_options
|
273
|
-
Account.update_all("credit_limit = NULL")
|
274
|
-
Account.last.update_attribute('credit_limit', 49)
|
275
|
-
Account.first.update_attribute('credit_limit', 51)
|
276
|
-
|
277
|
-
assert_equal 1, Account.scoped(:select => "credit_limit").count(:conditions => ['credit_limit >= 50'])
|
278
|
-
end
|
279
|
-
|
280
270
|
def test_should_count_manual_select_with_include
|
281
271
|
assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm)
|
282
272
|
end
|
@@ -297,6 +287,10 @@ class CalculationsTest < ActiveRecord::TestCase
|
|
297
287
|
assert_raise(ArgumentError) { Account.count(1, 2, 3) }
|
298
288
|
end
|
299
289
|
|
290
|
+
def test_count_with_scoped_has_many_through_association
|
291
|
+
assert_equal 1, owners(:blackbeard).toys.with_name('Bone').count
|
292
|
+
end
|
293
|
+
|
300
294
|
def test_should_sum_expression
|
301
295
|
if current_adapter?(:IBM_DBAdapter) && !ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_IDS')
|
302
296
|
assert_equal 636, Account.sum("2 * credit_limit")
|
data/test/cases/finder_test.rb
CHANGED
@@ -118,7 +118,13 @@ class FinderTest < ActiveRecord::TestCase
|
|
118
118
|
assert !Customer.exists?(:address =>
|
119
119
|
Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
|
+
def test_exists_with_scoped_include
|
123
|
+
Developer.with_scope(:find => { :include => :projects, :order => "projects.name" }) do
|
124
|
+
assert Developer.exists?
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
122
128
|
def test_find_by_array_of_one_id
|
123
129
|
assert_kind_of(Array, Topic.find([ 1 ]))
|
124
130
|
assert_equal(1, Topic.find([ 1 ]).length)
|
data/test/cases/fixtures_test.rb
CHANGED
@@ -522,6 +522,11 @@ class FoxyFixturesTest < ActiveRecord::TestCase
|
|
522
522
|
assert_equal(Fixtures.identify(:foo), Fixtures.identify(:foo))
|
523
523
|
end
|
524
524
|
|
525
|
+
def test_identifies_consistently
|
526
|
+
assert_equal 1281023246, Fixtures.identify(:ruby)
|
527
|
+
assert_equal 2140105598, Fixtures.identify(:sapphire_2)
|
528
|
+
end
|
529
|
+
|
525
530
|
TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
|
526
531
|
|
527
532
|
def test_populates_timestamp_columns
|
@@ -22,6 +22,13 @@ class SchemaDumperTest < ActiveRecord::TestCase
|
|
22
22
|
assert_no_match %r{create_table "sqlite_sequence"}, output
|
23
23
|
end
|
24
24
|
|
25
|
+
unless current_adapter?(:IBM_DBAdapter) #DB2 is case insensitive
|
26
|
+
def test_schema_dump_includes_camelcase_table_name
|
27
|
+
output = standard_dump
|
28
|
+
assert_match %r{create_table "CamelCase"}, output
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
25
32
|
def assert_line_up(lines, pattern, required = false)
|
26
33
|
return assert(true) if lines.empty?
|
27
34
|
matches = lines.map { |line| line.match(pattern) }
|
@@ -149,19 +156,24 @@ class SchemaDumperTest < ActiveRecord::TestCase
|
|
149
156
|
end
|
150
157
|
end
|
151
158
|
|
159
|
+
def test_schema_dumps_index_columns_in_right_order
|
160
|
+
index_definition = standard_dump.split(/\n/).grep(/add_index.*companies/).first.strip
|
161
|
+
assert_equal 'add_index "companies", ["firm_id", "type", "rating", "ruby_type"], :name => "company_index"', index_definition
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_schema_dump_should_honor_nonstandard_primary_keys
|
165
|
+
output = standard_dump
|
166
|
+
match = output.match(%r{create_table "movies"(.*)do})
|
167
|
+
assert_not_nil(match, "nonstandardpk table not found")
|
168
|
+
assert_match %r(:primary_key => "movieid"), match[1], "non-standard primary key not preserved"
|
169
|
+
end
|
170
|
+
|
152
171
|
if current_adapter?(:MysqlAdapter)
|
153
172
|
def test_schema_dump_should_not_add_default_value_for_mysql_text_field
|
154
173
|
output = standard_dump
|
155
174
|
assert_match %r{t.text\s+"body",\s+:null => false$}, output
|
156
175
|
end
|
157
176
|
|
158
|
-
def test_mysql_schema_dump_should_honor_nonstandard_primary_keys
|
159
|
-
output = standard_dump
|
160
|
-
match = output.match(%r{create_table "movies"(.*)do})
|
161
|
-
assert_not_nil(match, "nonstandardpk table not found")
|
162
|
-
assert_match %r(:primary_key => "movieid"), match[1], "non-standard primary key not preserved"
|
163
|
-
end
|
164
|
-
|
165
177
|
def test_schema_dump_includes_length_for_mysql_blob_and_text_fields
|
166
178
|
output = standard_dump
|
167
179
|
assert_match %r{t.binary\s+"tiny_blob",\s+:limit => 255$}, output
|
@@ -17,6 +17,7 @@ ActiveRecord::Base.configurations = {
|
|
17
17
|
:app_user => 'tester_11',
|
18
18
|
:application => 'rails_tests',
|
19
19
|
:workstation => 'auckland',
|
20
|
+
:start_id => 100,
|
20
21
|
:database => 'ARUNIT'
|
21
22
|
},
|
22
23
|
'arunit2' => {
|
@@ -30,6 +31,7 @@ ActiveRecord::Base.configurations = {
|
|
30
31
|
:app_user => 'tester_11',
|
31
32
|
:application => 'rails_tests',
|
32
33
|
:workstation => 'auckland',
|
34
|
+
:start_id => 100,
|
33
35
|
:database => 'ARUNIT2'
|
34
36
|
}
|
35
37
|
}
|
data/test/schema/schema.rb
CHANGED
@@ -68,6 +68,10 @@ ActiveRecord::Schema.define do
|
|
68
68
|
t.boolean :value
|
69
69
|
end
|
70
70
|
|
71
|
+
create_table :camelcase, :force => true do |t|
|
72
|
+
t.string :name
|
73
|
+
end
|
74
|
+
|
71
75
|
create_table :categories, :force => true do |t|
|
72
76
|
t.string :name, :null => false
|
73
77
|
t.string :type
|
@@ -116,6 +120,8 @@ ActiveRecord::Schema.define do
|
|
116
120
|
t.integer :rating, :default => 1
|
117
121
|
end
|
118
122
|
|
123
|
+
add_index :companies, [:firm_id, :type, :rating, :ruby_type], :name => "company_index"
|
124
|
+
|
119
125
|
create_table :computers, :force => true do |t|
|
120
126
|
t.integer :developer, :null => false
|
121
127
|
t.integer :extendedWarranty, :null => false
|
@@ -157,6 +163,12 @@ ActiveRecord::Schema.define do
|
|
157
163
|
t.integer :course_id, :null => false
|
158
164
|
end
|
159
165
|
|
166
|
+
create_table :essays, :force => true do |t|
|
167
|
+
t.string :name
|
168
|
+
t.string :writer_id
|
169
|
+
t.string :writer_type
|
170
|
+
end
|
171
|
+
|
160
172
|
create_table :events, :force => true do |t|
|
161
173
|
t.string :title, :limit => 5
|
162
174
|
end
|
@@ -285,6 +297,8 @@ ActiveRecord::Schema.define do
|
|
285
297
|
|
286
298
|
create_table :owners, :primary_key => :owner_id ,:force => true do |t|
|
287
299
|
t.string :name
|
300
|
+
t.column :updated_at, :datetime
|
301
|
+
t.column :happy_at, :datetime
|
288
302
|
end
|
289
303
|
|
290
304
|
except 'IBM_DB' do
|
@@ -418,6 +432,7 @@ ActiveRecord::Schema.define do
|
|
418
432
|
t.boolean :approved, :default => true
|
419
433
|
t.integer :replies_count, :default => 0
|
420
434
|
t.integer :parent_id
|
435
|
+
t.string :parent_title
|
421
436
|
t.string :type
|
422
437
|
end
|
423
438
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibm_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- IBM
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-30 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
91
|
requirements:
|
92
92
|
- ActiveRecord, at least 1.15.1
|
93
93
|
rubyforge_project: rubyibm
|
94
|
-
rubygems_version: 1.3.
|
94
|
+
rubygems_version: 1.3.5
|
95
95
|
signing_key:
|
96
96
|
specification_version: 3
|
97
97
|
summary: "Rails Driver and Adapter for IBM Data Servers: {DB2 on Linux/Unix/Windows, DB2 on zOS, DB2 on i5/OS, Informix (IDS)}"
|