package org.jruby.util;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.Iterator;
This class gets specially loaded directly in the JRubyClassLoader so that
we can unregister all JDBC drivers that were loaded/registered. It gets
invoked as part of the Ruby runtime tear down.
See http://bugs.jruby.org/4226.
/**
* This class gets specially loaded directly in the JRubyClassLoader so that
* we can unregister all JDBC drivers that were loaded/registered. It gets
* invoked as part of the Ruby runtime tear down.
*
* See http://bugs.jruby.org/4226.
*/
public class JDBCDriverUnloader implements Runnable, Iterable<Driver> {
public void run() {
for (Driver d : this) {
try {
DriverManager.deregisterDriver(d);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
public Iterator<Driver> iterator() {
Enumeration<Driver> drivers = DriverManager.getDrivers();
ArrayList<Driver> driverList = new ArrayList();
while (drivers.hasMoreElements()) {
Driver d = drivers.nextElement();
// JRUBY-5528: Don't unload drivers loaded by parent classloaders.
if (d.getClass().getClassLoader() == JDBCDriverUnloader.class.getClassLoader()) {
driverList.add(d);
}
}
return driverList.iterator();
}
}