ibm_db 0.10.0 → 1.0.0

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 CHANGED
@@ -1,5 +1,20 @@
1
1
  Change Log
2
2
  ==============
3
+ 2008/11/06 (IBM_DB adapter 1.0.0, driver 0.10.0):
4
+ - Support for short-hand migration syntax for datatype char and double in create_table
5
+ - Support for short-hand migration syntax for datatypes xml, char and double in change_table
6
+ - Support for secure connections using SSL (SECURITY=SSL) feature of DB2 in Adapter
7
+ Note: - This is supported from client version V9.5fp2 and onwards
8
+ - Support for altering the nullability constraint of a column.
9
+ - Added correct mapping for datatype :double for DB2 and Informix (double precision)
10
+ - Method support_ddl_transactions? overridden to return true. Feature of Rails2.2
11
+ IBM Dataservers support transactional migrations.
12
+ - Change in the style of accessing driver methods
13
+ Changed from scope resolution operator to dot operator
14
+ IBM_DB::connect '<db_name>','<username>','<pwd>' to IBM_DB.connect '<db_name>','<username>','<pwd>'
15
+ - Fixed Bug [#22430] --> Fixed limit ignorance for type character [char]
16
+ - ActiveRecord-2.1.2 test suite changes for IBM_DB
17
+
3
18
  2008/09/01 (IBM_DB adapter 0.10.0, driver 0.10.0):
4
19
  - Added Trusted Context support in Driver
5
20
  - Made changes for the correct Mapping of Informix DataTypes to Ruby DataTypes
data/README CHANGED
@@ -1,5 +1,5 @@
1
1
  =====================================================================
2
- README for the IBM_DB Adapter (0.10.0) and Driver (0.10.0) (2008/09/01)
2
+ README for the IBM_DB Adapter (1.0.0) and Driver (0.10.0) (2008/11/06)
3
3
  For ActiveRecord Version >= 1.15.5 (and Rails >= 1.2.5)
4
4
  =====================================================================
5
5
 
@@ -60,7 +60,7 @@ Note : - 1) If using activerecord version below 2.0 then it requires that the ib
60
60
  D:\NewApp>irb
61
61
  irb(main):001:0> gem 'ibm_db'
62
62
  irb(main):002:0> require 'mswin32/ibm_db' // notice the [mswin32] in the library path
63
- irb(main):003:0> IBM_DB::connect 'sample', 'db2admin', 'secret'
63
+ irb(main):003:0> IBM_DB.connect 'sample', 'db2admin', 'secret'
64
64
  D:\NewApp>ruby script\console
65
65
 
66
66
 
@@ -99,7 +99,7 @@ Note : - 1) If using activerecord version below 2.0 then it requires that the ib
99
99
  $ irb
100
100
  irb(main):001:0> gem 'ibm_db'
101
101
  irb(main):002:0> require 'ibm_db' // notice the library path (different on win32, use require 'mswin32/ibm_db')
102
- irb(main):003:0> IBM_DB::connect 'sample', 'db2admin', 'secret'
102
+ irb(main):003:0> IBM_DB.connect 'sample', 'db2admin', 'secret'
103
103
  $
104
104
 
105
105
  BUILD (optionally) ibm_db gem from sources (ibm_db-x.x.x.tar.gz):
@@ -1,9 +1,11 @@
1
1
  # +----------------------------------------------------------------------+
2
2
  # | Licensed Materials - Property of IBM |
3
3
  # | |
4
- # | (C) Copyright IBM Corporation 2006, 2007. |
4
+ # | (C) Copyright IBM Corporation 2006, 2007, 2008. |
5
5
  # +----------------------------------------------------------------------+
6
- # | Author: Antonio Cangiano <cangiano@ca.ibm.com> |
6
+ # | Authors: Antonio Cangiano <cangiano@ca.ibm.com> |
7
+ # | : Mario Ds Briggs <mario.briggs@in.ibm.com> |
8
+ # | : Praveen Devarao <praveendrl@in.ibm.com> |
7
9
  # +----------------------------------------------------------------------+
8
10
 
9
11
  require 'active_record/connection_adapters/abstract_adapter'
@@ -62,8 +64,8 @@ module ActiveRecord
62
64
  end
63
65
  update_query << " WHERE #{self.class.primary_key} = #{id}"
64
66
 
65
- unless stmt = IBM_DB::prepare(connection.connection, update_query)
66
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
67
+ unless stmt = IBM_DB.prepare(connection.connection, update_query)
68
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
67
69
  if error_msg && !error_msg.empty?
68
70
  raise "Failed to rename table due to error: #{error_msg}"
69
71
  else
@@ -73,11 +75,11 @@ module ActiveRecord
73
75
  connection.log_query(update_query,'update of LOB/XML field(s)in handle_lobs')
74
76
 
75
77
  # rollback any failed LOB/XML field updates (and remove associated marker)
76
- unless IBM_DB::execute(stmt, values)
78
+ unless IBM_DB.execute(stmt, values)
77
79
  connection.execute("ROLLBACK")
78
- raise "Failed to insert/update LOB/XML field(s) due to: #{IBM_DB::stmt_errormsg(stmt)}"
80
+ raise "Failed to insert/update LOB/XML field(s) due to: #{IBM_DB.stmt_errormsg(stmt)}"
79
81
  else
80
- IBM_DB::free_result stmt
82
+ IBM_DB.free_result stmt
81
83
  end
82
84
  end # if connection.sql
83
85
  end # if connection.kind_of?
@@ -138,7 +140,7 @@ requires credentials: username and password"
138
140
  end
139
141
 
140
142
  # Checks if a host name or address has been specified. If so, this implies a TCP/IP connection
141
- # Returns IBM_DB::Connection object upon succesful DB connection to the database
143
+ # Returns IBM_DB.Connection object upon succesful DB connection to the database
142
144
  # If otherwise the connection fails, +false+ is returned
143
145
  if config.has_key?(:host)
144
146
  # Retrieves the host address/name
@@ -146,16 +148,22 @@ requires credentials: username and password"
146
148
  # A net address connection requires a port. If no port has been specified, 50000 is used by default
147
149
  port = config[:port] || 50000
