@@ -1,55 +1,97 @@
require 'java '
require 'jt400'
require 'date'
require 'bigdecimal '
require './lib/adsjdbc-10.10.0.28.jar '
java_import java . sql . Driver
java_import java . sql . DriverManager
java_import 'com.extendedsystems.jdbc.advantage.ADSDriver '
java_import 'com.ibm.as400.access.AS400JDBCDriver'
class AdsAdapter
def get_records
@connection ||= java . sql . DriverManager . get_connection ( "jdbc:as400://127.0.0.1/" , 'username' , 'password' )
rs = @connection . createStatement . executeQuery ( "SELECT * FROM RANDOM_TABLE" )
puts resultset_to_hash ( rs ) . inspect
end
def initialize ( connect_string )
@connect_string = connect_string
end
def establish_connection ( connect_string = @connect_string )
::DriverManager . getConnection ( connect_string )
end
def connection
@connection ||= establish_connection
end
def execute ( sql )
stmt = connection . createStatement
rs = stmt . executeQuery ( sql )
resultset_to_hash ( rs )
ensure
stmt . close if stmt
end
def resultset_to_hash ( resultset )
rows = [ ]
while resultset . next
rows << row_to_hash ( resultset )
end
def resultset_to_hash ( resultset )
meta = resultset . meta_data
rows = [ ]
rows
end
while resultset . next
def row_to_hash ( resultset )
column_count = resultset . meta_data . column_count
row = { }
( 1 ..meta . column_count ) . each do |i |
name = meta . column_name i
row [ name ] = case meta . column_type ( i )
when -6 , -5 , 5 , 4
# TINYINT, BIGINT, INTEGER
resultset . get_int ( i ) . to_i
when 41
# Date
resultset . get_date ( i )
when 92
# Time
resultset . get_time ( i ) . to_i
when 93
# Timestamp
resultset . get_timestamp ( i )
when 2 , 3 , 6
# NUMERIC, DECIMAL, FLOAT
case meta . scale ( i )
when 0
resultset . get_long ( i ) . to_i
else
BigDecimal . new ( resultset . get_string ( i ) . to_s )
end
when 1 , -15 , -9 , 12
# CHAR, NCHAR, NVARCHAR, VARCHAR
resultset . get_string ( i ) . to_s
else
resultset . get_string ( i ) . to_s
end
( 1 ..column_count ) . each do |column_index |
name = get_column_name ( resultset , column_index )
value = get_column_value ( resultset , column_index )
row [ name ] = value
end
rows << row
row
end
def inspect_column ( resultset , column_index )
meta = resultset . meta_data
[
meta . get_column_type_name ( column_index ) ,
meta . get_column_name ( column_index ) ,
meta . get_column_label ( column_index ) ,
meta . get_column_class_name ( column_index ) ,
meta . get_column_display_size ( column_index ) ,
meta . get_column_type ( column_index )
]
end
def get_column_name ( resultset , column_index )
resultset . meta_data . get_column_name ( column_index )
end
rows
end
# https://gist.github.com/rwjblue/1366047
def get_column_value ( resultset , column_index )
meta = resultset . meta_data
case meta . get_column_type ( column_index )
when -6 , -5 , 5 , 4 # TINYINT, BIGINT, INTEGER
resultset . get_int ( column_index ) . to_i
when 41 , 91 # Date
resultset . get_date ( column_index ) &.toString
when 92 # Time
resultset . get_time ( column_index ) . toString
when 93 # Timestamp
resultset . get_timestamp ( column_index ) &.toString
when 2 , 3 , 6 # NUMERIC, DECIMAL, FLOAT
if meta . get_scale ( column_index ) . zero?
resultset . get_long ( column_index ) . to_i
else
resultset . get_string ( column_index ) . to_s . to_f
end
when 1 , -15 , -9 , 12
# CHAR, NCHAR, NVARCHAR, VARCHAR
resultset . get_string ( column_index ) . to_s
when 8 # [Double, double]
resultset . get_string ( column_index ) . to_s
when -7 # Logical, boolean
resultset . get_string ( column_index ) . to_s
else
p [ :unknown , inspect_column ( resultset , column_index ) ]
resultset . get_string ( column_index ) . to_s
end
end
end