# = Module for handling JDBC Result Sets | |
# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 | |
require 'java' | |
require 'format' | |
include_class 'java.sql.DriverManager' | |
module JDBC | |
# == Class DB: a connection to a database / tablespace | |
class DB | |
attr_reader :conn | |
def initialize(connection) | |
@conn = connection ; | |
end | |
def DB.connect(url, driver, user, password) | |
Java::JavaClass.for_name(driver) ; | |
c = new(DriverManager.getConnection(url, user, password)) | |
return c | |
end | |
def query(queryString) | |
s = @conn.createStatement() | |
return Results.new(s.executeQuery(queryString)) | |
end | |
def query_print(queryString) | |
s = @conn.createStatement() | |
rs = Results.new(s.executeQuery(queryString)) | |
rs.dump | |
rs.close | |
return nil | |
end | |
def close | |
@conn.close() | |
end | |
end | |
class Results | |
def initialize(jdbcResultSet) | |
@rs = jdbcResultSet | |
end | |
def each | |
while(@rs.next) | |
yield Row.new(@rs) | |
end | |
close | |
end | |
def close | |
@rs.close | |
end | |
# All the cols (via their display name) | |
def cols | |
if !@columns | |
md = @rs.getMetaData | |
@columns=[] | |
1.upto(md.getColumnCount) { |i| @columns << md.getColumnLabel(i) } | |
end | |
return @columns | |
end | |
# All the rows, as an array of hashes (values are strings) | |
def all_rows_hash | |
x = [] | |
columns = cols | |
each {|row| x << row.data(columns)} | |
close | |
return x | |
end | |
# All the rows, as an array of arrays | |
def all_rows_array | |
x = [] | |
each {|row| x << row.as_array } | |
close | |
return x | |
end | |
def dump | |
# Order matters - must get columns before exhausting data and closing ResultSet | |
columns = cols | |
data = all_rows_array | |
Fmt.table(columns, data) | |
end | |
end | |
class Row | |
def initialize(row) | |
@row = row | |
end | |
# and it works for string name or integer index | |
def [](name) | |
return @row.getString(name) | |
end | |
def next | |
raise "Error: calling close on a Row object" | |
end | |
def each | |
len = @row.getMetaData.getColumnCount | |
(1..len).each { |i| yield @row.getString(i) } | |
end | |
def as_array | |
len = @row.getMetaData.getColumnCount | |
x = [] | |
(1..len).each { |i| x << @row.getString(i) } | |
return x | |
end | |
# Needs column names | |
def data(cols) | |
x = {} | |
cols.each do |col| | |
x[col] = @row.getString(col) | |
if @row.wasNull | |
x[col] = nil | |
end | |
end | |
return x | |
end | |
# Direct any missing methods to the wrapped object | |
def method_missing(methId, *args) | |
meth = @row.method(methId) | |
meth.call *args | |
end | |
end | |
end |