def indexes(table_name, name = nil, schema_name = nil)
with_connection_retry_guard do |conn|
metadata = conn.getMetaData
begin
unless String === table_name
table_name = table_name.to_s
else
table_name = table_name.dup
end
table_name.upcase! if metadata.storesUpperCaseIdentifiers
table_name.downcase! if metadata.storesLowerCaseIdentifiers
resultset = metadata.getIndexInfo(nil, schema_name, table_name, false, false)
primary_keys = primary_keys(table_name)
indexes = []
current_index = nil
while resultset.next
index_name = resultset.get_string(Jdbc::IndexMetaData::INDEX_NAME)
next unless index_name
index_name.downcase!
column_name = resultset.get_string(Jdbc::IndexMetaData::COLUMN_NAME).downcase
next if primary_keys.include? column_name
if current_index != index_name
current_index = index_name
table_name = resultset.get_string(Jdbc::IndexMetaData::TABLE_NAME).downcase
non_unique = resultset.get_boolean(Jdbc::IndexMetaData::NON_UNIQUE)
indexes << IndexDefinition.new(table_name, index_name, !non_unique, [])
end
indexes.last.columns << column_name
end
resultset.close
indexes
ensure
metadata.close rescue nil
end
end
end