package org.iatoki.judgels.raguel;
import org.hibernate.Session;
import org.hibernate.internal.SessionImpl;
import org.iatoki.judgels.play.migration.AbstractJudgelsDataMigrator;
import org.iatoki.judgels.play.migration.DataMigrationEntityManager;
import org.iatoki.judgels.play.migration.DataVersionDao;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class RaguelDataMigrator extends AbstractJudgelsDataMigrator {
private EntityManager entityManager;
@Inject
public RaguelDataMigrator(DataVersionDao dataVersionDao) {
super(dataVersionDao);
this.entityManager = DataMigrationEntityManager.createEntityManager();
}
@Override
public long getLatestDataVersion() {
return 2;
}
@Override
protected void migrate(long currentDataVersion) throws SQLException {
if (currentDataVersion < 2) {
migrateV1toV2();
}
}
private void migrateV1toV2() throws SQLException {
SessionImpl session = (SessionImpl) entityManager.unwrap(Session.class);
Connection connection = session.getJdbcConnectionAccess().obtainConnection();
String forumTable = "raguel_forum";
String forumThreadTable = "raguel_thread";
String forumLastPostTable = "raguel_forum_last_post";
Statement statement = connection.createStatement();
String threadQuery = "SELECT * FROM " + forumThreadTable + " ORDER BY timeUpdate DESC;";
ResultSet resultSet = statement.executeQuery(threadQuery);
while (resultSet.next()) {
String forumJid = resultSet.getString("forumJid");
String userUpdate = resultSet.getString("userUpdate");
long timeUpdate = resultSet.getLong("timeUpdate");
updateForumAndParentsLastPost(connection, forumTable, forumLastPostTable, forumJid, userUpdate, timeUpdate);
}
}
private void updateForumAndParentsLastPost(Connection connection, String forumTable, String forumLastPostTable, String forumJid, String userUpdate, long timeUpdate) throws SQLException {
Statement statement1 = connection.createStatement();
String lastPostQuery = "SELECT COUNT(*) FROM " + forumLastPostTable + " WHERE forumJid = \"" + forumJid + "\";";
ResultSet resultSet1 = statement1.executeQuery(lastPostQuery);
resultSet1.next();
long count = resultSet1.getLong(1);
if (count == 0) {
String updateQuery = "INSERT INTO " + forumLastPostTable + " (forumJid, userCreate, timeCreate, ipCreate, userUpdate, timeUpdate, ipUpdate) VALUES(?, ?, ?, ?, ?, ?, ?);";
PreparedStatement preparedStatement = connection.prepareStatement(updateQuery);
preparedStatement.setString(1, forumJid);
preparedStatement.setString(2, userUpdate);
preparedStatement.setLong(3, timeUpdate);
preparedStatement.setString(4, "localhost");
preparedStatement.setString(5, userUpdate);
preparedStatement.setLong(6, timeUpdate);
preparedStatement.setString(7, "localhost");
preparedStatement.executeUpdate();
Statement statement2 = connection.createStatement();
String forumQuery = "SELECT * FROM " + forumTable + " WHERE jid = \"" + forumJid + "\";";
ResultSet resultSet2 = statement2.executeQuery(forumQuery);
resultSet2.next();
String parentJid = resultSet2.getString("parentJid");
if (!parentJid.isEmpty()) {
updateForumAndParentsLastPost(connection, forumTable, forumLastPostTable, parentJid, userUpdate, timeUpdate);
}
}
}
}