148
150
  # Connects to the database using the database, host, port, username and password specified
149
- connection = IBM_DB::connect "DRIVER={IBM DB2 ODBC DRIVER};\
150
- DATABASE=#{database};\
151
- HOSTNAME=#{host};\
152
- PORT=#{port};\
153
- PROTOCOL=TCPIP;\
154
- UID=#{username};\
155
- PWD=#{password};", '', '', conn_options
151
+ # Starting with DB2 9.1FP5 secure connections using SSL are supported.
152
+ # On the client side using CLI this is supported from CLI version V95FP2 and onwards.
153
+ # This feature is set by specifying SECURITY=SSL in the connection string.
154
+ # Below connection string is constructed and SECURITY parameter is appended if the user has specified the :security option
155
+ conn_string = "DRIVER={IBM DB2 ODBC DRIVER};\
156
+ DATABASE=#{database};\
157
+ HOSTNAME=#{host};\
158
+ PORT=#{port};\
159
+ PROTOCOL=TCPIP;\
160
+ UID=#{username};\
161
+ PWD=#{password};"
162
+ conn_string << "SECURITY=#{config[:security]};" if config.has_key?(:security)
163
+ connection = IBM_DB.connect conn_string, '', '', conn_options
156
164
  else
157
165
  # No host implies a local catalog-based connection: +database+ represents catalog alias
158
- connection = IBM_DB::connect( database, username, password, conn_options )
166
+ connection = IBM_DB.connect( database, username, password, conn_options )
159
167
  end
160
168
 
161
169
  # Verifies that the connection was succesfull
@@ -165,7 +173,7 @@ requires credentials: username and password"
165
173
  ConnectionAdapters::IBM_DBAdapter.new(connection, logger, config, conn_options)
166
174
  else
167
175
  # If the connection failed, it raises a Runtime error
168
- raise "Failed to connect to the [#{database}] due to: #{IBM_DB::conn_errormsg}"
176
+ raise "Failed to connect to the [#{database}] due to: #{IBM_DB.conn_errormsg}"
169
177
  end
170
178
  end # method self.ibm_db_connection
171
179
  end # class Base
@@ -221,23 +229,87 @@ requires credentials: username and password"
221
229
  when /rowid/i # rowid is a supported datatype on z/OS and i/5
222
230
  :rowid
223
231
  end
224
- end # method simplified_type
225
- end #class IBM_DBColumn
232
+ end # method simplified_type
233
+ end #class IBM_DBColumn
226
234
 
227
- class TableDefinition
235
+ class Table
228
236
 
229
- #Method to support the new syntax of rails 2.0 migrations for columns of type xml
230
- def xml(*args )
237
+ #Method to parse the passed arguments and create the ColumnDefinition object of the specified type
238
+ def ibm_parse_column_attributes_args(type, *args)
231
239
  options = {}
232
240
  if args.last.is_a?(Hash)
233
241
  options = args.delete_at(args.length-1)
234
242
  end
235
243
  args.each do | name |
236
- column(name,'xml',options)
244
+ column name,type.to_sym,options
237
245
  end # end args.each
246
+ end
247
+ private :ibm_parse_column_attributes_args
248
+
249
+ #Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type xml
250
+ #This method is different as compared to def char (sql is being issued explicitly
251
+ #as compared to def char where method column(which will generate the sql is being called)
252
+ #in order to handle the DEFAULT and NULL option for the native XML datatype
253
+ def xml(*args )
254
+ options = {}
255
+ if args.last.is_a?(Hash)
256
+ options = args.delete_at(args.length-1)
257
+ end
258
+ sql = "ALTER TABLE #{@base.quote_table_name(@table_name)} ADD COLUMN "
259
+ args.each do | name |
260
+ sql << "#{@base.quote_column_name(name)} xml"
261
+ @base.execute(sql,"add_xml_column")
262
+ end
263
+ return self
264
+ end
265
+
266
+ #Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type double
267
+ def double(*args)
268
+ ibm_parse_column_attributes_args('double',*args)
269
+ return self
270
+ end
271
+
272
+ #Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type char [character]
273
+ def char(*args)
274
+ ibm_parse_column_attributes_args('char',*args)
275
+ return self
276
+ end
277
+ alias_method :character, :char
278
+ end
279
+
280
+ class TableDefinition
281
+
282
+ #Method to parse the passed arguments and create the ColumnDefinition object of the specified type
283
+ def ibm_parse_column_attributes_args(type, *args)
284
+ options = {}
285
+ if args.last.is_a?(Hash)
286
+ options = args.delete_at(args.length-1)
287
+ end
288
+ args.each do | name |
289
+ column(name,type,options)
290
+ end
291
+ end
292
+ private :ibm_parse_column_attributes_args
293
+
294
+ #Method to support the new syntax of rails 2.0 migrations for columns of type xml
295
+ def xml(*args )
296
+ ibm_parse_column_attributes_args('xml', *args)
297
+ return self
298
+ end
299
+
300
+ #Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type double
301
+ def double(*args)
302
+ ibm_parse_column_attributes_args('double',*args)
238
303
  return self
239
304
  end
240
305
 
306
+ #Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type char [character]
307
+ def char(*args)
308
+ ibm_parse_column_attributes_args('char',*args)
309
+ return self
310
+ end
311
+ alias_method :character, :char
312
+
241
313
  # Overrides the abstract adapter in order to handle
242
314
  # the DEFAULT option for the native XML datatype
243
315
  def column(name, type, options ={})
@@ -296,6 +368,8 @@ requires credentials: username and password"
296
368
  # == remote TCP/IP connection (required when no local database catalog entry available)
297
369
  # host: 'socrates' // fully qualified hostname or IP address
298
370
  # port: '50000' // data server TCP/IP port number
371
+ # security: 'SSL' // optional parameter enabling SSL encryption -
372
+ # // - Available only from CLI version V95fp2 and above
299
373
  #
300
374
  # When schema is not specified, the username value is used instead.
301
375
  #
@@ -321,7 +395,8 @@ requires credentials: username and password"
321
395
  @port = config[:port] || 50000 # default port
322
396
  end
323
397
  @schema = config[:schema]
