db2 2.6.1 → 2.6.2
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/lib/active_record/connection_adapters/ibm_db_adapter.rb +151 -150
- metadata +1 -1
@@ -12,26 +12,26 @@ require 'active_record/connection_adapters/abstract_adapter'
|
|
12
12
|
|
13
13
|
module ActiveRecord
|
14
14
|
class Base
|
15
|
-
# Method required to handle LOBs and XML fields.
|
15
|
+
# Method required to handle LOBs and XML fields.
|
16
16
|
# An after save callback checks if a marker has been inserted through
|
17
|
-
# the insert or update, and then proceeds to update that record with
|
17
|
+
# the insert or update, and then proceeds to update that record with
|
18
18
|
# the actual large object through a prepared statement (param binding).
|
19
19
|
after_save :handle_lobs
|
20
20
|
def handle_lobs()
|
21
21
|
if connection.kind_of?(ConnectionAdapters::IBM_DBAdapter)
|
22
22
|
# Checks that the insert or update had at least a BLOB, CLOB or XML field
|
23
23
|
connection.sql.each do |clob_sql|
|
24
|
-
if clob_sql =~ /BLOB\('(.*)'\)/i ||
|
25
|
-
clob_sql =~ /@@@IBMTEXT@@@/i ||
|
24
|
+
if clob_sql =~ /BLOB\('(.*)'\)/i ||
|
25
|
+
clob_sql =~ /@@@IBMTEXT@@@/i ||
|
26
26
|
clob_sql =~ /@@@IBMXML@@@/i ||
|
27
|
-
clob_sql =~ /@@@IBMBINARY@@@/i
|
27
|
+
clob_sql =~ /@@@IBMBINARY@@@/i
|
28
28
|
update_query = "UPDATE #{self.class.table_name} SET ("
|
29
29
|
counter = 0
|
30
30
|
values = []
|
31
31
|
params = []
|
32
32
|
# Selects only binary, text and xml columns
|
33
|
-
self.class.columns.select{|col| col.type == :binary ||
|
34
|
-
col.type == :
|
33
|
+
self.class.columns.select{|col| col.type == :binary ||
|
34
|
+
col.type == :text ||
|
35
35
|
col.type == :xml}.each do |col|
|
36
36
|
# Adds the selected columns to the query
|
37
37
|
if counter == 0
|
@@ -40,11 +40,11 @@ module ActiveRecord
|
|
40
40
|
update_query << ",#{col.name}"
|
41
41
|
end
|
42
42
|
|
43
|
-
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
43
|
+
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
44
44
|
# (except for a CLOB field where '' can be a value)
|
45
|
-
if self[col.name].nil? ||
|
46
|
-
self[col.name] == {} ||
|
47
|
-
(self[col.name] == '' && col.type != :
|
45
|
+
if self[col.name].nil? ||
|
46
|
+
self[col.name] == {} ||
|
47
|
+
(self[col.name] == '' && col.type != :text)
|
48
48
|
params << 'NULL'
|
49
49
|
else
|
50
50
|
values << self[col.name]
|
@@ -157,7 +157,7 @@ module ActiveRecord
|
|
157
157
|
conn_options[IBM_DB::SQL_ATTR_INFO_APPLNAME] = value
|
158
158
|
when :workstation # Set connection's workstation info
|
159
159
|
conn_options[IBM_DB::SQL_ATTR_INFO_WRKSTNNAME] = value
|
160
|
-
end
|
160
|
+
end
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
@@ -171,7 +171,7 @@ module ActiveRecord
|
|
171
171
|
# A net address connection requires a port. If no port has been specified, 50000 is used by default
|
172
172
|
port = config[:port] || 50000
|
173
173
|
# Connects to the database specified using the hostname, port, authentication type, username and password info
|
174
|
-
# Starting with DB2 9.1FP5 secure connections using SSL are supported.
|
174
|
+
# Starting with DB2 9.1FP5 secure connections using SSL are supported.
|
175
175
|
# On the client side using CLI this is supported from CLI version V95FP2 and onwards.
|
176
176
|
# This feature is set by specifying SECURITY=SSL in the connection string.
|
177
177
|
# Below connection string is constructed and SECURITY parameter is appended if the user has specified the :security option
|
@@ -185,7 +185,7 @@ module ActiveRecord
|
|
185
185
|
conn_string << "SECURITY=#{config[:security]};" if config.has_key?(:security)
|
186
186
|
conn_string << "AUTHENTICATION=#{config[:authentication]};" if config.has_key?(:authentication)
|
187
187
|
conn_string << "CONNECTTIMEOUT=#{config[:timeout]};" if config.has_key?(:timeout)
|
188
|
-
|
188
|
+
|
189
189
|
connection = IBM_DB.connect( conn_string, '', '', conn_options, set_quoted_literal_replacement )
|
190
190
|
else
|
191
191
|
# No host implies a local catalog-based connection: +database+ represents catalog alias
|
@@ -250,11 +250,13 @@ module ActiveRecord
|
|
250
250
|
:vargraphic
|
251
251
|
when /graphic/i
|
252
252
|
:graphic
|
253
|
+
when /clob|text/i
|
254
|
+
:text
|
253
255
|
when /xml/i
|
254
256
|
:xml
|
255
257
|
when /blob|binary/i
|
256
258
|
:binary
|
257
|
-
when /char
|
259
|
+
when /char/i
|
258
260
|
:string
|
259
261
|
when /boolean/i
|
260
262
|
:boolean
|
@@ -265,33 +267,33 @@ module ActiveRecord
|
|
265
267
|
end #class IBM_DBColumn
|
266
268
|
|
267
269
|
class Table
|
268
|
-
|
270
|
+
|
269
271
|
#Method to parse the passed arguments and create the ColumnDefinition object of the specified type
|
270
272
|
def ibm_parse_column_attributes_args(type, *args)
|
271
273
|
options = {}
|
272
|
-
if args.last.is_a?(Hash)
|
274
|
+
if args.last.is_a?(Hash)
|
273
275
|
options = args.delete_at(args.length-1)
|
274
276
|
end
|
275
|
-
args.each do | name |
|
277
|
+
args.each do | name |
|
276
278
|
column name,type.to_sym,options
|
277
279
|
end # end args.each
|
278
280
|
end
|
279
281
|
private :ibm_parse_column_attributes_args
|
280
|
-
|
281
|
-
#Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type xml
|
282
|
-
#This method is different as compared to def char (sql is being issued explicitly
|
282
|
+
|
283
|
+
#Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type xml
|
284
|
+
#This method is different as compared to def char (sql is being issued explicitly
|
283
285
|
#as compared to def char where method column(which will generate the sql is being called)
|
284
286
|
#in order to handle the DEFAULT and NULL option for the native XML datatype
|
285
|
-
def xml(*args )
|
287
|
+
def xml(*args )
|
286
288
|
options = {}
|
287
|
-
if args.last.is_a?(Hash)
|
289
|
+
if args.last.is_a?(Hash)
|
288
290
|
options = args.delete_at(args.length-1)
|
289
291
|
end
|
290
292
|
sql_segment = "ALTER TABLE #{@base.quote_table_name(@table_name)} ADD COLUMN "
|
291
|
-
args.each do | name |
|
293
|
+
args.each do | name |
|
292
294
|
sql = sql_segment + " #{@base.quote_column_name(name)} xml"
|
293
295
|
@base.execute(sql,"add_xml_column")
|
294
|
-
end
|
296
|
+
end
|
295
297
|
return self
|
296
298
|
end
|
297
299
|
|
@@ -331,7 +333,7 @@ module ActiveRecord
|
|
331
333
|
end
|
332
334
|
|
333
335
|
class TableDefinition
|
334
|
-
|
336
|
+
|
335
337
|
#Method to parse the passed arguments and create the ColumnDefinition object of the specified type
|
336
338
|
def ibm_parse_column_attributes_args(type, *args)
|
337
339
|
options = {}
|
@@ -344,7 +346,7 @@ module ActiveRecord
|
|
344
346
|
end
|
345
347
|
private :ibm_parse_column_attributes_args
|
346
348
|
|
347
|
-
#Method to support the new syntax of rails 2.0 migrations for columns of type xml
|
349
|
+
#Method to support the new syntax of rails 2.0 migrations for columns of type xml
|
348
350
|
def xml(*args )
|
349
351
|
ibm_parse_column_attributes_args('xml', *args)
|
350
352
|
return self
|
@@ -388,7 +390,7 @@ module ActiveRecord
|
|
388
390
|
# The IBM_DB Adapter requires the native Ruby driver (ibm_db)
|
389
391
|
# for IBM data servers (ibm_db.so).
|
390
392
|
# +config+ the hash passed as an initializer argument content:
|
391
|
-
# == mandatory parameters
|
393
|
+
# == mandatory parameters
|
392
394
|
# adapter: 'ibm_db' // IBM_DB Adapter name
|
393
395
|
# username: 'db2user' // data server (database) user
|
394
396
|
# password: 'secret' // data server (database) password
|
@@ -404,17 +406,17 @@ module ActiveRecord
|
|
404
406
|
# port: '50000' // data server TCP/IP port number
|
405
407
|
# security: 'SSL' // optional parameter enabling SSL encryption -
|
406
408
|
# // - Available only from CLI version V95fp2 and above
|
407
|
-
# authentication: 'SERVER' // AUTHENTICATION type which the client uses -
|
409
|
+
# authentication: 'SERVER' // AUTHENTICATION type which the client uses -
|
408
410
|
# // - to connect to the database server. By default value is SERVER
|
409
411
|
# timeout: 10 // Specifies the time in seconds (0 - 32767) to wait for a reply from server -
|
410
412
|
# //- when trying to establish a connection before generating a timeout
|
411
413
|
# == Parameterized Queries Support
|
412
|
-
# parameterized: false // Specifies if the prepared statement support of
|
414
|
+
# parameterized: false // Specifies if the prepared statement support of
|
413
415
|
# //- the IBM_DB Adapter is to be turned on or off
|
414
|
-
#
|
416
|
+
#
|
415
417
|
# When schema is not specified, the username value is used instead.
|
416
418
|
# The default setting of parameterized is false.
|
417
|
-
#
|
419
|
+
#
|
418
420
|
class IBM_DBAdapter < AbstractAdapter
|
419
421
|
attr_reader :connection, :servertype
|
420
422
|
attr_accessor :sql,:handle_lobs_triggered, :sql_parameter_values
|
@@ -449,14 +451,14 @@ module ActiveRecord
|
|
449
451
|
@pstmt_support_on = false
|
450
452
|
@set_quoted_literal_replacement = IBM_DB::QUOTED_LITERAL_REPLACEMENT_ON
|
451
453
|
end
|
452
|
-
|
454
|
+
|
453
455
|
@app_user = @account = @application = @workstation = nil
|
454
456
|
# Caching database connection options (auditing and billing support)
|
455
457
|
@app_user = conn_options[:app_user] if conn_options.has_key?(:app_user)
|
456
458
|
@account = conn_options[:account] if conn_options.has_key?(:account)
|
457
459
|
@application = conn_options[:application] if conn_options.has_key?(:application)
|
458
460
|
@workstation = conn_options[:workstation] if conn_options.has_key?(:workstation)
|
459
|
-
|
461
|
+
|
460
462
|
@sql = []
|
461
463
|
@sql_parameter_values = [] #Used only if pstmt support is turned on
|
462
464
|
|
@@ -571,7 +573,7 @@ module ActiveRecord
|
|
571
573
|
end
|
572
574
|
|
573
575
|
# This Adapter supports DDL transactions.
|
574
|
-
# This means CREATE TABLE and other DDL statements can be carried out as a transaction.
|
576
|
+
# This means CREATE TABLE and other DDL statements can be carried out as a transaction.
|
575
577
|
# That is the statements executed can be ROLLED BACK in case of any error during the process.
|
576
578
|
def supports_ddl_transactions?
|
577
579
|
true
|
@@ -649,9 +651,9 @@ module ActiveRecord
|
|
649
651
|
def create_table(name, options = {})
|
650
652
|
@servertype.setup_for_lob_table
|
651
653
|
super
|
652
|
-
|
654
|
+
|
653
655
|
#Table definition is complete only when a unique index is created on the primarykey column for DB2 V8 on zOS
|
654
|
-
|
656
|
+
|
655
657
|
#create index on id column if options[:id] is nil or id ==true
|
656
658
|
#else check if options[:primary_key]is not nil then create an unique index on that column
|
657
659
|
if !options[:id].nil? || !options[:primary_key].nil?
|
@@ -662,11 +664,11 @@ module ActiveRecord
|
|
662
664
|
end
|
663
665
|
else
|
664
666
|
@servertype.create_index_after_table(name,"id")
|
665
|
-
end
|
667
|
+
end
|
666
668
|
end
|
667
669
|
|
668
670
|
# Returns an array of hashes with the column names as keys and
|
669
|
-
# column values as values. +sql+ is the select query,
|
671
|
+
# column values as values. +sql+ is the select query,
|
670
672
|
# and +name+ is an optional description for logging
|
671
673
|
def prepared_select(sql_param_hash, name = nil)
|
672
674
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
@@ -697,7 +699,7 @@ module ActiveRecord
|
|
697
699
|
end
|
698
700
|
|
699
701
|
# Returns an array of hashes with the column names as keys and
|
700
|
-
# column values as values. +sql+ is the select query,
|
702
|
+
# column values as values. +sql+ is the select query,
|
701
703
|
# and +name+ is an optional description for logging
|
702
704
|
def prepared_select_values(sql_param_hash, name = nil)
|
703
705
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
@@ -733,12 +735,12 @@ module ActiveRecord
|
|
733
735
|
end
|
734
736
|
|
735
737
|
# Returns an array of hashes with the column names as keys and
|
736
|
-
# column values as values. +sql+ is the select query,
|
738
|
+
# column values as values. +sql+ is the select query,
|
737
739
|
# and +name+ is an optional description for logging
|
738
740
|
def select(sql, name = nil)
|
739
741
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
740
742
|
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
741
|
-
|
743
|
+
|
742
744
|
results = []
|
743
745
|
# Invokes the method +execute+ in order to log and execute the SQL
|
744
746
|
# IBM_DB.Statement is returned from which results can be fetched
|
@@ -770,7 +772,7 @@ module ActiveRecord
|
|
770
772
|
def select_rows(sql, name = nil)
|
771
773
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
772
774
|
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
773
|
-
|
775
|
+
|
774
776
|
results = []
|
775
777
|
# Invokes the method +execute+ in order to log and execute the SQL
|
776
778
|
# IBM_DB.Statement is returned from which results can be fetched
|
@@ -824,25 +826,25 @@ module ActiveRecord
|
|
824
826
|
break
|
825
827
|
end
|
826
828
|
end
|
827
|
-
if item.at(1).nil? ||
|
828
|
-
item.at(1) == {} ||
|
829
|
-
(item.at(1) == '' && !(col.type.to_sym == :
|
830
|
-
|
829
|
+
if item.at(1).nil? ||
|
830
|
+
item.at(1) == {} ||
|
831
|
+
(item.at(1) == '' && !(col.type.to_sym == :text))
|
832
|
+
|
831
833
|
params << 'NULL'
|
832
|
-
|
834
|
+
|
833
835
|
elsif col.type.to_sym == :xml ||
|
834
|
-
col.type.to_sym == :
|
835
|
-
col.type.to_sym == :binary
|
836
|
-
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
836
|
+
col.type.to_sym == :text ||
|
837
|
+
col.type.to_sym == :binary
|
838
|
+
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
837
839
|
# (except for a CLOB field where '' can be a value)
|
838
840
|
insert_values << item.at(1)
|
839
841
|
params << '?'
|
840
842
|
else
|
841
843
|
insert_values << quote(item.at(1),col)
|
842
844
|
params << '?'
|
843
|
-
end
|
845
|
+
end
|
844
846
|
end
|
845
|
-
|
847
|
+
|
846
848
|
insert_query << " VALUES ("+ params.join(',') + ")"
|
847
849
|
unless stmt = IBM_DB.prepare(@connection, insert_query)
|
848
850
|
error_msg = IBM_DB.getErrormsg( @connection, IBM_DB::DB_CONN )
|
@@ -852,7 +854,7 @@ module ActiveRecord
|
|
852
854
|
raise StandardError.new('An unexpected error occurred during preparing SQL for fixture insert')
|
853
855
|
end
|
854
856
|
end
|
855
|
-
|
857
|
+
|
856
858
|
#log_query(insert_query,'fixture insert')
|
857
859
|
log(insert_query,'fixture insert') do
|
858
860
|
unless IBM_DB.execute(stmt, insert_values)
|
@@ -964,7 +966,7 @@ module ActiveRecord
|
|
964
966
|
end
|
965
967
|
|
966
968
|
clear_query_cache if defined? clear_query_cache
|
967
|
-
|
969
|
+
|
968
970
|
# Make sure the WHERE clause handles NULL's correctly
|
969
971
|
sqlarray = sql.split(/\s*WHERE\s*/)
|
970
972
|
size = sqlarray.size
|
@@ -1141,7 +1143,7 @@ module ActiveRecord
|
|
1141
1143
|
"'#{value}'"
|
1142
1144
|
else
|
1143
1145
|
"#{value}"
|
1144
|
-
end
|
1146
|
+
end
|
1145
1147
|
else
|
1146
1148
|
# value is Numeric, column.type is not a string,
|
1147
1149
|
# therefore it converts the number to string without quoting it
|
@@ -1157,7 +1159,7 @@ module ActiveRecord
|
|
1157
1159
|
# Quoting required for the default value of a column
|
1158
1160
|
@servertype.set_binary_default(value)
|
1159
1161
|
end
|
1160
|
-
elsif column && column.type.to_sym == :
|
1162
|
+
elsif column && column.type.to_sym == :text
|
1161
1163
|
unless caller[0] =~ /add_column_options/i
|
1162
1164
|
"'@@@IBMTEXT@@@'"
|
1163
1165
|
else
|
@@ -1174,7 +1176,7 @@ module ActiveRecord
|
|
1174
1176
|
"'#{quote_string(value)}'"
|
1175
1177
|
else
|
1176
1178
|
"#{value}"
|
1177
|
-
end
|
1179
|
+
end
|
1178
1180
|
end
|
1179
1181
|
when TrueClass then quoted_true # return '1' for true
|
1180
1182
|
when FalseClass then quoted_false # return '0' for false
|
@@ -1212,8 +1214,7 @@ module ActiveRecord
|
|
1212
1214
|
{
|
1213
1215
|
:primary_key => { :name => @servertype.primary_key_definition(@start_id)},
|
1214
1216
|
:string => { :name => "varchar", :limit => 255 },
|
1215
|
-
:text => { :name => "
|
1216
|
-
:clob => { :name => "clob" },
|
1217
|
+
:text => { :name => "clob" },
|
1217
1218
|
:integer => { :name => "integer" },
|
1218
1219
|
:float => { :name => "float" },
|
1219
1220
|
:datetime => { :name => @servertype.get_datetime_mapping },
|
@@ -1247,7 +1248,7 @@ module ActiveRecord
|
|
1247
1248
|
sql_segment << "(#{precision})" if !precision.nil?
|
1248
1249
|
return sql_segment
|
1249
1250
|
end
|
1250
|
-
|
1251
|
+
|
1251
1252
|
return super if limit.nil?
|
1252
1253
|
|
1253
1254
|
# strip off limits on data types not supporting them
|
@@ -1258,7 +1259,7 @@ module ActiveRecord
|
|
1258
1259
|
else
|
1259
1260
|
return super
|
1260
1261
|
end
|
1261
|
-
end
|
1262
|
+
end
|
1262
1263
|
|
1263
1264
|
# Returns the maximum length a table alias identifier can be.
|
1264
1265
|
# IBM data servers (cross-platform) table limit is 128 characters
|
@@ -1306,10 +1307,10 @@ module ActiveRecord
|
|
1306
1307
|
# Returns the primary key of the mentioned table
|
1307
1308
|
def primary_key(table_name)
|
1308
1309
|
pk_name = nil
|
1309
|
-
stmt = IBM_DB.primary_keys( @connection, nil,
|
1310
|
-
@servertype.set_case(@schema),
|
1310
|
+
stmt = IBM_DB.primary_keys( @connection, nil,
|
1311
|
+
@servertype.set_case(@schema),
|
1311
1312
|
@servertype.set_case(table_name))
|
1312
|
-
if(stmt)
|
1313
|
+
if(stmt)
|
1313
1314
|
begin
|
1314
1315
|
if ( pk_index_row = IBM_DB.fetch_array(stmt) )
|
1315
1316
|
pk_name = pk_index_row[3].downcase
|
@@ -1348,27 +1349,27 @@ module ActiveRecord
|
|
1348
1349
|
indexes = []
|
1349
1350
|
pk_index = nil
|
1350
1351
|
index_schema = []
|
1351
|
-
|
1352
|
+
|
1352
1353
|
#fetch the primary keys of the table using function primary_keys
|
1353
1354
|
#TABLE_SCHEM:: pk_index[1]
|
1354
1355
|
#TABLE_NAME:: pk_index[2]
|
1355
1356
|
#COLUMN_NAME:: pk_index[3]
|
1356
1357
|
#PK_NAME:: pk_index[5]
|
1357
|
-
stmt = IBM_DB.primary_keys( @connection, nil,
|
1358
|
-
@servertype.set_case(@schema),
|
1358
|
+
stmt = IBM_DB.primary_keys( @connection, nil,
|
1359
|
+
@servertype.set_case(@schema),
|
1359
1360
|
@servertype.set_case(table_name))
|
1360
1361
|
if(stmt)
|
1361
1362
|
begin
|
1362
1363
|
while ( pk_index_row = IBM_DB.fetch_array(stmt) )
|
1363
|
-
if pk_index_row[5]
|
1364
|
+
if pk_index_row[5]
|
1364
1365
|
pk_index_name = pk_index_row[5].downcase
|
1365
1366
|
pk_index_columns = [pk_index_row[3].downcase] # COLUMN_NAME
|
1366
|
-
if pk_index
|
1367
|
+
if pk_index
|
1367
1368
|
pk_index.columns = pk_index.columns + pk_index_columns
|
1368
1369
|
else
|
1369
1370
|
pk_index = IndexDefinition.new(table_name, pk_index_name, true, pk_index_columns)
|
1370
1371
|
end
|
1371
|
-
end
|
1372
|
+
end
|
1372
1373
|
end
|
1373
1374
|
rescue StandardError => fetch_error # Handle driver fetch errors
|
1374
1375
|
error_msg = IBM_DB.getErrormsg(stmt, IBM_DB::DB_STMT )
|
@@ -1396,8 +1397,8 @@ module ActiveRecord
|
|
1396
1397
|
# "NON_UNIQUE: #{index_stats[3]}"
|
1397
1398
|
# "INDEX_NAME: #{index_stats[5]}"
|
1398
1399
|
# "COLUMN_NAME: #{index_stats[8]}"
|
1399
|
-
stmt = IBM_DB.statistics( @connection, nil,
|
1400
|
-
@servertype.set_case(@schema),
|
1400
|
+
stmt = IBM_DB.statistics( @connection, nil,
|
1401
|
+
@servertype.set_case(@schema),
|
1401
1402
|
@servertype.set_case(table_name), 1 )
|
1402
1403
|
if(stmt)
|
1403
1404
|
begin
|
@@ -1414,14 +1415,14 @@ module ActiveRecord
|
|
1414
1415
|
if index.name == index_name && index_schema[i] == index_qualifier
|
1415
1416
|
index.columns = index.columns + index_columns
|
1416
1417
|
is_composite = true
|
1417
|
-
end
|
1418
|
+
end
|
1418
1419
|
i = i+1
|
1419
1420
|
end
|
1420
|
-
|
1421
|
-
unless is_composite
|
1421
|
+
|
1422
|
+
unless is_composite
|
1422
1423
|
indexes << IndexDefinition.new(table_name, index_name, index_unique, index_columns)
|
1423
1424
|
index_schema << index_qualifier
|
1424
|
-
end
|
1425
|
+
end
|
1425
1426
|
end
|
1426
1427
|
end
|
1427
1428
|
rescue StandardError => fetch_error # Handle driver fetch errors
|
@@ -1444,16 +1445,16 @@ module ActiveRecord
|
|
1444
1445
|
raise StandardError.new('An unexpected error occurred during index retrieval')
|
1445
1446
|
end
|
1446
1447
|
end
|
1447
|
-
|
1448
|
+
|
1448
1449
|
# remove the primary key index entry.... should not be dumped by the dumper
|
1449
|
-
|
1450
|
+
|
1450
1451
|
i = 0
|
1451
1452
|
indexes.each do |index|
|
1452
1453
|
if pk_index && index.columns == pk_index.columns
|
1453
1454
|
indexes.delete_at(i)
|
1454
1455
|
end
|
1455
1456
|
i = i+1
|
1456
|
-
end
|
1457
|
+
end
|
1457
1458
|
# Returns the indexes array
|
1458
1459
|
return indexes
|
1459
1460
|
end
|
@@ -1468,8 +1469,8 @@ module ActiveRecord
|
|
1468
1469
|
# +columns+ will contain the resulting array
|
1469
1470
|
columns = []
|
1470
1471
|
# Statement required to access all the columns information
|
1471
|
-
stmt = IBM_DB.columns( @connection, nil,
|
1472
|
-
@servertype.set_case(@schema),
|
1472
|
+
stmt = IBM_DB.columns( @connection, nil,
|
1473
|
+
@servertype.set_case(@schema),
|
1473
1474
|
@servertype.set_case(table_name) )
|
1474
1475
|
if(stmt)
|
1475
1476
|
begin
|
@@ -1488,13 +1489,13 @@ module ActiveRecord
|
|
1488
1489
|
# Assigns the field length (size) for the column
|
1489
1490
|
column_length = col["column_size"]
|
1490
1491
|
column_scale = col["decimal_digits"]
|
1491
|
-
# The initializer of the class Column, requires the +column_length+ to be declared
|
1492
|
-
# between brackets after the datatype(e.g VARCHAR(50)) for :string and :text types.
|
1492
|
+
# The initializer of the class Column, requires the +column_length+ to be declared
|
1493
|
+
# between brackets after the datatype(e.g VARCHAR(50)) for :string and :text types.
|
1493
1494
|
# If it's a "for bit data" field it does a subsitution in place, if not
|
1494
1495
|
# it appends the (column_length) string on the supported data types
|
1495
|
-
unless column_length.nil? ||
|
1496
|
-
column_length == '' ||
|
1497
|
-
column_type.sub!(/ \(\) for bit data/i,"(#{column_length}) FOR BIT DATA") ||
|
1496
|
+
unless column_length.nil? ||
|
1497
|
+
column_length == '' ||
|
1498
|
+
column_type.sub!(/ \(\) for bit data/i,"(#{column_length}) FOR BIT DATA") ||
|
1498
1499
|
!column_type =~ /char|lob|graphic/i
|
1499
1500
|
if column_type =~ /decimal/i
|
1500
1501
|
column_type << "(#{column_length},#{column_scale})"
|
@@ -1577,25 +1578,25 @@ module ActiveRecord
|
|
1577
1578
|
#overrides the abstract adapter method to generate proper sql
|
1578
1579
|
#specifying the column options, like default value and nullability clause
|
1579
1580
|
def add_column_options!(sql,options={})
|
1580
|
-
#add default null option only if :default option is not specified and
|
1581
|
+
#add default null option only if :default option is not specified and
|
1581
1582
|
#:null option is not specified or is true
|
1582
1583
|
if (options[:default].nil? && (options[:null].nil? || options[:null] == true))
|
1583
1584
|
sql << " DEFAULT NULL"
|
1584
|
-
else
|
1585
|
+
else
|
1585
1586
|
if( !options[:default].nil?)
|
1586
1587
|
#check, :column option is passed only in case of create_table but not in case of add_column
|
1587
|
-
if (!options[:column].nil?)
|
1588
|
+
if (!options[:column].nil?)
|
1588
1589
|
sql << " DEFAULT #{quote(options[:default],options[:column])}"
|
1589
1590
|
else
|
1590
|
-
sql << " DEFAULT #{quote(options[:default])}"
|
1591
|
-
end
|
1592
|
-
end
|
1591
|
+
sql << " DEFAULT #{quote(options[:default])}"
|
1592
|
+
end
|
1593
|
+
end
|
1593
1594
|
#append NOT NULL to sql only---
|
1594
1595
|
#---if options[:null] is not nil and is equal to false
|
1595
|
-
unless options[:null] == nil
|
1596
|
+
unless options[:null] == nil
|
1596
1597
|
sql << " NOT NULL" if (options[:null] == false)
|
1597
1598
|
end
|
1598
|
-
end
|
1599
|
+
end
|
1599
1600
|
end
|
1600
1601
|
=end
|
1601
1602
|
|
@@ -1664,7 +1665,7 @@ module ActiveRecord
|
|
1664
1665
|
rescue StandardError => exec_err
|
1665
1666
|
# Provide details on the current XML columns support
|
1666
1667
|
if exec_err.message.include?('SQLCODE=-1242') && exec_err.message.include?('42997')
|
1667
|
-
raise StatementInvalid,
|
1668
|
+
raise StatementInvalid,
|
1668
1669
|
"A column that is part of a table containing an XML column cannot be dropped. \
|
1669
1670
|
To remove the column, the table must be dropped and recreated without the #{column_name} column: #{exec_err}"
|
1670
1671
|
else
|
@@ -1727,7 +1728,7 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1727
1728
|
rescue StandardError => prep_err
|
1728
1729
|
if prep_err && !prep_err.message.empty?
|
1729
1730
|
raise "Failed to prepare sql #{sql} due to: #{prep_err}"
|
1730
|
-
else
|
1731
|
+
else
|
1731
1732
|
raise
|
1732
1733
|
end
|
1733
1734
|
end
|
@@ -1743,7 +1744,7 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1743
1744
|
rescue StandardError => exec_err
|
1744
1745
|
if exec_err && !exec_err.message.empty?
|
1745
1746
|
raise "Failed to execute statement due to: #{exec_err}"
|
1746
|
-
else
|
1747
|
+
else
|
1747
1748
|
raise
|
1748
1749
|
end
|
1749
1750
|
end
|
@@ -1758,7 +1759,7 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1758
1759
|
|
1759
1760
|
def query_offset_limit!(sql, offset, limit, options)
|
1760
1761
|
end
|
1761
|
-
|
1762
|
+
|
1762
1763
|
def get_datetime_mapping
|
1763
1764
|
end
|
1764
1765
|
|
@@ -1767,13 +1768,13 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1767
1768
|
|
1768
1769
|
def get_double_mapping
|
1769
1770
|
end
|
1770
|
-
|
1771
|
+
|
1771
1772
|
def change_column_default(table_name, column_name, default)
|
1772
1773
|
end
|
1773
1774
|
|
1774
1775
|
def change_column_null(table_name, column_name, null, default)
|
1775
1776
|
end
|
1776
|
-
|
1777
|
+
|
1777
1778
|
def set_binary_default(value)
|
1778
1779
|
end
|
1779
1780
|
|
@@ -1857,7 +1858,7 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
1857
1858
|
execute "ALTER TABLE #{table_name} ALTER #{column_name} SET DATA TYPE #{data_type}"
|
1858
1859
|
rescue StandardError => exec_err
|
1859
1860
|
if exec_err.message.include?('SQLCODE=-190')
|
1860
|
-
raise StatementInvalid,
|
1861
|
+
raise StatementInvalid,
|
1861
1862
|
"Please consult documentation for compatible data types while changing column datatype. \
|
1862
1863
|
The column datatype change to [#{data_type}] is not supported by this data server: #{exec_err}"
|
1863
1864
|
else
|
@@ -1886,9 +1887,9 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
1886
1887
|
def change_column_null(table_name, column_name, null, default)
|
1887
1888
|
if !default.nil?
|
1888
1889
|
change_column_default(table_name, column_name, default)
|
1889
|
-
end
|
1890
|
+
end
|
1890
1891
|
|
1891
|
-
if !null.nil?
|
1892
|
+
if !null.nil?
|
1892
1893
|
if null
|
1893
1894
|
change_column_sql = "ALTER TABLE #{table_name} ALTER #{column_name} DROP NOT NULL"
|
1894
1895
|
else
|
@@ -1899,9 +1900,9 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
1899
1900
|
end
|
1900
1901
|
|
1901
1902
|
ensure
|
1902
|
-
IBM_DB.free_stmt(stmt) if stmt
|
1903
|
+
IBM_DB.free_stmt(stmt) if stmt
|
1903
1904
|
end
|
1904
|
-
|
1905
|
+
|
1905
1906
|
# This method returns the DB2 SQL type corresponding to the Rails
|
1906
1907
|
# datetime/timestamp type
|
1907
1908
|
def get_datetime_mapping
|
@@ -1940,13 +1941,13 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
1940
1941
|
index = index + 1
|
1941
1942
|
else
|
1942
1943
|
# break from the while loop
|
1943
|
-
break
|
1944
|
+
break
|
1944
1945
|
end
|
1945
1946
|
end
|
1946
1947
|
else # cursor != IBM_DB::SQL_CURSOR_STATIC
|
1947
1948
|
# If the result set contains a LOB, the cursor type will never be SQL_CURSOR_STATIC
|
1948
|
-
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
1949
|
-
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
1949
|
+
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
1950
|
+
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
1950
1951
|
# at @offset to @offset + @limit
|
1951
1952
|
index = 0
|
1952
1953
|
while (index < @offset + @limit)
|
@@ -2010,13 +2011,13 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2010
2011
|
index = index + 1
|
2011
2012
|
else
|
2012
2013
|
# break from the while loop
|
2013
|
-
break
|
2014
|
+
break
|
2014
2015
|
end
|
2015
2016
|
end
|
2016
2017
|
else # cursor != IBM_DB::SQL_CURSOR_STATIC
|
2017
2018
|
# If the result set contains a LOB, the cursor type will never be SQL_CURSOR_STATIC
|
2018
|
-
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
2019
|
-
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
2019
|
+
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
2020
|
+
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
2020
2021
|
# at @offset to @offset + @limit
|
2021
2022
|
index = 0
|
2022
2023
|
while (index < @offset + @limit)
|
@@ -2066,7 +2067,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2066
2067
|
begin
|
2067
2068
|
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2068
2069
|
# Set the cursor type to static so we can later utilize the offset and limit correctly
|
2069
|
-
if stmt = IBM_DB.prepare(@adapter.connection, sql,
|
2070
|
+
if stmt = IBM_DB.prepare(@adapter.connection, sql,
|
2070
2071
|
{IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
|
2071
2072
|
stmt # Return the statement object
|
2072
2073
|
else
|
@@ -2081,7 +2082,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2081
2082
|
end
|
2082
2083
|
rescue StandardError => prep_err
|
2083
2084
|
error_msg = "Failed to prepare sql #{sql}"
|
2084
|
-
error_msg = error_msg + ": #{prep_err.message}" if !prep_err.message.empty?
|
2085
|
+
error_msg = error_msg + ": #{prep_err.message}" if !prep_err.message.empty?
|
2085
2086
|
raise error_msg
|
2086
2087
|
end
|
2087
2088
|
end
|
@@ -2093,7 +2094,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2093
2094
|
begin
|
2094
2095
|
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2095
2096
|
# Set the cursor type to static so we can later utilize the offset and limit correctly
|
2096
|
-
if stmt = IBM_DB.exec(@adapter.connection, sql,
|
2097
|
+
if stmt = IBM_DB.exec(@adapter.connection, sql,
|
2097
2098
|
{IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
|
2098
2099
|
stmt # Return the statement object
|
2099
2100
|
else
|
@@ -2108,7 +2109,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2108
2109
|
end
|
2109
2110
|
rescue StandardError => exec_err
|
2110
2111
|
error_msg = "Failed to execute statement"
|
2111
|
-
error_msg = error_msg + ": #{exec_err.message}" if !exec_err.message.empty?
|
2112
|
+
error_msg = error_msg + ": #{exec_err.message}" if !exec_err.message.empty?
|
2112
2113
|
raise error_msg
|
2113
2114
|
end
|
2114
2115
|
end
|
@@ -2130,7 +2131,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2130
2131
|
options[:paramArray] = []
|
2131
2132
|
end
|
2132
2133
|
|
2133
|
-
# This method generates the default blob value specified for
|
2134
|
+
# This method generates the default blob value specified for
|
2134
2135
|
# DB2 Dataservers
|
2135
2136
|
def set_binary_default(value)
|
2136
2137
|
"BLOB('#{value}')"
|
@@ -2138,10 +2139,10 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2138
2139
|
|
2139
2140
|
# This method generates the blob value specified for DB2 Dataservers
|
2140
2141
|
def set_binary_value
|
2141
|
-
"BLOB('?')"
|
2142
|
+
"BLOB('?')"
|
2142
2143
|
end
|
2143
2144
|
|
2144
|
-
# This method generates the default clob value specified for
|
2145
|
+
# This method generates the default clob value specified for
|
2145
2146
|
# DB2 Dataservers
|
2146
2147
|
def set_text_default(value)
|
2147
2148
|
"'#{value}'"
|
@@ -2196,7 +2197,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2196
2197
|
end # class IBM_DB2_LUW
|
2197
2198
|
|
2198
2199
|
class IBM_DB2_LUW_COBRA < IBM_DB2_LUW
|
2199
|
-
# Cobra supports parameterised timestamp,
|
2200
|
+
# Cobra supports parameterised timestamp,
|
2200
2201
|
# hence overriding following method to allow timestamp datatype to be parameterised
|
2201
2202
|
def limit_not_supported_types
|
2202
2203
|
[:integer, :double, :date, :time, :xml, :bigint]
|
@@ -2210,8 +2211,8 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2210
2211
|
_new_column_name = new_column_name.to_s
|
2211
2212
|
|
2212
2213
|
nil_condition = _table_name.nil? || _column_name.nil? || _new_column_name.nil?
|
2213
|
-
empty_condition = _table_name.empty? ||
|
2214
|
-
_column_name.empty? ||
|
2214
|
+
empty_condition = _table_name.empty? ||
|
2215
|
+
_column_name.empty? ||
|
2215
2216
|
_new_column_name.empty? unless nil_condition
|
2216
2217
|
|
2217
2218
|
if nil_condition || empty_condition
|
@@ -2258,15 +2259,15 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2258
2259
|
end # module HostedDataServer
|
2259
2260
|
|
2260
2261
|
class IBM_DB2_ZOS < IBM_DB2
|
2261
|
-
# since v9 doesn't need, suggest putting it in HostedDataServer?
|
2262
|
+
# since v9 doesn't need, suggest putting it in HostedDataServer?
|
2262
2263
|
def create_index_after_table(table_name,column_name)
|
2263
|
-
@adapter.add_index(table_name, column_name, :unique => true)
|
2264
|
+
@adapter.add_index(table_name, column_name, :unique => true)
|
2264
2265
|
end
|
2265
2266
|
|
2266
2267
|
def remove_column(table_name, column_name)
|
2267
2268
|
raise NotImplementedError,
|
2268
2269
|
"remove_column is not supported by the DB2 for zOS data server"
|
2269
|
-
end
|
2270
|
+
end
|
2270
2271
|
|
2271
2272
|
#Alter table column for renaming a column
|
2272
2273
|
def rename_column(table_name, column_name, new_column_name)
|
@@ -2275,8 +2276,8 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2275
2276
|
_new_column_name = new_column_name.to_s
|
2276
2277
|
|
2277
2278
|
nil_condition = _table_name.nil? || _column_name.nil? || _new_column_name.nil?
|
2278
|
-
empty_condition = _table_name.empty? ||
|
2279
|
-
_column_name.empty? ||
|
2279
|
+
empty_condition = _table_name.empty? ||
|
2280
|
+
_column_name.empty? ||
|
2280
2281
|
_new_column_name.empty? unless nil_condition
|
2281
2282
|
|
2282
2283
|
if nil_condition || empty_condition
|
@@ -2303,7 +2304,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2303
2304
|
end #End of begin
|
2304
2305
|
end # End of rename_column
|
2305
2306
|
|
2306
|
-
# DB2 z/OS only allows NULL or "" (empty) string as DEFAULT value for a BLOB column.
|
2307
|
+
# DB2 z/OS only allows NULL or "" (empty) string as DEFAULT value for a BLOB column.
|
2307
2308
|
# For non-empty string and non-NULL values, the server returns error
|
2308
2309
|
def set_binary_default(value)
|
2309
2310
|
"#{value}"
|
@@ -2343,9 +2344,9 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2343
2344
|
raise NotImplementedError,
|
2344
2345
|
"DB2 for zOS data server version 8 does not support changing the column default"
|
2345
2346
|
end
|
2346
|
-
|
2347
|
+
|
2347
2348
|
end # class IBM_DB2_ZOS_8
|
2348
|
-
|
2349
|
+
|
2349
2350
|
class IBM_DB2_I5 < IBM_DB2
|
2350
2351
|
include HostedDataServer
|
2351
2352
|
end # class IBM_DB2_I5
|
@@ -2362,8 +2363,8 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2362
2363
|
_new_column_name = new_column_name.to_s
|
2363
2364
|
|
2364
2365
|
nil_condition = _table_name.nil? || _column_name.nil? || _new_column_name.nil?
|
2365
|
-
empty_condition = _table_name.empty? ||
|
2366
|
-
_column_name.empty? ||
|
2366
|
+
empty_condition = _table_name.empty? ||
|
2367
|
+
_column_name.empty? ||
|
2367
2368
|
_new_column_name.empty? unless nil_condition
|
2368
2369
|
|
2369
2370
|
if nil_condition || empty_condition
|
@@ -2398,8 +2399,8 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2398
2399
|
if !options[:null].nil? && !options[:null]
|
2399
2400
|
execute "ALTER TABLE #{table_name} MODIFY #{column_name} #{@adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])} NOT NULL"
|
2400
2401
|
else
|
2401
|
-
execute "ALTER TABLE #{table_name} MODIFY #{column_name} #{@adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
2402
|
-
end
|
2402
|
+
execute "ALTER TABLE #{table_name} MODIFY #{column_name} #{@adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
2403
|
+
end
|
2403
2404
|
if !options[:default].nil?
|
2404
2405
|
change_column_default(table_name, column_name, options[:default])
|
2405
2406
|
end
|
@@ -2407,20 +2408,20 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2407
2408
|
end
|
2408
2409
|
|
2409
2410
|
# IDS specific ALTER TABLE statement to add a default clause
|
2410
|
-
# IDS requires the data type to be explicitly specified when adding the
|
2411
|
+
# IDS requires the data type to be explicitly specified when adding the
|
2411
2412
|
# DEFAULT clause
|
2412
2413
|
def change_column_default(table_name, column_name, default)
|
2413
2414
|
sql_type = nil
|
2414
2415
|
is_nullable = true
|
2415
|
-
@adapter.columns(table_name).select do |col|
|
2416
|
+
@adapter.columns(table_name).select do |col|
|
2416
2417
|
if (col.name == column_name)
|
2417
2418
|
sql_type = @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
|
2418
|
-
is_nullable = col.null
|
2419
|
+
is_nullable = col.null
|
2419
2420
|
end
|
2420
2421
|
end
|
2421
2422
|
# SQL statement which alters column's default value
|
2422
2423
|
change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} DEFAULT #{@adapter.quote(default)}"
|
2423
|
-
change_column_sql << " NOT NULL" unless is_nullable
|
2424
|
+
change_column_sql << " NOT NULL" unless is_nullable
|
2424
2425
|
stmt = execute(change_column_sql)
|
2425
2426
|
reorg_table(table_name)
|
2426
2427
|
# Ensures to free the resources associated with the statement
|
@@ -2434,7 +2435,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2434
2435
|
change_column_default table_name, column_name, default
|
2435
2436
|
end
|
2436
2437
|
sql_type = nil
|
2437
|
-
@adapter.columns(table_name).select do |col|
|
2438
|
+
@adapter.columns(table_name).select do |col|
|
2438
2439
|
if (col.name == column_name)
|
2439
2440
|
sql_type = @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
|
2440
2441
|
end
|
@@ -2443,7 +2444,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2443
2444
|
if !null
|
2444
2445
|
change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} NOT NULL"
|
2445
2446
|
else
|
2446
|
-
change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type}"
|
2447
|
+
change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type}"
|
2447
2448
|
end
|
2448
2449
|
stmt = execute(change_column_sql)
|
2449
2450
|
reorg_table(table_name)
|
@@ -2510,17 +2511,17 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2510
2511
|
end
|
2511
2512
|
|
2512
2513
|
# Method that returns the last automatically generated ID
|
2513
|
-
# on the given +@connection+. This method is required by the +insert+
|
2514
|
-
# method. IDS returns the last generated serial value in the SQLCA unlike
|
2515
|
-
# DB2 where the generated value has to be retrieved using the
|
2516
|
-
# IDENTITY_VAL_LOCAL function. We used the "stmt" parameter to identify
|
2514
|
+
# on the given +@connection+. This method is required by the +insert+
|
2515
|
+
# method. IDS returns the last generated serial value in the SQLCA unlike
|
2516
|
+
# DB2 where the generated value has to be retrieved using the
|
2517
|
+
# IDENTITY_VAL_LOCAL function. We used the "stmt" parameter to identify
|
2517
2518
|
# the statement resource from which to get the last generated value
|
2518
2519
|
def last_generated_id(stmt)
|
2519
2520
|
IBM_DB.get_last_serial_value(stmt)
|
2520
2521
|
end
|
2521
2522
|
|
2522
|
-
# This method throws an error when trying to create a default value on a
|
2523
|
-
# BLOB/CLOB column for IDS. The documentation states: "if the column is a
|
2523
|
+
# This method throws an error when trying to create a default value on a
|
2524
|
+
# BLOB/CLOB column for IDS. The documentation states: "if the column is a
|
2524
2525
|
# BLOB or CLOB datatype, NULL is the only valid default value."
|
2525
2526
|
def set_binary_default(value)
|
2526
2527
|
unless (value == 'NULL')
|
@@ -2528,15 +2529,15 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2528
2529
|
end
|
2529
2530
|
end
|
2530
2531
|
|
2531
|
-
# For Informix Dynamic Server, we treat binary value same as we treat a
|
2532
|
-
# text value. We support literals by converting the insert into a dummy
|
2532
|
+
# For Informix Dynamic Server, we treat binary value same as we treat a
|
2533
|
+
# text value. We support literals by converting the insert into a dummy
|
2533
2534
|
# insert and an update (See handle_lobs method above)
|
2534
2535
|
def set_binary_value
|
2535
2536
|
"'@@@IBMBINARY@@@'"
|
2536
2537
|
end
|
2537
2538
|
|
2538
|
-
# This method throws an error when trying to create a default value on a
|
2539
|
-
# BLOB/CLOB column for IDS. The documentation states: "if the column is
|
2539
|
+
# This method throws an error when trying to create a default value on a
|
2540
|
+
# BLOB/CLOB column for IDS. The documentation states: "if the column is
|
2540
2541
|
# a BLOB or CLOB datatype, NULL is the only valid default value."
|
2541
2542
|
def set_text_default(value)
|
2542
2543
|
unless (value == 'NULL')
|