package ameba.db.ebean.migration;
import ameba.db.migration.models.ScriptInfo;
import com.google.common.collect.Lists;
import io.ebean.Transaction;
import io.ebean.TxIsolation;
import io.ebean.dbmigration.model.MigrationVersion;
import io.ebean.dbmigration.model.ModelContainer;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Collections;
import java.util.List;
/**
* <p>MigrationModel class.</p>
*
* @author icode
*/
public class MigrationModel {
private static final Logger logger = LoggerFactory.getLogger(MigrationModel.class);
private final ModelContainer model = new ModelContainer();
private final SpiEbeanServer server;
private boolean migrationTableExist;
private MigrationVersion lastVersion;
/**
* <p>Constructor for MigrationModel.</p>
*
* @param server a {@link io.ebeaninternal.api.SpiEbeanServer} object.
*/
public MigrationModel(SpiEbeanServer server) {
this.server = server;
}
/**
* <p>read.</p>
*
* @return a {@link io.ebean.dbmigration.model.ModelContainer} object.
*/
public ModelContainer read() {
readMigrations();
return model;
}
/**
* <p>readMigrations.</p>
*/
protected void readMigrations() {
final List<MigrationResource> resources = findMigrationResource();
// sort into version order before applying
Collections.sort(resources);
for (MigrationResource migrationResource : resources) {
logger.debug("read {}", migrationResource);
model.apply(migrationResource.read(), migrationResource.getVersion());
}
// remember the last version
if (!resources.isEmpty()) {
lastVersion = resources.get(resources.size() - 1).getVersion();
}
}
/**
* <p>findMigrationResource.</p>
*
* @return a {@link java.util.List} object.
*/
protected List<MigrationResource> findMigrationResource() {
final List<MigrationResource> resources = Lists.newArrayList();
BeanDescriptor<ScriptInfo> beanDescriptor = server.getBeanDescriptor(ScriptInfo.class);
Transaction transaction = server.createTransaction(TxIsolation.READ_COMMITED);
try (Connection connection = transaction.getConnection()) {
String tableName = beanDescriptor.getBaseTable();
ResultSet rs = connection.getMetaData()
.getTables(null, null, "%", null);
while (rs.next()) {
if (tableName.equalsIgnoreCase(rs.getString(3))) {
migrationTableExist = true;
break;
}
}
if (migrationTableExist) {
server.find(ScriptInfo.class)
.findEach(bean -> resources.add(new MigrationResource(bean)));
}
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
transaction.end();
}
return resources;
}
/**
* <p>getNextVersion.</p>
*
* @param initialVersion a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String getNextVersion(String initialVersion) {
return lastVersion == null ? initialVersion : lastVersion.nextVersion();
}
public boolean isMigrationTableExist() {
return migrationTableExist;
}
}