324
-
398
+ @security = config[:security] || nil
399
+
325
400
  # Caching database connection options (auditing and billing support)
326
401
  @app_user = conn_options[:app_user] if conn_options.has_key?(:app_user)
327
402
  @account = conn_options[:account] if conn_options.has_key?(:account)
@@ -333,7 +408,7 @@ requires credentials: username and password"
333
408
  super(@connection, logger)
334
409
 
335
410
  if @connection
336
- server_info = IBM_DB::server_info( @connection )
411
+ server_info = IBM_DB.server_info( @connection )
337
412
  case server_info.DBMS_NAME
338
413
  when /DB2\//i # DB2 for Linux, Unix and Windows (LUW)
339
414
  @servertype = IBM_DB2_LUW.new(self)
@@ -369,8 +444,8 @@ requires credentials: username and password"
369
444
  def app_user=(name)
370
445
  unless name == @app_user
371
446
  option = {IBM_DB::SQL_ATTR_INFO_USERID => "#{name}"}
372
- if IBM_DB::set_option( @connection, option, 1 )
373
- @app_user = IBM_DB::get_option( @connection, IBM_DB::SQL_ATTR_INFO_USERID, 1 )
447
+ if IBM_DB.set_option( @connection, option, 1 )
448
+ @app_user = IBM_DB.get_option( @connection, IBM_DB::SQL_ATTR_INFO_USERID, 1 )
374
449
  end
375
450
  end
376
451
  end
@@ -379,8 +454,8 @@ requires credentials: username and password"
379
454
  def account=(name)
380
455
  unless name == @account
381
456
  option = {IBM_DB::SQL_ATTR_INFO_ACCTSTR => "#{name}"}
382
- if IBM_DB::set_option( @connection, option, 1 )
383
- @account = IBM_DB::get_option( @connection, IBM_DB::SQL_ATTR_INFO_ACCTSTR, 1 )
457
+ if IBM_DB.set_option( @connection, option, 1 )
458
+ @account = IBM_DB.get_option( @connection, IBM_DB::SQL_ATTR_INFO_ACCTSTR, 1 )
384
459
  end
385
460
  end
386
461
  end
@@ -389,8 +464,8 @@ requires credentials: username and password"
389
464
  def application=(name)
390
465
  unless name == @application
391
466
  option = {IBM_DB::SQL_ATTR_INFO_APPLNAME => "#{name}"}
392
- if IBM_DB::set_option( @connection, option, 1 )
393
- @application = IBM_DB::get_option( @connection, IBM_DB::SQL_ATTR_INFO_APPLNAME, 1 )
467
+ if IBM_DB.set_option( @connection, option, 1 )
468
+ @application = IBM_DB.get_option( @connection, IBM_DB::SQL_ATTR_INFO_APPLNAME, 1 )
394
469
  end
395
470
  end
396
471
  end
@@ -399,8 +474,8 @@ requires credentials: username and password"
399
474
  def workstation=(name)
400
475
  unless name == @workstation
401
476
  option = {IBM_DB::SQL_ATTR_INFO_WRKSTNNAME => "#{name}"}
402
- if IBM_DB::set_option( @connection, option, 1 )
403
- @workstation = IBM_DB::get_option( @connection, IBM_DB::SQL_ATTR_INFO_WRKSTNNAME, 1 )
477
+ if IBM_DB.set_option( @connection, option, 1 )
478
+ @workstation = IBM_DB.get_option( @connection, IBM_DB::SQL_ATTR_INFO_WRKSTNNAME, 1 )
404
479
  end
405
480
  end
406
481
  end
@@ -413,7 +488,14 @@ requires credentials: username and password"
413
488
  def supports_migrations?
414
489
  true
415
490
  end
416
-
491
+
492
+ # This Adapter supports DDL transactions.
493
+ # This means CREATE TABLE and other DDL statements can be carried out as a transaction.
494
+ # That is the statements executed can be ROLLED BACK in case of any error during the process.
495
+ def supports_ddl_transactions?
496
+ true
497
+ end
498
+
417
499
  def log_query(sql, name) #:nodoc:
418
500
  # Used by handle_lobs
419
501
  log(sql,name){}
@@ -425,7 +507,7 @@ requires credentials: username and password"
425
507
 
426
508
  # Tests the connection status
427
509
  def active?
428
- IBM_DB::active @connection
510
+ IBM_DB.active @connection
429
511
  rescue
430
512
  false
431
513
  end
@@ -435,18 +517,20 @@ requires credentials: username and password"
435
517
  def connect
436
518
  # If the type of connection is net based
437
519
  if @host
