-
-
Save bf4/1ef13eb1fa65a1cc762d0f7b07d42a4d to your computer and use it in GitHub Desktop.
Convert JDBC ResultSet into Ruby Hash with JRuby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' | |
class AdsAdapter | |
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 | |
rows | |
end | |
def row_to_hash(resultset) | |
column_count = resultset.meta_data.column_count | |
row = {} | |
(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 | |
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 | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment