Stop saving booleans as text and running database calls on BendingPlayer construction

This commit is contained in:
Alexander Meech 2019-08-19 14:14:54 -04:00
parent d9e8e9f4ff
commit 8530c75ba6
3 changed files with 65 additions and 32 deletions

View file

@ -82,7 +82,7 @@ public class BendingPlayer {
this.elements = elements;
this.subelements = subelements;
this.abilities = new String[9];
this.setAbilities(abilities);
System.arraycopy(abilities, 0, this.abilities, 0, abilities.length);
this.permaRemoved = permaRemoved;
this.player = Bukkit.getPlayer(uuid);
this.toggled = true;

View file

@ -336,9 +336,10 @@ public class GeneralMethods {
}
private static void createBendingPlayerAsynchronously(final UUID uuid, final String player) {
try (ResultSet rs = DBConnection.sql.readQuery("SELECT * FROM pk_players WHERE uuid = '" + uuid.toString() + "'")) {
ResultSet rs = DBConnection.sql.readQuery("SELECT * FROM pk_players WHERE uuid = '" + uuid.toString() + "'");
try {
if (!rs.next()) { // Data doesn't exist, we want a completely new player.
DBConnection.sql.modifyQuery("INSERT INTO pk_players (uuid, player, slot1, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9) VALUES ('" + uuid.toString() + "', '" + player + "', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null')");
DBConnection.sql.modifyQuery("INSERT INTO pk_players (uuid, player, slot1, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9) VALUES ('" + uuid.toString() + "', '" + player + "', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null', 'null');");
new BukkitRunnable() {
@Override
public void run() {
@ -350,12 +351,11 @@ public class GeneralMethods {
// The player has at least played before.
final String player2 = rs.getString("player");
if (!player.equalsIgnoreCase(player2)) {
DBConnection.sql.modifyQuery("UPDATE pk_players SET player = '" + player + "' WHERE uuid = '" + uuid.toString() + "'");
DBConnection.sql.modifyQuery("UPDATE pk_players SET player = '" + player + "' WHERE uuid = '" + uuid.toString() + "';");
// They have changed names.
ProjectKorra.log.info("Updating Player Name for " + player);
}
final String permarem = rs.getString("permaremoved");
boolean permaremoved = permarem != null && permarem.equals("true");
final boolean permaremoved = rs.getBoolean("permaremoved");
final List<Element> elements = new ArrayList<>();
final List<SubElement> subelements = new ArrayList<>();
final String[] abilities = new String[9];
@ -367,23 +367,21 @@ public class GeneralMethods {
}
}
try (ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_player_elements WHERE uuid = '" + uuid.toString() + "';")) {
while (rs2.next()) {
String elementName = rs2.getString("element");
String subElement = rs2.getString("sub_element");
boolean isSub = subElement != null && subElement.equals("true");
Element element = Element.fromString(elementName);
if (element == null) {
continue;
}
if (isSub) {
subelements.add((SubElement)element);
} else {
elements.add(element);
}
ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_player_elements WHERE uuid = '" + uuid.toString() + "';");
while (rs2.next()) {
String elementName = rs2.getString("element");
boolean isSub = rs2.getBoolean("sub_element");
Element element = Element.fromString(elementName);
if (element == null) {
continue;
}
if (isSub) {
subelements.add((SubElement)element);
} else {
elements.add(element);
}
}
@ -1854,7 +1852,7 @@ public class GeneralMethods {
StringBuilder queryBuilder = new StringBuilder();
e.forEach(element -> {
queryBuilder.append("INSERT INTO pk_player_elements (uuid, element, sub_element) VALUES ('" + uuid + "', '" + element.getName().toLowerCase() + "', '" + String.valueOf(e instanceof SubElement) + "');");
queryBuilder.append("INSERT INTO pk_player_elements (uuid, element, sub_element) VALUES ('" + uuid + "', '" + element.getName().toLowerCase() + "', " + String.valueOf(e instanceof SubElement) + ");");
});
final String query = queryBuilder.toString();
@ -1870,7 +1868,7 @@ public class GeneralMethods {
final String element = e.getName().toLowerCase();
final boolean subElement = e instanceof SubElement;
DBConnection.sql.modifyQuery("INSERT INTO pk_player_elements (uuid, element, sub_element) VALUES ('" + uuid + "', '" + element + "', '" + String.valueOf(subElement) + "');");
DBConnection.sql.modifyQuery("INSERT INTO pk_player_elements (uuid, element, sub_element) VALUES ('" + uuid + "', '" + element + "', " + String.valueOf(subElement) + ");");
}
public static void deleteElements(final BendingPlayer bPlayer, List<Element> e) {
@ -1905,7 +1903,7 @@ public class GeneralMethods {
}
final String uuid = bPlayer.getUUIDString();
final boolean permaRemoved = bPlayer.isPermaRemoved();
DBConnection.sql.modifyQuery("UPDATE pk_players SET permaremoved = '" + String.valueOf(permaRemoved) + "' WHERE uuid = '" + uuid + "'");
DBConnection.sql.modifyQuery("UPDATE pk_players SET permaremoved = " + String.valueOf(permaRemoved) + " WHERE uuid = '" + uuid + "'");
}
public static void setVelocity(final Entity entity, final Vector velocity) {

View file

@ -1,6 +1,7 @@
package com.projectkorra.projectkorra.storage;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.projectkorra.projectkorra.GeneralMethods;
@ -37,14 +38,27 @@ public class DBConnection {
ProjectKorra.log.info("Database connection established.");
if (!sql.tableExists("pk_players")) {
ProjectKorra.log.info("Creating pk_players table");
final String query = "CREATE TABLE `pk_players` (`uuid` varchar(36) NOT NULL, `player` varchar(16) NOT NULL, `permaremoved` varchar(5), `slot1` varchar(255), `slot2` varchar(255), `slot3` varchar(255), `slot4` varchar(255), `slot5` varchar(255), `slot6` varchar(255), `slot7` varchar(255), `slot8` varchar(255), `slot9` varchar(255), PRIMARY KEY (uuid));";
final String query = "CREATE TABLE `pk_players` (`uuid` varchar(36) NOT NULL, `player` varchar(16) NOT NULL, `permaremoved` bool, `slot1` varchar(255), `slot2` varchar(255), `slot3` varchar(255), `slot4` varchar(255), `slot5` varchar(255), `slot6` varchar(255), `slot7` varchar(255), `slot8` varchar(255), `slot9` varchar(255), PRIMARY KEY (uuid));";
sql.modifyQuery(query, false);
} else {
try {
final DatabaseMetaData md = sql.connection.getMetaData();
boolean elementColumn = md.getColumns(null, null, "pk_players", "element").next();
boolean subElementColumn = md.getColumns(null, null, "pk_players", "subelement").next();
if (elementColumn || subElementColumn) {
boolean permaremoveTextColumn = false;
{
ResultSet pr = md.getColumns(null, null, "pk_players", "permaremoved");
if (pr.next()) {
String type = pr.getString("TYPE_NAME");
if (type.toLowerCase().contains("varchar")) {
permaremoveTextColumn = true;
}
}
}
if (elementColumn || subElementColumn || permaremoveTextColumn) {
ProjectKorra.log.info("Updating Database...");
sql.getConnection().setAutoCommit(false);
if (elementColumn) {
@ -53,6 +67,10 @@ public class DBConnection {
if (subElementColumn) {
sql.modifyQuery("ALTER TABLE `pk_players` DROP subelement;", false);
}
if (permaremoveTextColumn) {
sql.modifyQuery("ALTER TABLE `pk_players` DROP permaremoved;", false);
sql.modifyQuery("ALTER TABLE `pk_players` ADD permaremoved BOOL AFTER player;", false);
}
sql.getConnection().commit();
sql.getConnection().setAutoCommit(true);
ProjectKorra.log.info("Database Updated.");
@ -63,7 +81,7 @@ public class DBConnection {
}
if (!sql.tableExists("pk_player_elements")) {
ProjectKorra.log.info("Creating pk_player_elements table");
final String query = "CREATE TABLE `pk_player_elements` (`uuid` varchar(36) NOT NULL, `element` varchar(36) NOT NULL, `sub_element` varchar(5) NOT NULL, PRIMARY KEY (`uuid`, `element`));";
final String query = "CREATE TABLE `pk_player_elements` (`uuid` varchar(36) NOT NULL, `element` varchar(36) NOT NULL, `sub_element` bool NOT NULL, PRIMARY KEY (`uuid`, `element`));";
sql.modifyQuery(query, false);
}
if (!sql.tableExists("pk_presets")) {
@ -91,14 +109,27 @@ public class DBConnection {
isOpen = true;
if (!sql.tableExists("pk_players")) {
ProjectKorra.log.info("Creating pk_players table.");
final String query = "CREATE TABLE `pk_players` (`uuid` TEXT(36) PRIMARY KEY, `player` TEXT(16), `permaremoved` TEXT(5), `slot1` TEXT(255), `slot2` TEXT(255), `slot3` TEXT(255), `slot4` TEXT(255), `slot5` TEXT(255), `slot6` TEXT(255), `slot7` TEXT(255), `slot8` TEXT(255), `slot9` TEXT(255));";
final String query = "CREATE TABLE `pk_players` (`uuid` TEXT(36) PRIMARY KEY, `player` TEXT(16), `permaremoved` INTEGER(1), `slot1` TEXT(255), `slot2` TEXT(255), `slot3` TEXT(255), `slot4` TEXT(255), `slot5` TEXT(255), `slot6` TEXT(255), `slot7` TEXT(255), `slot8` TEXT(255), `slot9` TEXT(255));";
sql.modifyQuery(query, false);
} else {
try {
final DatabaseMetaData md = sql.connection.getMetaData();
boolean elementColumn = md.getColumns(null, null, "pk_players", "element").next();
boolean subElementColumn = md.getColumns(null, null, "pk_players", "subelement").next();
if (elementColumn || subElementColumn) {
boolean permaremoveTextColumn = false;
{
ResultSet pr = md.getColumns(null, null, "pk_players", "permaremoved");
if (pr.next()) {
String type = pr.getString("TYPE_NAME");
if (type.toLowerCase().contains("text")) {
permaremoveTextColumn = true;
}
}
}
if (elementColumn || subElementColumn || permaremoveTextColumn) {
ProjectKorra.log.info("Updating Database...");
sql.getConnection().setAutoCommit(false);
if (elementColumn) {
@ -107,6 +138,10 @@ public class DBConnection {
if (subElementColumn) {
sql.modifyQuery("ALTER TABLE `pk_players` DROP subelement;", false);
}
if (permaremoveTextColumn) {
sql.modifyQuery("ALTER TABLE `pk_players` DROP permaremoved;", false);
sql.modifyQuery("ALTER TABLE `pk_players` ADD permaremoved INTEGER(1) AFTER player;", false);
}
sql.getConnection().commit();
sql.getConnection().setAutoCommit(true);
ProjectKorra.log.info("Database Updated.");
@ -117,7 +152,7 @@ public class DBConnection {
}
if (!sql.tableExists("pk_player_elements")) {
ProjectKorra.log.info("Creating pk_player_elements table");
final String query = "CREATE TABLE `pk_player_elements` (`uuid` TEXT(36) NOT NULL, `element` TEXT(36) NOT NULL, `sub_element` TEXT(5) NOT NULL, PRIMARY KEY (`uuid`, `element`));";
final String query = "CREATE TABLE `pk_player_elements` (`uuid` TEXT(36) NOT NULL, `element` TEXT(36) NOT NULL, `sub_element` INTEGER(1) NOT NULL, PRIMARY KEY (`uuid`, `element`));";
sql.modifyQuery(query, false);
}
if (!sql.tableExists("pk_presets")) {