438
- # Connects and assigns the resulting IBM_DB::Connection to the +@connection+ instance variable
439
- @connection = IBM_DB::connect("DRIVER={IBM DB2 ODBC DRIVER};\
440
- DATABASE=#{@database};\
441
- HOSTNAME=#{@host};\
442
- PORT=#{@port};\
443
- PROTOCOL=TCPIP;\
444
- UID=#{@username};\
445
- PWD=#{@password};", '', '', @conn_options)
520
+ @conn_string = "DRIVER={IBM DB2 ODBC DRIVER};\
521
+ DATABASE=#{@database};\
522
+ HOSTNAME=#{@host};\
523
+ PORT=#{@port};\
524
+ PROTOCOL=TCPIP;\
525
+ UID=#{@username};\
526
+ PWD=#{@password};"
527
+ @conn_string << "SECURITY=#{@security};" if @security
528
+ # Connects and assigns the resulting IBM_DB.Connection to the +@connection+ instance variable
529
+ @connection = IBM_DB.connect(@conn_string, '', '', @conn_options)
446
530
  else
447
531
  # Connects to the database using the local alias (@database)
448
- # and assigns the connection object (IBM_DB::Connection) to @connection
449
- @connection = IBM_DB::connect(@database, @username, @password, @conn_options)
532
+ # and assigns the connection object (IBM_DB.Connection) to @connection
533
+ @connection = IBM_DB.connect(@database, @username, @password, @conn_options)
450
534
  end
451
535
  # Sets the schema if different from default (username)
452
536
  if @schema && @schema != @username
@@ -467,7 +551,7 @@ requires credentials: username and password"
467
551
  # * true if succesfull
468
552
  # * false if the connection is already closed
469
553
  # * nil if an error is raised
470
- IBM_DB::close(@connection) rescue nil
554
+ IBM_DB.close(@connection) rescue nil
471
555
  end
472
556
 
473
557
  #==============================================
@@ -502,13 +586,13 @@ requires credentials: username and password"
502
586
 
503
587
  results = []
504
588
  # Invokes the method +execute+ in order to log and execute the SQL
505
- # IBM_DB::Statement is returned from which results can be fetched
589
+ # IBM_DB.Statement is returned from which results can be fetched
506
590
  if stmt = execute(sql, name)
507
591
  begin
508
592
  @servertype.select_all(sql, name, stmt, results)
509
593
  ensure
510
594
  # Ensures to free the resources associated with the statement
511
- IBM_DB::free_result stmt
595
+ IBM_DB.free_result stmt
512
596
  end
513
597
  end
514
598
  # The array of record hashes is returned
@@ -524,13 +608,13 @@ requires credentials: username and password"
524
608
 
525
609
  results = []
526
610
  # Invokes the method +execute+ in order to log and execute the SQL
527
- # IBM_DB::Statement is returned from which results can be fetched
611
+ # IBM_DB.Statement is returned from which results can be fetched
528
612
  if stmt = execute(sql, name)
529
613
  begin
530
614
  @servertype.select_rows(sql, name, stmt, results)
531
615
  ensure
532
616
  # Ensures to free the resources associated with the statement
533
- IBM_DB::free_result stmt
617
+ IBM_DB.free_result stmt
534
618
  end
535
619
  end
536
620
  # The array of record hashes is returned
@@ -584,8 +668,8 @@ requires credentials: username and password"
584
668
  end
585
669
 
586
670
  insert_query << " VALUES ("+ params.join(',') + ")"
587
- unless stmt = IBM_DB::prepare(@connection, insert_query)
588
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
671
+ unless stmt = IBM_DB.prepare(@connection, insert_query)
672
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
589
673
  if error_msg && !error_msg.empty?
590
674
  raise "Failed to prepare statement due to : #{error_msg}"
591
675
  else
@@ -595,10 +679,10 @@ requires credentials: username and password"
595
679
 
596
680
  #log_query(insert_query,'fixture insert')
597
681
  log(insert_query,'fixture insert') do
598
- unless IBM_DB::execute(stmt, insert_values)
599
- raise "Failed to insert due to: #{IBM_DB::stmt_errormsg(stmt)}"
682
+ unless IBM_DB.execute(stmt, insert_values)
683
+ raise "Failed to insert due to: #{IBM_DB.stmt_errormsg(stmt)}"
600
684
  else
601
- IBM_DB::free_result stmt
685
+ IBM_DB.free_result stmt
602
686
  end
603
687
  end
604
688
  end
@@ -613,13 +697,13 @@ requires credentials: username and password"
613
697
  return id_value || @servertype.last_generated_id(stmt)
614
698
  # Ensures to free the resources associated with the statement
615
699
  ensure
616
- IBM_DB::free_result(stmt)
700
+ IBM_DB.free_result(stmt)
617
701
  end
618
702
  end
619
703
  end
620
704
 
621
705
  # Executes and logs +sql+ commands and
622
- # returns a +IBM_DB::Statement+ object.
706
+ # returns a +IBM_DB.Statement+ object.
623
707
  def execute(sql, name = nil)
624
708
  # Logs and execute the sql instructions.
625
709
  # The +log+ method is defined in the parent class +AbstractAdapter+
@@ -642,10 +726,10 @@ requires credentials: username and password"
642
726
  begin
643
727
  @sql = sql
644
728
  # Retrieves the number of affected rows
645
- IBM_DB::num_rows(stmt)
729
+ IBM_DB.num_rows(stmt)
646
730
  # Ensures to free the resources associated with the statement
647
731
  ensure
648
- IBM_DB::free_result(stmt)
732
+ IBM_DB.free_result(stmt)
649
733
  end
650
734
  end
651
735
  end
@@ -658,24 +742,24 @@ requires credentials: username and password"
658
742
  # Begins the transaction (and turns off auto-committing)
659
743
  def begin_db_transaction
660
744
  # Turns off the auto-commit
661
- IBM_DB::autocommit(@connection, IBM_DB::SQL_AUTOCOMMIT_OFF)
745
+ IBM_DB.autocommit(@connection, IBM_DB::SQL_AUTOCOMMIT_OFF)
662
746
  end
663
747
 
664
748
  # Commits the transaction and turns on auto-committing
665
749
  def commit_db_transaction
666
750
  # Commits the transaction
667
- IBM_DB::commit @connection rescue nil
751
+ IBM_DB.commit @connection rescue nil
668
752
  # Turns on auto-committing
669
- IBM_DB::autocommit @connection, IBM_DB::SQL_AUTOCOMMIT_ON
753
+ IBM_DB.autocommit @connection, IBM_DB::SQL_AUTOCOMMIT_ON
670
754
  end
671
755
 
672
756
  # Rolls back the transaction and turns on auto-committing. Must be
673
757
  # done if the transaction block raises an exception or returns false
674
758
  def rollback_db_transaction
675
759
  # ROLLBACK the transaction
676
- IBM_DB::rollback(@connection) rescue nil
760
+ IBM_DB.rollback(@connection) rescue nil
677
761
  # Turns on auto-committing
678
- IBM_DB::autocommit @connection, IBM_DB::SQL_AUTOCOMMIT_ON
762
+ IBM_DB.autocommit @connection, IBM_DB::SQL_AUTOCOMMIT_ON
679
763
  end
680
764
 
681
765
 
@@ -829,7 +913,9 @@ requires credentials: username and password"
829
913
  :xml => { :name => "xml"},
830
914
  :decimal => { :name => "decimal" },
831
915
  :rowid => { :name => "rowid" }, # rowid is a supported datatype on z/OS and i/5
832
- :serial => { :name => "serial" } # rowid is a supported datatype on Informix Dynamic Server
916
+ :serial => { :name => "serial" }, # rowid is a supported datatype on Informix Dynamic Server
917
+ :char => { :name => "char" },
918
+ :double => { :name => @servertype.get_double_mapping }
833
919
  }
