package org.dcache.chimera.spi; import com.google.common.base.Splitter; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sql.DataSource; import org.dcache.chimera.ChimeraFsException; import org.dcache.chimera.FsSqlDriver; import org.dcache.chimera.PgSQL95FsSqlDriver; import org.dcache.chimera.PgSQLFsSqlDriver; import static org.dcache.util.SqlHelper.tryToClose; public class PgSQLDrivertProvider implements DBDriverProvider { // pattern to match versions like: 1.2.3 or 1.2rc1 private final static Pattern VERSION_PATTERN = Pattern.compile("(?<maj>\\d+)\\.(?<min>\\d+)(?:(\\.(\\d+))|(\\w+))"); @Override public boolean isSupportDB(DataSource dataSource) throws SQLException { Connection dbConnection = null; try { dbConnection = dataSource.getConnection(); String databaseProductName = dbConnection.getMetaData().getDatabaseProductName(); return databaseProductName.equalsIgnoreCase("PostgreSQL"); } finally { tryToClose(dbConnection); } } @Override public FsSqlDriver getDriver(DataSource dataSource) throws SQLException, ChimeraFsException { Connection dbConnection = null; try { dbConnection = dataSource.getConnection(); String databaseProductVersion = dbConnection.getMetaData().getDatabaseProductVersion(); Matcher m = VERSION_PATTERN.matcher(databaseProductVersion); int maj = 0; int min = 0; try { if (m.matches()) { maj = Integer.parseInt(m.group("maj")); min = Integer.parseInt(m.group("min")); } } catch (NumberFormatException ignored) { } if (maj >= 9 && min >= 5) { return new PgSQL95FsSqlDriver(dataSource); } else { return new PgSQLFsSqlDriver(dataSource); } } finally { tryToClose(dbConnection); } } }