Write static_rune_lookup from the loaded race and class caches at world boot

The DB views char_perAccount and dyn_trash_detail lost their race and class
names when 2.11 dropped the Phase 2 tables. The world server now rewrites the
generated static_rune_lookup table (ID, type, name) after the second
Race.loadAllRaces(): 26 player races, 4 base classes, the promotion runes and
the CSR promotion rows 2901-2911. One transaction (delete, batch insert,
commit); on any failure it rolls back and logs a warning, the boot continues.

Names come from the runes: races use obj_name (as in 2.3), classes the rune
names, so DB typos such as "Theif" become "Thief" in the views. No gameplay
change. Needs JSON-Refactor-Plan/sql/2.12-rune-lookup.sql (table, level
functions, views) run before boot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-23 11:35:58 -04:00
1 parent 8b9aa43c1b
commit db67e56302
3 files changed
+66

No files matched your search

@@ -11,6 +11,10 @@ package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.AbstractGameObject;
import engine.objects.BaseClass;
import engine.objects.PromotionClass;
import engine.objects.Race;
import engine.objects.RuneBase;
import engine.powers.RunePowerEntry;
import org.pmw.tinylog.Logger;
@@ -67,4 +71,58 @@ public class dbRuneBaseHandler extends dbHandlerBase {
Logger.info("read: " + recordsRead + " cached: " + mobPowers.size());
return mobPowers;
}
// static_rune_lookup is generated for the DB views; a failed write must never stop the boot
public static void WRITE_RUNE_LOOKUP() {
int rowsWritten = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM `static_rune_lookup`");
PreparedStatement insertStatement = connection.prepareStatement("INSERT INTO `static_rune_lookup` (`ID`, `type`, `name`) VALUES (?, ?, ?)")) {
connection.setAutoCommit(false);
try {
deleteStatement.executeUpdate();
for (Race race : Race.getAllRaces()) {
addRuneLookupRow(insertStatement, race.getRaceRuneID(), "RACE", race.getName());
rowsWritten++;
}
for (AbstractGameObject baseClass : DbManager.getMap(mbEnums.GameObjectType.BaseClass).values()) {
addRuneLookupRow(insertStatement, baseClass.getObjectUUID(), "BASECLASS", ((BaseClass) baseClass).getName());
rowsWritten++;
}
for (AbstractGameObject promotionClass : DbManager.getMap(mbEnums.GameObjectType.PromotionClass).values()) {
addRuneLookupRow(insertStatement, promotionClass.getObjectUUID(), "PROMOTION", ((PromotionClass) promotionClass).getName());
rowsWritten++;
}
insertStatement.executeBatch();
connection.commit();
} catch (SQLException | RuntimeException e) {
// Roll back before setAutoCommit(true), which would otherwise commit the delete
connection.rollback();
throw e;
} finally {
connection.setAutoCommit(true);
}
} catch (Exception e) {
Logger.warn("static_rune_lookup not written; DB views keep their old names: " + e.getMessage());
return;
}
Logger.info("static_rune_lookup: wrote " + rowsWritten + " rows");
}
private static void addRuneLookupRow(PreparedStatement insertStatement, int runeID, String type, String name) throws SQLException {
insertStatement.setInt(1, runeID);
insertStatement.setString(2, type);
insertStatement.setString(3, name);
insertStatement.addBatch();
}
}
+5
View File
@@ -19,6 +19,7 @@ import engine.util.Hasher;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -174,6 +175,10 @@ public class Race {
return _raceByID.get(id);
}
public static Collection<Race> getAllRaces() {
return _raceByID.values();
}
@Override
public boolean equals(Object object) {
+3
View File
@@ -484,6 +484,9 @@ public class WorldServer {
mbEnums.RaceType.initRaceTypeTables();
Race.loadAllRaces();
Logger.info("Writing rune name lookup for the DB views");
dbRuneBaseHandler.WRITE_RUNE_LOOKUP();
if (ParityCheck.isEnabled()) {
Logger.info("Running DB/JSON parity check");
ParityCheck.run();