Improve compatibility when running 1.13 and 1.14 servers on the same logblock database

Old materials are no longer renamed, instead new materials are added and the old entries are modified
This commit is contained in:
Brokkonaut
2019-05-05 05:55:47 +02:00
parent e66b5a8f9d
commit 33c18a9e62
2 changed files with 26 additions and 38 deletions

View File

@ -88,7 +88,6 @@ public class LogBlock extends JavaPlugin {
conn.close();
Updater updater = new Updater(this);
updater.checkTables();
updater.updateMaterialsPost1_13();
MaterialConverter.initializeMaterials(getConnection());
MaterialConverter.getOrAddMaterialId(Material.AIR.getKey()); // AIR must be the first entry
EntityTypeConverter.initializeEntityTypes(getConnection());

View File

@ -756,6 +756,8 @@ class Updater {
return false;
}
updateMaterialsPost1_13();
logblock.saveConfig();
return true;
}
@ -838,7 +840,7 @@ class Updater {
/**
* Update materials that were renamed
*/
public void updateMaterialsPost1_13() {
private void updateMaterialsPost1_13() {
final ConfigurationSection config = logblock.getConfig();
String previousMinecraftVersion = config.getString("previousMinecraftVersion");
if (previousMinecraftVersion == null) {
@ -858,56 +860,43 @@ class Updater {
if (comparablePreviousMinecraftVersion.compareTo("1.14") < 0 && comparableCurrentMinecraftVersion.compareTo("1.14") >= 0) {
logblock.getLogger().info("[Updater] Upgrading Materials to 1.14");
renameMaterial("minecraft:sign", "minecraft:oak_sign", true);
renameMaterial("minecraft:wall_sign", "minecraft:oak_wall_sign", true);
renameMaterial("minecraft:stone_slab", "minecraft:smooth_stone_slab", false);
renameMaterial("minecraft:rose_red", "minecraft:red_dye", true);
renameMaterial("minecraft:dandelion_yellow", "minecraft:yellow_dye", true);
renameMaterial("minecraft:cactus_green", "minecraft:green_dye", true);
renameMaterial("minecraft:sign", "minecraft:oak_sign");
renameMaterial("minecraft:wall_sign", "minecraft:oak_wall_sign");
renameMaterial("minecraft:stone_slab", "minecraft:smooth_stone_slab");
renameMaterial("minecraft:rose_red", "minecraft:red_dye");
renameMaterial("minecraft:dandelion_yellow", "minecraft:yellow_dye");
renameMaterial("minecraft:cactus_green", "minecraft:green_dye");
}
config.set("previousMinecraftVersion", currentMinecraftVersion);
logblock.saveConfig();
}
private void renameMaterial(String oldName, String newName, boolean mergeOnCollision) {
logblock.getLogger().info("[Updater] Renaming " + oldName + " to " + newName);
private void renameMaterial(String oldName, String newName) {
final Connection conn = logblock.getConnection();
try {
conn.setAutoCommit(false);
PreparedStatement stSelectMaterial = conn.prepareStatement("SELECT id FROM `lb-materials` WHERE name = ?");
stSelectMaterial.setString(1, oldName);
ResultSet rs = stSelectMaterial.executeQuery();
if (!rs.next()) {
logblock.getLogger().info("[Updater] Skipped because " + oldName + " does not exist..");
} else {
if (rs.next()) {
logblock.getLogger().info("[Updater] Updating " + oldName + " to " + newName);
int oldId = rs.getInt(1);
stSelectMaterial.setString(1, newName);
rs = stSelectMaterial.executeQuery();
if (rs.next()) {
int newId = rs.getInt(1);
if (!mergeOnCollision) {
logblock.getLogger().info("[Updater] Skipped because " + newName + " already exists..");
} else {
Statement st = conn.createStatement();
int rows = 0;
for (final WorldConfig wcfg : getLoggedWorlds()) {
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-blocks` SET replaced = " + newId + " WHERE replaced = " + oldId);
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-blocks` SET type = " + newId + " WHERE type = " + oldId);
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-chestdata` SET itemtype = " + newId + " WHERE itemtype = " + oldId);
}
st.execute("DELETE FROM `lb-materials` WHERE id = " + oldId);
st.close();
logblock.getLogger().info("[Updater] Successfully merged " + rows + " entries..");
int newId = MaterialConverter.getOrAddMaterialId(newName);
Statement st = conn.createStatement();
int rows = 0;
for (final WorldConfig wcfg : getLoggedWorlds()) {
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-blocks` SET replaced = " + newId + " WHERE replaced = " + oldId);
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-blocks` SET type = " + newId + " WHERE type = " + oldId);
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-chestdata` SET itemtype = " + newId + " WHERE itemtype = " + oldId);
if (wcfg.isLogging(Logging.KILL)) {
rows += st.executeUpdate("UPDATE `" + wcfg.table + "-kills` SET weapon = " + newId + " WHERE weapon = " + oldId);
}
} else {
PreparedStatement stRenameMaterial = conn.prepareStatement("UPDATE `lb-materials` SET name = ? WHERE id = ?");
stRenameMaterial.setString(1, newName);
stRenameMaterial.setInt(2, oldId);
if (stRenameMaterial.executeUpdate() > 0) {
logblock.getLogger().info("[Updater] Successfully renamed..");
}
stRenameMaterial.close();
}
st.close();
if (rows > 0) {
logblock.getLogger().info("[Updater] Successfully updated " + rows + " entries..");
}
}
stSelectMaterial.close();