ibm_db 2.6.1-x86-mingw32 → 3.0.0-x86-mingw32
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.
- checksums.yaml +7 -0
- data/CHANGES +5 -0
- data/README +2 -2
- data/ext/ibm_db.c +11884 -11879
- data/ext/ruby_ibm_db_cli.c +866 -851
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +108 -277
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- metadata +26 -34
@@ -65,7 +65,7 @@ module ActiveRecord
|
|
65
65
|
# the insert or update, and then proceeds to update that record with
|
66
66
|
# the actual large object through a prepared statement (param binding).
|
67
67
|
after_save :handle_lobs
|
68
|
-
def handle_lobs()
|
68
|
+
def handle_lobs()
|
69
69
|
if self.class.connection.kind_of?(ConnectionAdapters::IBM_DBAdapter)
|
70
70
|
# Checks that the insert or update had at least a BLOB, CLOB or XML field
|
71
71
|
self.class.connection.sql.each do |clob_sql|
|
@@ -78,9 +78,8 @@ module ActiveRecord
|
|
78
78
|
values = []
|
79
79
|
params = []
|
80
80
|
# Selects only binary, text and xml columns
|
81
|
-
|
82
|
-
|
83
|
-
col.type == :xml}.each do |col|
|
81
|
+
self.class.columns.select{|col| col.sql_type.to_s =~ /blob|binary|clob|text|xml/i
|
82
|
+
}.each do |col|
|
84
83
|
# Adds the selected columns to the query
|
85
84
|
if counter == 0
|
86
85
|
update_query << "#{col.name}"
|
@@ -92,14 +91,14 @@ module ActiveRecord
|
|
92
91
|
# (except for a CLOB field where '' can be a value)
|
93
92
|
if self[col.name].nil? ||
|
94
93
|
self[col.name] == {} ||
|
95
|
-
self[col.name] == [] ||
|
96
|
-
|
94
|
+
self[col.name] == [] ||
|
95
|
+
(self[col.name] == '' && !(col.sql_type.to_s =~ /text|clob/i))
|
97
96
|
params << 'NULL'
|
98
97
|
else
|
99
|
-
|
100
|
-
values << YAML.dump(self[col.name])
|
101
|
-
else
|
102
|
-
values << self[col.name]
|
98
|
+
if (col.cast_type.is_a?(::ActiveRecord::Type::Serialized))
|
99
|
+
values << YAML.dump(self[col.name])
|
100
|
+
else
|
101
|
+
values << self[col.name]
|
103
102
|
end
|
104
103
|
params << '?'
|
105
104
|
end
|
@@ -283,22 +282,49 @@ module ActiveRecord
|
|
283
282
|
module SchemaStatements
|
284
283
|
def create_table_definition(name, temporary, options,as = nil)
|
285
284
|
TableDefinition.new self, name, temporary, options
|
285
|
+
end
|
286
|
+
|
287
|
+
def remove_foreign_key(from_table, options_or_to_table = {})
|
288
|
+
return unless supports_foreign_keys?
|
289
|
+
|
290
|
+
if options_or_to_table.is_a?(Hash)
|
291
|
+
options = options_or_to_table
|
292
|
+
else
|
293
|
+
options = { column: foreign_key_column_for(options_or_to_table) }
|
294
|
+
end
|
295
|
+
|
296
|
+
fk_name_to_delete = options.fetch(:name) do
|
297
|
+
fk_to_delete = foreign_keys(@servertype.set_case(from_table)).detect {|fk| "#{@servertype.set_case(fk.column)}" == "#{servertype.set_case(options[:column])}"}
|
298
|
+
|
299
|
+
if fk_to_delete
|
300
|
+
fk_to_delete.name
|
301
|
+
else
|
302
|
+
raise ArgumentError, "Table '#{from_table}' has no foreign key on column '#{options[:column]}'"
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
at = create_alter_table from_table
|
307
|
+
at.drop_foreign_key fk_name_to_delete
|
308
|
+
|
309
|
+
execute schema_creation.accept(at)
|
286
310
|
end
|
287
311
|
end
|
312
|
+
|
288
313
|
class IBM_DBColumn < Column
|
289
314
|
|
290
315
|
# Casts value (which is a String) to an appropriate instance
|
316
|
+
=begin
|
291
317
|
def type_cast(value)
|
292
318
|
# Casts the database NULL value to nil
|
293
319
|
return nil if value == 'NULL'
|
294
320
|
# Invokes parent's method for default casts
|
295
321
|
super
|
296
322
|
end
|
297
|
-
|
323
|
+
=end
|
298
324
|
# Used to convert from BLOBs to Strings
|
299
325
|
def self.binary_to_string(value)
|
300
326
|
# Returns a string removing the eventual BLOB scalar function
|
301
|
-
value.to_s.gsub(/"SYSIBM"."BLOB"\('(.*)'\)/i,'\1')
|
327
|
+
value.to_s.gsub(/"SYSIBM"."BLOB"\('(.*)'\)/i,'\1')
|
302
328
|
end
|
303
329
|
|
304
330
|
private
|
@@ -946,24 +972,7 @@ module ActiveRecord
|
|
946
972
|
end
|
947
973
|
end
|
948
974
|
end
|
949
|
-
=begin
|
950
|
-
# Returns an array of hashes with the column names as keys and
|
951
|
-
# column values as values. +sql+ is the select query,
|
952
|
-
# and +name+ is an optional description for logging
|
953
|
-
def select(sql, name = nil)
|
954
|
-
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
955
|
-
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
956
|
-
|
957
|
-
results = []
|
958
|
-
# Invokes the method +execute+ in order to log and execute the SQL
|
959
|
-
# IBM_DB.Statement is returned from which results can be fetched
|
960
|
-
stmt = execute(sql, name)
|
961
975
|
|
962
|
-
results = fetch_data(stmt)
|
963
|
-
# The array of record hashes is returned
|
964
|
-
results
|
965
|
-
end
|
966
|
-
=end
|
967
976
|
def select(sql, name = nil, binds = [])
|
968
977
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
969
978
|
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
@@ -1062,14 +1071,12 @@ module ActiveRecord
|
|
1062
1071
|
end
|
1063
1072
|
end
|
1064
1073
|
if item.at(1).nil? ||
|
1065
|
-
item.at(1) == {} ||
|
1066
|
-
|
1074
|
+
item.at(1) == {} ||
|
1075
|
+
(item.at(1) == '' && !(col.sql_type.to_s =~ /text|clob/i))
|
1067
1076
|
|
1068
1077
|
params << 'NULL'
|
1069
|
-
|
1070
|
-
|
1071
|
-
col.type.to_sym == :text ||
|
1072
|
-
col.type.to_sym == :binary
|
1078
|
+
|
1079
|
+
elsif (!col.nil? && (col.sql_type.to_s =~ /blob|binary|clob|text|xml/i) )
|
1073
1080
|
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
1074
1081
|
# (except for a CLOB field where '' can be a value)
|
1075
1082
|
insert_values << quote_value_for_pstmt(item.at(1))
|
@@ -1430,8 +1437,8 @@ module ActiveRecord
|
|
1430
1437
|
case value
|
1431
1438
|
when String, ActiveSupport::Multibyte::Chars then
|
1432
1439
|
value = value.to_s
|
1433
|
-
|
1434
|
-
value = column.
|
1440
|
+
if column && column.sql_type.to_s =~ /int|serial|float/i
|
1441
|
+
value = column.sql_type.to_s =~ /int|serial/i ? value.to_i : value.to_f
|
1435
1442
|
value
|
1436
1443
|
else
|
1437
1444
|
value
|
@@ -1458,38 +1465,38 @@ module ActiveRecord
|
|
1458
1465
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
1459
1466
|
|
1460
1467
|
case value
|
1461
|
-
# If it's a numeric value and the column
|
1468
|
+
# If it's a numeric value and the column sql_type is not a string, it shouldn't be quoted
|
1462
1469
|
# (IBM_DB doesn't accept quotes on numeric types)
|
1463
1470
|
when Numeric
|
1464
|
-
# If the column
|
1465
|
-
if column && column.
|
1471
|
+
# If the column sql_type is text or string, return the quote value
|
1472
|
+
if (column && ( column.sql_type.to_s =~ /text|char/i ))
|
1466
1473
|
unless caller[0] =~ /insert_fixture/i
|
1467
1474
|
"'#{value}'"
|
1468
1475
|
else
|
1469
1476
|
"#{value}"
|
1470
1477
|
end
|
1471
1478
|
else
|
1472
|
-
# value is Numeric, column.
|
1479
|
+
# value is Numeric, column.sql_type is not a string,
|
1473
1480
|
# therefore it converts the number to string without quoting it
|
1474
1481
|
value.to_s
|
1475
1482
|
end
|
1476
1483
|
when String, ActiveSupport::Multibyte::Chars
|
1477
|
-
if column && column.
|
1484
|
+
if column && column.sql_type.to_s =~ /binary|blob/i && !(column.sql_type.to_s =~ /for bit data/i)
|
1478
1485
|
# If quoting is required for the insert/update of a BLOB
|
1479
1486
|
unless caller[0] =~ /add_column_options/i
|
1480
1487
|
# Invokes a convertion from string to binary
|
1481
1488
|
@servertype.set_binary_value
|
1482
1489
|
else
|
1483
|
-
# Quoting required for the default value of a column
|
1490
|
+
# Quoting required for the default value of a column
|
1484
1491
|
@servertype.set_binary_default(value)
|
1485
1492
|
end
|
1486
|
-
elsif column && column.
|
1493
|
+
elsif column && column.sql_type.to_s =~ /text|clob/i
|
1487
1494
|
unless caller[0] =~ /add_column_options/i
|
1488
1495
|
"'<ibm>@@@IBMTEXT@@@</ibm>'"
|
1489
1496
|
else
|
1490
1497
|
@servertype.set_text_default(quote_string(value))
|
1491
1498
|
end
|
1492
|
-
elsif column && column.
|
1499
|
+
elsif column && column.sql_type.to_s =~ /xml/i
|
1493
1500
|
unless caller[0] =~ /add_column_options/i
|
1494
1501
|
"'<ibm>@@@IBMXML@@@</ibm>'"
|
1495
1502
|
else
|
@@ -1944,20 +1951,24 @@ module ActiveRecord
|
|
1944
1951
|
#FKCOLUMN_NAME:: fk_row[7] Name of the column containing the foreign key.
|
1945
1952
|
#FK_NAME:: fk_row[11] The name of the foreign key.
|
1946
1953
|
|
1954
|
+
table_name = @servertype.set_case(table_name.to_s)
|
1955
|
+
foreignKeys = []
|
1947
1956
|
stmt = IBM_DB.foreignkeys( @connection, nil,
|
1948
1957
|
@servertype.set_case(@schema),
|
1949
|
-
@servertype.set_case(table_name))
|
1950
|
-
foreignKeys = []
|
1958
|
+
@servertype.set_case(table_name), "FK_TABLE")
|
1951
1959
|
|
1952
1960
|
if(stmt)
|
1953
1961
|
begin
|
1954
1962
|
while ( fk_row = IBM_DB.fetch_array(stmt) )
|
1955
1963
|
options = {
|
1956
|
-
column: fk_row[
|
1964
|
+
column: fk_row[7],
|
1957
1965
|
name: fk_row[11],
|
1958
|
-
primary_key: fk_row[
|
1966
|
+
primary_key: fk_row[3],
|
1959
1967
|
}
|
1960
|
-
|
1968
|
+
options[:on_delete] = extract_foreign_key_action(fk_row[9])
|
1969
|
+
options[:on_update] = extract_foreign_key_action(fk_row[10])
|
1970
|
+
#foreignKeys << ForeignKeyDefinition.new(table_name, fk_row[6], options)
|
1971
|
+
foreignKeys << ForeignKeyDefinition.new(table_name, fk_row[2], options)
|
1961
1972
|
end
|
1962
1973
|
|
1963
1974
|
rescue StandardError => fetch_error # Handle driver fetch errors
|
@@ -1983,6 +1994,40 @@ module ActiveRecord
|
|
1983
1994
|
#Returns the foreignKeys array
|
1984
1995
|
return foreignKeys
|
1985
1996
|
end
|
1997
|
+
def extract_foreign_key_action(specifier) # :nodoc:
|
1998
|
+
case specifier
|
1999
|
+
when 0; :cascade
|
2000
|
+
when 1; :restrict
|
2001
|
+
when 2; :nullify
|
2002
|
+
when 3; :noaction
|
2003
|
+
end
|
2004
|
+
end
|
2005
|
+
|
2006
|
+
def supports_disable_referential_integrity? #:nodoc:
|
2007
|
+
true
|
2008
|
+
end
|
2009
|
+
|
2010
|
+
def disable_referential_integrity #:nodoc:
|
2011
|
+
if supports_disable_referential_integrity?
|
2012
|
+
alter_foreign_keys(tables, true)
|
2013
|
+
end
|
2014
|
+
|
2015
|
+
yield
|
2016
|
+
ensure
|
2017
|
+
if supports_disable_referential_integrity?
|
2018
|
+
alter_foreign_keys(tables, false)
|
2019
|
+
end
|
2020
|
+
|
2021
|
+
end
|
2022
|
+
|
2023
|
+
def alter_foreign_keys(tables, not_enforced)
|
2024
|
+
enforced = not_enforced ? 'NOT ENFORCED' : 'ENFORCED'
|
2025
|
+
tables.each do |table|
|
2026
|
+
foreign_keys(table).each do |fk|
|
2027
|
+
execute("ALTER TABLE #{@servertype.set_case(fk.from_table)} ALTER FOREIGN KEY #{@servertype.set_case(fk.name)} #{enforced}")
|
2028
|
+
end
|
2029
|
+
end
|
2030
|
+
end
|
1986
2031
|
|
1987
2032
|
# Renames a table.
|
1988
2033
|
# ==== Example
|
@@ -2020,32 +2065,6 @@ module ActiveRecord
|
|
2020
2065
|
@servertype.change_column(table_name, column_name, type, options)
|
2021
2066
|
end
|
2022
2067
|
|
2023
|
-
=begin
|
2024
|
-
#overrides the abstract adapter method to generate proper sql
|
2025
|
-
#specifying the column options, like default value and nullability clause
|
2026
|
-
def add_column_options!(sql,options={})
|
2027
|
-
#add default null option only if :default option is not specified and
|
2028
|
-
#:null option is not specified or is true
|
2029
|
-
if (options[:default].nil? && (options[:null].nil? || options[:null] == true))
|
2030
|
-
sql << " DEFAULT NULL"
|
2031
|
-
else
|
2032
|
-
if( !options[:default].nil?)
|
2033
|
-
#check, :column option is passed only in case of create_table but not in case of add_column
|
2034
|
-
if (!options[:column].nil?)
|
2035
|
-
sql << " DEFAULT #{quote(options[:default],options[:column])}"
|
2036
|
-
else
|
2037
|
-
sql << " DEFAULT #{quote(options[:default])}"
|
2038
|
-
end
|
2039
|
-
end
|
2040
|
-
#append NOT NULL to sql only---
|
2041
|
-
#---if options[:null] is not nil and is equal to false
|
2042
|
-
unless options[:null] == nil
|
2043
|
-
sql << " NOT NULL" if (options[:null] == false)
|
2044
|
-
end
|
2045
|
-
end
|
2046
|
-
end
|
2047
|
-
=end
|
2048
|
-
|
2049
2068
|
#Add distinct clause to the sql if there is no order by specified
|
2050
2069
|
def distinct(columns, order_by)
|
2051
2070
|
if order_by.nil?
|
@@ -2054,6 +2073,17 @@ module ActiveRecord
|
|
2054
2073
|
"#{columns}"
|
2055
2074
|
end
|
2056
2075
|
end
|
2076
|
+
|
2077
|
+
def columns_for_distinct(columns, orders) #:nodoc:
|
2078
|
+
order_columns = orders.reject(&:blank?).map{ |s|
|
2079
|
+
# Convert Arel node to string
|
2080
|
+
s = s.to_sql unless s.is_a?(String)
|
2081
|
+
# Remove any ASC/DESC modifiers
|
2082
|
+
s.gsub(/\s+(?:ASC|DESC)\b/i, '')
|
2083
|
+
.gsub(/\s+NULLS\s+(?:FIRST|LAST)\b/i, '')
|
2084
|
+
}.reject(&:blank?).map.with_index { |column, i| "#{column} AS alias_#{i}" }
|
2085
|
+
[super, *order_columns].join(', ')
|
2086
|
+
end
|
2057
2087
|
|
2058
2088
|
# Sets a new default value for a column. This does not set the default
|
2059
2089
|
# value to +NULL+, instead, it needs DatabaseStatements#execute which
|
@@ -2429,206 +2459,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2429
2459
|
def get_double_mapping
|
2430
2460
|
return "double"
|
2431
2461
|
end
|
2432
|
-
=begin
|
2433
|
-
# Commenting this code, as offset handling is now part of sql and we need to handle it in select and also
|
2434
|
-
# need not set cursor type during prepare or execute
|
2435
|
-
# Fetches all the results available. IBM_DB.fetch_assoc(stmt) returns
|
2436
|
-
# an hash for each single record.
|
2437
|
-
# The loop stops when there aren't any more valid records to fetch
|
2438
|
-
def select(stmt)
|
2439
|
-
results = []
|
2440
|
-
begin
|
2441
|
-
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2442
|
-
# We know at this point that there is an offset and/or a limit
|
2443
|
-
# Check if the cursor type is set correctly
|
2444
|
-
cursor_type = IBM_DB.get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
|
2445
|
-
@offset = 0 if @offset.nil?
|
2446
|
-
if (cursor_type == IBM_DB::SQL_CURSOR_STATIC)
|
2447
|
-
index = 0
|
2448
|
-
# Get @limit rows starting at @offset
|
2449
|
-
while (index < @limit)
|
2450
|
-
# We increment the offset by 1 because for DB2 the offset of the initial row is 1 instead of 0
|
2451
|
-
if single_hash = IBM_DB.fetch_assoc(stmt, @offset + index + 1)
|
2452
|
-
# Add the record to the +results+ array
|
2453
|
-
results << single_hash
|
2454
|
-
index = index + 1
|
2455
|
-
else
|
2456
|
-
# break from the while loop
|
2457
|
-
break
|
2458
|
-
end
|
2459
|
-
end
|
2460
|
-
else # cursor != IBM_DB::SQL_CURSOR_STATIC
|
2461
|
-
# If the result set contains a LOB, the cursor type will never be SQL_CURSOR_STATIC
|
2462
|
-
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
2463
|
-
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
2464
|
-
# at @offset to @offset + @limit
|
2465
|
-
index = 0
|
2466
|
-
while (index < @offset + @limit)
|
2467
|
-
if single_hash = IBM_DB.fetch_assoc(stmt)
|
2468
|
-
# Add the record to the +results+ array only from row @offset to @offset + @limit
|
2469
|
-
if (index >= @offset)
|
2470
|
-
results << single_hash
|
2471
|
-
end
|
2472
|
-
index = index + 1
|
2473
|
-
else
|
2474
|
-
# break from the while loop
|
2475
|
-
break
|
2476
|
-
end
|
2477
|
-
end
|
2478
|
-
end
|
2479
|
-
# This is the case where limit is set to zero
|
2480
|
-
# Simply return an empty +results+
|
2481
|
-
elsif (!@limit.nil? && @limit == 0)
|
2482
|
-
results
|
2483
|
-
# No limits or offsets specified
|
2484
|
-
else
|
2485
|
-
while single_hash = IBM_DB.fetch_assoc(stmt)
|
2486
|
-
# Add the record to the +results+ array
|
2487
|
-
results << single_hash
|
2488
|
-
end
|
2489
|
-
return results
|
2490
|
-
end
|
2491
|
-
rescue StandardError => fetch_error # Handle driver fetch errors
|
2492
|
-
error_msg = IBM_DB.getErrormsg(stmt, IBM_DB::DB_STMT )
|
2493
|
-
if error_msg && !error_msg.empty?
|
2494
|
-
raise StatementInvalid,"Failed to retrieve data: #{error_msg}"
|
2495
|
-
else
|
2496
|
-
error_msg = "An unexpected error occurred during data retrieval"
|
2497
|
-
error_msg = error_msg + ": #{fetch_error.message}" if !fetch_error.message.empty?
|
2498
|
-
raise error_msg
|
2499
|
-
end
|
2500
|
-
ensure
|
2501
|
-
# Assign the instance variables to nil. We will not be using them again
|
2502
|
-
@offset = nil
|
2503
|
-
@limit = nil
|
2504
|
-
end
|
2505
|
-
end
|
2506
2462
|
|
2507
|
-
# Fetches all the results available. IBM_DB.fetch_array(stmt) returns
|
2508
|
-
# an array for each single record.
|
2509
|
-
# The loop stops when there aren't any more valid records to fetch
|
2510
|
-
def select_rows(sql, name, stmt, results)
|
2511
|
-
begin
|
2512
|
-
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2513
|
-
# We know at this point that there is an offset and/or a limit
|
2514
|
-
# Check if the cursor type is set correctly
|
2515
|
-
cursor_type = IBM_DB.get_option stmt, IBM_DB::SQL_ATTR_CURSOR_TYPE, 0
|
2516
|
-
@offset = 0 if @offset.nil?
|
2517
|
-
if (cursor_type == IBM_DB::SQL_CURSOR_STATIC)
|
2518
|
-
index = 0
|
2519
|
-
# Get @limit rows starting at @offset
|
2520
|
-
while (index < @limit)
|
2521
|
-
# We increment the offset by 1 because for DB2 the offset of the initial row is 1 instead of 0
|
2522
|
-
if single_array = IBM_DB.fetch_array(stmt, @offset + index + 1)
|
2523
|
-
# Add the array to the +results+ array
|
2524
|
-
results << single_array
|
2525
|
-
index = index + 1
|
2526
|
-
else
|
2527
|
-
# break from the while loop
|
2528
|
-
break
|
2529
|
-
end
|
2530
|
-
end
|
2531
|
-
else # cursor != IBM_DB::SQL_CURSOR_STATIC
|
2532
|
-
# If the result set contains a LOB, the cursor type will never be SQL_CURSOR_STATIC
|
2533
|
-
# because DB2 does not allow this. We can't use the offset mechanism because the cursor
|
2534
|
-
# is not scrollable. In this case, ignore first @offset rows and return rows starting
|
2535
|
-
# at @offset to @offset + @limit
|
2536
|
-
index = 0
|
2537
|
-
while (index < @offset + @limit)
|
2538
|
-
if single_array = IBM_DB.fetch_array(stmt)
|
2539
|
-
# Add the array to the +results+ array only from row @offset to @offset + @limit
|
2540
|
-
if (index >= @offset)
|
2541
|
-
results << single_array
|
2542
|
-
end
|
2543
|
-
index = index + 1
|
2544
|
-
else
|
2545
|
-
# break from the while loop
|
2546
|
-
break
|
2547
|
-
end
|
2548
|
-
end
|
2549
|
-
end
|
2550
|
-
# This is the case where limit is set to zero
|
2551
|
-
# Simply return an empty +results+
|
2552
|
-
elsif (!@limit.nil? && @limit == 0)
|
2553
|
-
results
|
2554
|
-
# No limits or offsets specified
|
2555
|
-
else
|
2556
|
-
while single_array = IBM_DB.fetch_array(stmt)
|
2557
|
-
# Add the array to the +results+ array
|
2558
|
-
results << single_array
|
2559
|
-
end
|
2560
|
-
end
|
2561
|
-
rescue StandardError => fetch_error # Handle driver fetch errors
|
2562
|
-
error_msg = IBM_DB.getErrormsg(stmt, IBM_DB::DB_STMT )
|
2563
|
-
if error_msg && !error_msg.empty?
|
2564
|
-
raise StatementInvalid,"Failed to retrieve data: #{error_msg}"
|
2565
|
-
else
|
2566
|
-
error_msg = "An unexpected error occurred during data retrieval"
|
2567
|
-
error_msg = error_msg + ": #{fetch_error.message}" if !fetch_error.message.empty?
|
2568
|
-
raise error_msg
|
2569
|
-
end
|
2570
|
-
ensure
|
2571
|
-
# Assign the instance variables to nil. We will not be using them again
|
2572
|
-
@offset = nil
|
2573
|
-
@limit = nil
|
2574
|
-
end
|
2575
|
-
return results
|
2576
|
-
end
|
2577
|
-
|
2578
|
-
# Praveen
|
2579
|
-
def prepare(sql,name = nil)
|
2580
|
-
# Check if there is a limit and/or an offset
|
2581
|
-
# If so then make sure and use a static cursor type
|
2582
|
-
begin
|
2583
|
-
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2584
|
-
# Set the cursor type to static so we can later utilize the offset and limit correctly
|
2585
|
-
if stmt = IBM_DB.prepare(@adapter.connection, sql,
|
2586
|
-
{IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
|
2587
|
-
stmt # Return the statement object
|
2588
|
-
else
|
2589
|
-
raise StatementInvalid, IBM_DB.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
|
2590
|
-
end
|
2591
|
-
else
|
2592
|
-
if stmt = IBM_DB.prepare(@adapter.connection, sql)
|
2593
|
-
stmt # Return the statement object
|
2594
|
-
else
|
2595
|
-
raise StatementInvalid, IBM_DB.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
|
2596
|
-
end
|
2597
|
-
end
|
2598
|
-
rescue StandardError => prep_err
|
2599
|
-
error_msg = "Failed to prepare sql #{sql}"
|
2600
|
-
error_msg = error_msg + ": #{prep_err.message}" if !prep_err.message.empty?
|
2601
|
-
raise error_msg
|
2602
|
-
end
|
2603
|
-
end
|
2604
|
-
|
2605
|
-
# Praveen
|
2606
|
-
def execute(sql, name = nil)
|
2607
|
-
# Check if there is a limit and/or an offset
|
2608
|
-
# If so then make sure and use a static cursor type
|
2609
|
-
begin
|
2610
|
-
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
2611
|
-
# Set the cursor type to static so we can later utilize the offset and limit correctly
|
2612
|
-
if stmt = IBM_DB.exec(@adapter.connection, sql,
|
2613
|
-
{IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
|
2614
|
-
stmt # Return the statement object
|
2615
|
-
else
|
2616
|
-
raise StatementInvalid, IBM_DB.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
|
2617
|
-
end
|
2618
|
-
else
|
2619
|
-
if stmt = IBM_DB.exec(@adapter.connection, sql)
|
2620
|
-
stmt # Return the statement object
|
2621
|
-
else
|
2622
|
-
raise StatementInvalid, IBM_DB.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
|
2623
|
-
end
|
2624
|
-
end
|
2625
|
-
rescue StandardError => exec_err
|
2626
|
-
error_msg = "Failed to execute statement"
|
2627
|
-
error_msg = error_msg + ": #{exec_err.message}" if !exec_err.message.empty?
|
2628
|
-
raise error_msg
|
2629
|
-
end
|
2630
|
-
end
|
2631
|
-
=end
|
2632
2463
|
def get_limit_offset_clauses(limit, offset)
|
2633
2464
|
retHash = {"endSegment"=> "", "startSegment" => ""}
|
2634
2465
|
if(offset.nil? && limit.nil?)
|
@@ -2982,7 +2813,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2982
2813
|
is_nullable = true
|
2983
2814
|
@adapter.columns(table_name).select do |col|
|
2984
2815
|
if (col.name == column_name)
|
2985
|
-
|
2816
|
+
sql_type = @adapter.type_to_sql(col.sql_type, col.limit, col.precision, col.scale)
|
2986
2817
|
is_nullable = col.null
|
2987
2818
|
end
|
2988
2819
|
end
|
@@ -3004,7 +2835,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
3004
2835
|
sql_type = nil
|
3005
2836
|
@adapter.columns(table_name).select do |col|
|
3006
2837
|
if (col.name == column_name)
|
3007
|
-
|
2838
|
+
sql_type = @adapter.type_to_sql(col.sql_type, col.limit, col.precision, col.scale)
|
3008
2839
|
end
|
3009
2840
|
end
|
3010
2841
|
if !null.nil?
|