package org.iatoki.judgels.uriel.services.impls; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import org.hibernate.Session; import org.hibernate.internal.SessionImpl; import org.iatoki.judgels.play.JidService; import org.iatoki.judgels.play.services.impls.AbstractBaseDataMigrationServiceImpl; import play.db.jpa.JPA; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public final class UrielDataMigrationServiceImpl extends AbstractBaseDataMigrationServiceImpl { @Override public long getCodeDataVersion() { return 2; } @Override protected void onUpgrade(long databaseVersion, long codeDatabaseVersion) throws SQLException { if (databaseVersion == 0) { migrateV0toV1(); migrateV1toV2(); } else if (databaseVersion == 1) { migrateV1toV2(); } } private void migrateV1toV2() throws SQLException { SessionImpl session = (SessionImpl) JPA.em().unwrap(Session.class); Connection connection = session.getJdbcConnectionAccess().obtainConnection(); String announcementTable = "uriel_contest_announcement"; String clarificationTable = "uriel_contest_clarification"; String readTable = "uriel_contest_read"; Statement statement = connection.createStatement(); String announcementQuery = "SELECT * FROM `" +announcementTable+ "`"; ResultSet resultSet = statement.executeQuery(announcementQuery); while (resultSet.next()) { long id = resultSet.getLong("id"); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `" + announcementTable + "` SET `jid`= ? WHERE id=" + id + ";"); preparedStatement.setString(1, JidService.getInstance().generateNewJid("COAN").toString()); preparedStatement.executeUpdate(); } String clarificationQuery = "SELECT * FROM `" + clarificationTable + "`"; resultSet = statement.executeQuery(clarificationQuery); while (resultSet.next()) { long id = resultSet.getLong("id"); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `" + clarificationTable + "` SET `jid`= ? WHERE id=" + id + ";"); preparedStatement.setString(1, JidService.getInstance().generateNewJid("COCL").toString()); preparedStatement.executeUpdate(); } String readQuery = "SELECT * FROM `" + readTable + "`"; resultSet = statement.executeQuery(readQuery); while (resultSet.next()) { long id = resultSet.getLong("id"); long readId = resultSet.getLong("readId"); String type = resultSet.getString("type"); String readJid = ""; String tableName = ""; if (type.equals("ANNOUNCEMENT")) { tableName = announcementTable; } else if (type.equals("CLARIFICATION")) { tableName = clarificationTable; } Statement statement1 = connection.createStatement(); ResultSet resultSet1 = statement1.executeQuery("SELECT `jid` FROM `" + tableName + "` WHERE id=" + readId + ";"); resultSet1.next(); readJid = resultSet1.getString("jid"); resultSet1.close(); statement1.close(); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `" + readTable + "` SET `readJid`= ? WHERE id=" + id + ";"); preparedStatement.setString(1, readJid); preparedStatement.executeUpdate(); } resultSet.close(); statement.executeQuery("ALTER TABLE `" + readTable + "` DROP `readId`;"); statement.close(); } private void migrateV0toV1() throws SQLException { SessionImpl session = (SessionImpl) JPA.em().unwrap(Session.class); Connection connection = session.getJdbcConnectionAccess().obtainConnection(); String supervisorTable = "uriel_contest_supervisor"; Statement statement = connection.createStatement(); String supervisorQuery = "SELECT * FROM `" + supervisorTable + "`;"; ResultSet resultSet = statement.executeQuery(supervisorQuery); while (resultSet.next()) { long id = resultSet.getLong("id"); JsonObject permission = new JsonObject(); permission.addProperty("isAllowedAll", false); JsonArray allowedPermissions = new JsonArray(); if (resultSet.getBoolean("announcement")) { allowedPermissions.add(new JsonPrimitive("ANNOUNCEMENT")); } if (resultSet.getBoolean("clarification")) { allowedPermissions.add(new JsonPrimitive("CLARIFICATION")); } if (resultSet.getBoolean("contestant")) { allowedPermissions.add(new JsonPrimitive("CONTESTANT")); } if (resultSet.getBoolean("problem")) { allowedPermissions.add(new JsonPrimitive("PROBLEM")); } if (resultSet.getBoolean("submission")) { allowedPermissions.add(new JsonPrimitive("SUBMISSION")); } permission.add("allowedPermissions", allowedPermissions); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `" + supervisorTable + "` SET `permission`= ? WHERE id=" + id + ";"); preparedStatement.setString(1, permission.toString()); preparedStatement.executeUpdate(); } statement.executeQuery("ALTER TABLE `" + supervisorTable + "` DROP `announcement`;"); statement.executeQuery("ALTER TABLE `" + supervisorTable + "` DROP `clarification`;"); statement.executeQuery("ALTER TABLE `" + supervisorTable + "` DROP `contestant`;"); statement.executeQuery("ALTER TABLE `" + supervisorTable + "` DROP `problem`;"); statement.executeQuery("ALTER TABLE `" + supervisorTable + "` DROP `submission`;"); } }