package org.openlca.core.database.mysql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.openlca.core.database.IDatabase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Get the database descriptors from a server connection.
*/
class DescriptorFetch {
private Logger log = LoggerFactory.getLogger(getClass());
private Connection con;
public DescriptorFetch(Connection con) {
this.con = con;
}
public List<DatabaseDescriptor> doFetch() {
log.trace("Get database descriptors ");
String query = "SHOW DATABASES";
try (ResultSet set = con.createStatement().executeQuery(query)) {
List<DatabaseDescriptor> descriptors = new ArrayList<>();
while (set.next()) {
String databaseName = set.getString(1);
DatabaseDescriptor descriptor = getDescriptor(databaseName);
if (descriptor != null)
descriptors.add(descriptor);
}
return descriptors;
} catch (Exception e) {
log.error("Failed to get database descriptors", e);
return Collections.emptyList();
}
}
private DatabaseDescriptor getDescriptor(String databaseName) {
log.trace("Check database {}", databaseName);
try {
if (!hasVersionTable(databaseName))
return null;
int version = getVersion(databaseName);
DatabaseDescriptor descriptor = new DatabaseDescriptor();
descriptor.setName(databaseName);
descriptor.setVersion(version);
descriptor.setUpToDate(version == IDatabase.CURRENT_VERSION);
return descriptor;
} catch (Exception e) {
log.error("Failed to check database " + databaseName, e);
return null;
}
}
private boolean hasVersionTable(String db) throws Exception {
String query = "SHOW TABLES FROM " + db;
try (ResultSet rs = con.createStatement().executeQuery(query)) {
boolean found = false;
while (!found && rs.next())
found = "openlca_version".equals(rs.getString(1));
return found;
}
}
private int getVersion(String db) throws Exception {
String query = "SELECT version FROM " + db + ".openlca_version";
try (ResultSet rs = con.createStatement().executeQuery(query)) {
rs.first();
return rs.getInt("version");
}
}
}