ibm_db 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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