834
920
  end
835
921
 
@@ -839,8 +925,8 @@ requires credentials: username and password"
839
925
  return super if limit.nil?
840
926
 
841
927
  # strip off limits on data types not supporting them
842
- if [:integer, :double, :date, :time, :timestamp, :xml].include? type
843
- return type.to_s
928
+ if [:integer, :double, :date, :time, :timestamp, :xml].include? type.to_sym
929
+ return native_database_types[type.to_sym][:name].to_s
844
930
  elsif type.to_sym == :boolean
845
931
  return "smallint"
846
932
  else
@@ -859,21 +945,21 @@ requires credentials: username and password"
859
945
  # Initializes the tables array
860
946
  tables = []
861
947
  # Retrieve table's metadata through IBM_DB driver
862
- if stmt = IBM_DB::tables(@connection, nil,
948
+ if stmt = IBM_DB.tables(@connection, nil,
863
949
  @servertype.set_case(@schema))
864
950
  begin
865
951
  # Fetches all the records available
866
- while tab = IBM_DB::fetch_assoc(stmt)
952
+ while tab = IBM_DB.fetch_assoc(stmt)
867
953
  # Adds the lowercase table name to the array
868
- if(tab["table_type"]== 'TABLE') #check, so that only tables are dumped,IBM_DB::tables also returns views,alias etc in the schema
954
+ if(tab["table_type"]== 'TABLE') #check, so that only tables are dumped,IBM_DB.tables also returns views,alias etc in the schema
869
955
  tables << tab["table_name"].downcase
870
956
  end
871
957
  end
872
958
  ensure
873
- IBM_DB::free_result(stmt) # Free resources associated with the statement
959
+ IBM_DB.free_result(stmt) # Free resources associated with the statement
874
960
  end
875
961
  else # Handle driver execution errors
876
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
962
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
877
963
  if error_msg && !error_msg.empty?
878
964
  raise "Failed to retrieve tables metadata due to error: #{error_msg}"
879
965
  else
@@ -901,11 +987,11 @@ requires credentials: username and password"
901
987
  #TABLE_NAME:: pk_index[2]
902
988
  #COLUMN_NAME:: pk_index[3]
903
989
  #PK_NAME:: pk_index[5]
904
- if stmt = IBM_DB::primary_keys( @connection, nil,
990
+ if stmt = IBM_DB.primary_keys( @connection, nil,
905
991
  @servertype.set_case(@schema),
906
992
  @servertype.set_case(table_name))
907
993
  begin
908
- while ( pk_index_row = IBM_DB::fetch_array(stmt) )
994
+ while ( pk_index_row = IBM_DB.fetch_array(stmt) )
909
995
  if pk_index_row[5]
910
996
  pk_index_name = pk_index_row[5].downcase
911
997
  pk_index_columns = pk_index_row[3].map{|c| c.downcase} # COLUMN_NAME
@@ -917,10 +1003,10 @@ requires credentials: username and password"
917
1003
  end
918
1004
  end
919
1005
  ensure # Free resources associated with the statement
920
- IBM_DB::free_result(stmt) if stmt
1006
+ IBM_DB.free_result(stmt) if stmt
921
1007
  end
922
1008
  else # Handle driver execution errors
923
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1009
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
924
1010
  if error_msg && !error_msg.empty?
925
1011
  raise "Failed to retrieve primary key metadata due to error: #{error_msg}"
926
1012
  else
@@ -934,11 +1020,11 @@ requires credentials: username and password"
934
1020
  # "NON_UNIQUE: #{index_stats[3]}"
935
1021
  # "INDEX_NAME: #{index_stats[5]}"
936
1022
  # "COLUMN_NAME: #{index_stats[8]}"
937
- if stmt = IBM_DB::statistics( @connection, nil,
1023
+ if stmt = IBM_DB.statistics( @connection, nil,
938
1024
  @servertype.set_case(@schema),
939
1025
  @servertype.set_case(table_name), 1 )
940
1026
  begin
941
- while ( index_stats = IBM_DB::fetch_array(stmt) )
1027
+ while ( index_stats = IBM_DB.fetch_array(stmt) )
942
1028
  is_composite = false
943
1029
  if index_stats[5] # INDEX_NAME
944
1030
  index_name = index_stats[5].downcase
@@ -962,10 +1048,10 @@ requires credentials: username and password"
962
1048
  end
963
1049
  end
964
1050
  ensure # Free resources associated with the statement
965
- IBM_DB::free_result(stmt) if stmt
1051
+ IBM_DB.free_result(stmt) if stmt
966
1052
  end
967
1053
  else # Handle driver execution errors
968
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1054
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
969
1055
  if error_msg && !error_msg.empty?
970
1056
  raise "Failed to retrieve index metadata due to error: #{error_msg}"
971
1057
  else
@@ -996,13 +1082,13 @@ requires credentials: username and password"
996
1082
  # +columns+ will contain the resulting array
997
1083
  columns = []
998
1084
  # Statement required to access all the columns information
999
- if stmt = IBM_DB::columns( @connection, nil,
1085
+ if stmt = IBM_DB.columns( @connection, nil,
1000
1086
  @servertype.set_case(@schema),
1001
1087
  @servertype.set_case(table_name) )
1002
1088
  begin
1003
1089
  # Fetches all the columns and assigns them to col.
1004
1090
  # +col+ is an hash with keys/value pairs for a column
1005
- while col = IBM_DB::fetch_assoc(stmt)
1091
+ while col = IBM_DB.fetch_assoc(stmt)
1006
1092
  column_name = col["column_name"].downcase
1007
1093
  # Assigns the column default value.
1008
1094
  column_default_value = col["column_def"]
@@ -1041,17 +1127,17 @@ requires credentials: username and password"
1041
1127
  end
1042
1128
  end
1043
1129
  rescue StandardError # Handle driver fetch errors
1044
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1130
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1045
1131
  if error_msg && !error_msg.empty?
1046
1132
  raise "Failed to retrieve column metadata during fetch: #{error_msg}"
1047
1133
  else
1048
1134
  raise
1049
1135
  end
1050
1136
  ensure # Free resources associated with the statement
1051
- IBM_DB::free_result(stmt)
1137
+ IBM_DB.free_result(stmt)
1052
1138
  end
1053
1139
  else # Handle driver execution errors
1054
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1140
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1055
1141
  if error_msg && !error_msg.empty?
1056
1142
  raise "Failed to retrieve column metadata due to error: #{error_msg}"
1057
1143
  else
@@ -1072,7 +1158,7 @@ requires credentials: username and password"
1072
1158
  stmt = execute(rename_table_sql)
1073
1159
  # Ensures to free the resources associated with the statement
1074
1160
  ensure
1075
- IBM_DB::free_result stmt if stmt
1161
+ IBM_DB.free_result stmt if stmt
1076
1162
  end
1077
1163
 
1078
1164
  # Renames a column.
@@ -1121,6 +1207,7 @@ requires credentials: username and password"
1121
1207
  end
1122
1208
  end
1123
1209
  end
1210
+
1124
1211
  # Sets a new default value for a column. This does not set the default
1125
1212
  # value to +NULL+, instead, it needs DatabaseStatements#execute which
1126
1213
  # can execute the appropriate SQL statement for setting the value.
@@ -1131,7 +1218,12 @@ requires credentials: username and password"
1131
1218
  def change_column_default(table_name, column_name, default)
1132
1219
  @servertype.change_column_default(table_name, column_name, default)
1133
1220
  end
1134
-
1221
+
1222
+ #Changes the nullability value of a column
1223
+ def change_column_null(table_name, column_name, null, default = nil)
1224
+ @servertype.change_column_null(table_name, column_name, null, default)
1225
+ end
1226
+
1135
1227
  # Remove the given index from the table.
1136
1228
  #
1137
1229
  # Remove the suppliers_name_index in the suppliers table (legacy support, use the second or third forms).
@@ -1191,20 +1283,20 @@ To remove the column, the table must be dropped and recreated without the #{colu
1191
1283
  end
1192
1284
 
1193
1285
  def select_all(sql, name, stmt, results)
1194
- # Fetches all the results available. IBM_DB::fetch_assoc(stmt) returns
1286
+ # Fetches all the results available. IBM_DB.fetch_assoc(stmt) returns
1195
1287
  # an hash for each single record.
1196
1288
  # The loop stops when there aren't any more valid records to fetch
1197
- while single_hash = IBM_DB::fetch_assoc(stmt)
1289
+ while single_hash = IBM_DB.fetch_assoc(stmt)
1198
1290
  # Add the record to the +results+ array
1199
1291
  results << single_hash
1200
1292
  end
1201
1293
  end
1202
1294
 
1203
1295
  def select_rows(sql, name, stmt, results)
1204
- # Fetches all the results available. IBM_DB::fetch_array(stmt) returns
1296
+ # Fetches all the results available. IBM_DB.fetch_array(stmt) returns
1205
1297
  # an array representing a row in a result set.
1206
1298
  # The loop stops when there aren't any more valid records to fetch
1207
- while single_array = IBM_DB::fetch_array(stmt)
1299
+ while single_array = IBM_DB.fetch_array(stmt)
1208
1300
  #Add the array to results array
1209
1301
  results << single_array
1210
1302
  end
@@ -1212,13 +1304,13 @@ To remove the column, the table must be dropped and recreated without the #{colu
1212
1304
 
1213
1305
  def execute(sql, name = nil)
1214
1306
  begin
1215
- if stmt = IBM_DB::exec(@adapter.connection, sql)
1307
+ if stmt = IBM_DB.exec(@adapter.connection, sql)
1216
1308
  stmt # Return the statement object
1217
1309
  else
1218
- raise StatementInvalid, IBM_DB::stmt_errormsg
1310
+ raise StatementInvalid, IBM_DB.stmt_errormsg
1219
1311
  end
1220
1312
  rescue StandardError
1221
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1313
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1222
1314
  if error_msg && !error_msg.empty?
1223
1315
  raise "Failed to execute statement due to error: #{error_msg}"
1224
1316
  else
@@ -1240,9 +1332,15 @@ To remove the column, the table must be dropped and recreated without the #{colu
1240
1332
  def get_time_mapping
1241
1333
  end
1242
1334
 
1335
+ def get_double_mapping
1336
+ end
1337
+
1243
1338
  def change_column_default(table_name, column_name, default)
1244
1339
  end
1245
1340
 
1341
+ def change_column_null(table_name, column_name, null, default)
1342
+ end
1343
+
1246
1344
  def set_binary_default(value)
1247
1345
  end
1248
1346
 
@@ -1271,17 +1369,17 @@ To remove the column, the table must be dropped and recreated without the #{colu
1271
1369
  def last_generated_id(stmt)
1272
1370
  # Queries the db to obtain the last ID that was automatically generated
1273
1371
  sql = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1"
1274
- if stmt = IBM_DB::exec(@adapter.connection, sql)
1372
+ if stmt = IBM_DB.exec(@adapter.connection, sql)
1275
1373
  begin
1276
1374
  # Fetches the only record available (containing the last id)
1277
- IBM_DB::fetch_row(stmt)
1375
+ IBM_DB.fetch_row(stmt)
1278
1376
  # Retrieves and returns the result of the query with the last id.
1279
- IBM_DB::result(stmt,0)
1377
+ IBM_DB.result(stmt,0)
1280
1378
  ensure # Free resources associated with the statement
1281
- IBM_DB::free_result stmt
1379
+ IBM_DB.free_result stmt
1282
1380
  end
1283
1381
  else
1284
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1382
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1285
1383
  if error_msg && !error_msg.empty?
1286
1384
  raise "Failed to retrieve last generated id due to error: #{error_msg}"
1287
1385
  else
@@ -1304,25 +1402,45 @@ The column datatype change to [#{data_type}] is not supported by this data serve
1304
1402
  end
1305
1403
  end
1306
1404
  reorg_table(table_name)
1307
- if !options[:null].nil? && !options[:null]
1308
- execute "ALTER TABLE #{table_name} ALTER #{column_name} SET NOT NULL"
1309
- end
1310
- if !options[:default].nil?
1311
- change_column_default(table_name, column_name, options[:default])
1312
- end
1405
+ change_column_null(table_name,column_name,options[:null],nil)
1406
+ change_column_default(table_name, column_name, options[:default])
1313
1407
  reorg_table(table_name)
1314
1408
  end
1315
1409
 
1316
1410
  # DB2 specific ALTER TABLE statement to add a default clause
1317
1411
  def change_column_default(table_name, column_name, default)
1318
1412
  # SQL statement which alters column's default value
1319
- change_column_sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} \
1413
+ if default.nil?
1414
+ change_column_sql = "ALTER TABLE #{table_name} ALTER #{column_name} DROP DEFAULT"
1415
+ else
1416
+ change_column_sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} \
1320
1417
  SET WITH DEFAULT #{@adapter.quote(default)}"
1418
+ end
1321
1419
  stmt = execute(change_column_sql)
1420
+ reorg_table(table_name)
1322
1421
  ensure
1323
- IBM_DB::free_result stmt if stmt
1422
+ IBM_DB.free_result stmt if stmt
1324
1423
  end
1325
1424
 
1425
+ #DB2 specific ALTER TABLE statement to change the nullability of a column
1426
+ def change_column_null(table_name, column_name, null, default)
1427
+ if !default.nil?
1428
+ change_column_default(table_name, column_name, default)
1429
+ end
1430
+ reorg_table(table_name)
1431
+ if !null.nil?
1432
+ if null
1433
+ change_column_sql = "ALTER TABLE #{table_name} ALTER #{column_name} DROP NOT NULL"
1434
+ else
1435
+ change_column_sql = "ALTER TABLE #{table_name} ALTER #{column_name} SET NOT NULL"
1436
+ end
1437
+ end
1438
+ stmt = execute(change_column_sql)
1439
+ reorg_table(table_name)
1440
+ ensure
1441
+ IBM_DB.free_result stmt if stmt
1442
+ end
1443
+
1326
1444
  # This method returns the DB2 SQL type corresponding to the Rails
1327
1445
  # datetime/timestamp type
1328
1446
  def get_datetime_mapping
@@ -1335,21 +1453,26 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1335
1453
  return "time"
1336
1454
  end
1337
1455
 
1338
- # Fetches all the results available. IBM_DB::fetch_assoc(stmt) returns
1456
+ #This method returns the DB2 SQL type corresponding to Rails double type
1457
+ def get_double_mapping
1458
+ return "double"
1459
+ end
1460
+
1461
+ # Fetches all the results available. IBM_DB.fetch_assoc(stmt) returns
1339
1462
  # an hash for each single record.
1340
1463
  # The loop stops when there aren't any more valid records to fetch
1341
1464
  def select_all(sql, name, stmt, results)
1342
1465
  if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
1343
1466
  # We know at this point that there is an offset and/or a limit
1344
1467
  # Check if the cursor type is set correctly
1345
- cursor_type = IBM_DB::get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
1468
+ cursor_type = IBM_DB.get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
1346
1469
  @offset = 0 if @offset.nil?
1347
1470
  if (cursor_type == IBM_DB::SQL_CURSOR_STATIC)
1348
1471
  index = 0
1349
1472
  # Get @limit rows starting at @offset
1350
1473
  while (index < @limit)
1351
1474
  # We increment the offset by 1 because for DB2 the offset of the initial row is 1 instead of 0
1352
- if single_hash = IBM_DB::fetch_assoc(stmt, @offset + index + 1)
1475
+ if single_hash = IBM_DB.fetch_assoc(stmt, @offset + index + 1)
1353
1476
  # Add the record to the +results+ array
1354
1477
  results << single_hash
1355
1478
  index = index + 1
@@ -1365,7 +1488,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1365
1488
  # at @offset to @offset + @limit
1366
1489
  index = 0
1367
1490
  while (index < @offset + @limit)
1368
- if single_hash = IBM_DB::fetch_assoc(stmt)
1491
+ if single_hash = IBM_DB.fetch_assoc(stmt)
1369
1492
  # Add the record to the +results+ array only from row @offset to @offset + @limit
1370
1493
  if (index >= @offset)
1371
1494
  results << single_hash
@@ -1383,7 +1506,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1383
1506
  results
1384
1507
  # No limits or offsets specified
1385
1508
  else
1386
- while single_hash = IBM_DB::fetch_assoc(stmt)
1509
+ while single_hash = IBM_DB.fetch_assoc(stmt)
1387
1510
  # Add the record to the +results+ array
1388
1511
  results << single_hash
1389
1512
  end
@@ -1393,21 +1516,21 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1393
1516
  @limit = nil
1394
1517
  end
1395
1518
 
1396
- # Fetches all the results available. IBM_DB::fetch_array(stmt) returns
1519
+ # Fetches all the results available. IBM_DB.fetch_array(stmt) returns
1397
1520
  # an array for each single record.
1398
1521
  # The loop stops when there aren't any more valid records to fetch
1399
1522
  def select_rows(sql, name, stmt, results)
1400
1523
  if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
1401
1524
  # We know at this point that there is an offset and/or a limit
1402
1525
  # Check if the cursor type is set correctly
1403
- cursor_type = IBM_DB::get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
1526
+ cursor_type = IBM_DB.get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
1404
1527
  @offset = 0 if @offset.nil?
1405
1528
  if (cursor_type == IBM_DB::SQL_CURSOR_STATIC)
1406
1529
  index = 0
1407
1530
  # Get @limit rows starting at @offset
1408
1531
  while (index < @limit)
1409
1532
  # We increment the offset by 1 because for DB2 the offset of the initial row is 1 instead of 0
1410
- if single_array = IBM_DB::fetch_array(stmt, @offset + index + 1)
1533
+ if single_array = IBM_DB.fetch_array(stmt, @offset + index + 1)
1411
1534
  # Add the array to the +results+ array
1412
1535
  results << single_array
1413
1536
  index = index + 1
@@ -1423,7 +1546,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1423
1546
  # at @offset to @offset + @limit
1424
1547
  index = 0
1425
1548
  while (index < @offset + @limit)
1426
- if single_array = IBM_DB::fetch_array(stmt)
1549
+ if single_array = IBM_DB.fetch_array(stmt)
1427
1550
  # Add the array to the +results+ array only from row @offset to @offset + @limit
1428
1551
  if (index >= @offset)
1429
1552
  results << single_array
@@ -1441,7 +1564,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1441
1564
  results
1442
1565
  # No limits or offsets specified
1443
1566
  else
1444
- while single_array = IBM_DB::fetch_array(stmt)
1567
+ while single_array = IBM_DB.fetch_array(stmt)
1445
1568
  # Add the array to the +results+ array
1446
1569
  results << single_array
1447
1570
  end
@@ -1457,14 +1580,14 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1457
1580
  if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
1458
1581
  begin
1459
1582
  # Set the cursor type to static so we can later utilize the offset and limit correctly
1460
- if stmt = IBM_DB::exec(@adapter.connection, sql,
1583
+ if stmt = IBM_DB.exec(@adapter.connection, sql,
1461
1584
  {IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
1462
1585
  stmt # Return the statement object
1463
1586
  else
1464
- raise StatementInvalid, IBM_DB::stmt_errormsg
1587
+ raise StatementInvalid, IBM_DB.stmt_errormsg
1465
1588
  end
1466
1589
  rescue StandardError
1467
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1590
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1468
1591
  if error_msg && !error_msg.empty?
1469
1592
  raise "Failed to execute statement due to error: #{error_msg}"
1470
1593
  else
@@ -1473,13 +1596,13 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1473
1596
  end
1474
1597
  else
1475
1598
  begin
1476
- if stmt = IBM_DB::exec(@adapter.connection, sql)
1599
+ if stmt = IBM_DB.exec(@adapter.connection, sql)
1477
1600
  stmt # Return the statement object
1478
1601
  else
1479
- raise StatementInvalid, IBM_DB::stmt_errormsg
1602
+ raise StatementInvalid, IBM_DB.stmt_errormsg
1480
1603
  end
1481
1604
  rescue StandardError
1482
- error_msg = IBM_DB::conn_errormsg ? IBM_DB::conn_errormsg : IBM_DB::stmt_errormsg
1605
+ error_msg = IBM_DB.conn_errormsg ? IBM_DB.conn_errormsg : IBM_DB.stmt_errormsg
1483
1606
  if error_msg && !error_msg.empty?
1484
1607
  raise "Failed to execute statement due to error: #{error_msg}"
1485
1608
  else
@@ -1587,6 +1710,11 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1587
1710
  super
1588
1711
  end
1589
1712
  end
1713
+
1714
+ def change_column_null(table_name, column_name, null, default)
1715
+ raise NotImplementedError,
1716
+ "DB2 for zOS data server does not support changing the column's nullability"
1717
+ end
1590
1718
  end # class IBM_DB2_ZOS
1591
1719
 
1592
1720
  class IBM_DB2_ZOS_8 < IBM_DB2_ZOS
@@ -1609,6 +1737,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1609
1737
  raise NotImplementedError,
1610
1738
  "DB2 for zOS data server version 8 does not support changing the column default"
1611
1739
  end
1740
+
1612
1741
  end # class IBM_DB2_ZOS_8
1613
1742
 
1614
1743
  class IBM_DB2_I5 < IBM_DB2
@@ -1645,17 +1774,45 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1645
1774
  # DEFAULT clause
1646
1775
  def change_column_default(table_name, column_name, default)
1647
1776
  sql_type = nil
1777
+ is_nullable = true
1648
1778
  @adapter.columns(table_name).select do |col|
1649
1779
  if (col.name == column_name)
1650
1780
  sql_type = @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
1781
+ is_nullable = col.null
1651
1782
  end
1652
1783
  end
1653
1784
  # SQL statement which alters column's default value
1654
1785
  change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} DEFAULT #{@adapter.quote(default)}"
1786
+ change_column_sql << " NOT NULL" unless is_nullable
1655
1787
  stmt = execute(change_column_sql)
1788
+ reorg_table(table_name)
1656
1789
  # Ensures to free the resources associated with the statement
1657
1790
  ensure
1658
- IBM_DB::free_result stmt if stmt
1791
+ IBM_DB.free_result stmt if stmt
1792
+ end
1793
+
1794
+ # IDS specific ALTER TABLE statement to change the nullability of a column
1795
+ def change_column_null(table_name,column_name,null,default)
1796
+ if !default.nil?
1797
+ change_column_default table_name, column_name, default
1798
+ end
1799
+ sql_type = nil
1800
+ @adapter.columns(table_name).select do |col|
1801
+ if (col.name == column_name)
1802
+ sql_type = @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
1803
+ end
1804
+ end
1805
+ if !null.nil?
1806
+ if !null
1807
+ change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} NOT NULL"
1808
+ else
1809
+ change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type}"
1810
+ end
1811
+ end
1812
+ stmt = execute(change_column_sql)
1813
+ reorg_table(table_name)
1814
+ ensure
1815
+ IBM_DB.free_result stmt if stmt
1659
1816
  end
1660
1817
 
1661
1818
  # Reorganizes the table for column changes
@@ -1675,6 +1832,11 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1675
1832
  return "datetime hour to second"
1676
1833
  end
1677
1834
 
1835
+ # This method returns the IDS SQL type corresponding to Rails double type
1836
+ def get_double_mapping
1837
+ return "double precision"
1838
+ end
1839
+
1678
1840
  # Handling offset/limit as per Informix requirements
1679
1841
  def query_offset_limit(sql, offset, limit)
1680
1842
  if limit != 0
@@ -1699,7 +1861,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
1699
1861
  # IDENTITY_VAL_LOCAL function. We used the "stmt" parameter to identify
1700
1862
  # the statement resource from which to get the last generated value
1701
1863
  def last_generated_id(stmt)
1702
- IBM_DB::get_last_serial_value(stmt)
1864
+ IBM_DB.get_last_serial_value(stmt)
1703
1865
  end
1704
1866
 
1705
1867
  # This method throws an error when trying to create a default value on a