Change Preset queries to use PreparedStatements

- Fix bug in /b add not saving elements

- Fix bug in /b who causing error looking up nonbenders

- Change table creation to use proper lengths and primary keys
This commit is contained in:
kingbirdy 2015-08-28 16:00:02 -04:00
parent 36f1ddd285
commit 50c4a65281
5 changed files with 98 additions and 48 deletions

View file

@ -78,6 +78,7 @@ public class AddCommand extends PKCommand {
sender.sendMessage(ChatColor.DARK_AQUA + target.getName() + color + " is also an " + Character.toString(element.charAt(0)).toUpperCase() + element.substring(1) + "bender."); sender.sendMessage(ChatColor.DARK_AQUA + target.getName() + color + " is also an " + Character.toString(element.charAt(0)).toUpperCase() + element.substring(1) + "bender.");
} }
} }
GeneralMethods.saveElements(bPlayer);
Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, type, Result.ADD)); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, type, Result.ADD));
return; return;
} else { } else {

View file

@ -78,9 +78,11 @@ public class PresetCommand extends PKCommand {
sender.sendMessage(ChatColor.RED + "You don't have a preset with that name."); sender.sendMessage(ChatColor.RED + "You don't have a preset with that name.");
return; return;
} }
boolean boundAll = Preset.bindPreset(player, name);
Preset.bindPreset(player, name);
sender.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset."); sender.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset.");
if (!boundAll) {
sender.sendMessage(ChatColor.RED + "Some abilities were not bound because you cannot bend the required element.");
}
return; return;
} else if (Arrays.asList(createaliases).contains(args.get(0)) && hasPermission(sender, "create")) { //bending preset create name } else if (Arrays.asList(createaliases).contains(args.get(0)) && hasPermission(sender, "create")) { //bending preset create name
int limit = GeneralMethods.getMaxPresets(player); int limit = GeneralMethods.getMaxPresets(player);

View file

@ -217,6 +217,9 @@ public class WhoCommand extends PKCommand {
String element = rs2.getString("element"); String element = rs2.getString("element");
messages.add(playerName + " - "); messages.add(playerName + " - ");
if (element == null) {
messages.add(" - Nonbender");
} else {
if (element.contains("a")) if (element.contains("a"))
messages.add(AirMethods.getAirColor() + "- Airbender"); messages.add(AirMethods.getAirColor() + "- Airbender");
if (element.contains("w")) if (element.contains("w"))
@ -227,7 +230,7 @@ public class WhoCommand extends PKCommand {
messages.add(FireMethods.getFireColor() + "- Firebender"); messages.add(FireMethods.getFireColor() + "- Firebender");
if (element.contains("c")) if (element.contains("c"))
messages.add(ChiMethods.getChiColor() + "- Chiblocker"); messages.add(ChiMethods.getChiColor() + "- Chiblocker");
}
if (GeneralMethods.hasRPG()) { if (GeneralMethods.hasRPG()) {
if (RPGMethods.isCurrentAvatar(uuid)) { if (RPGMethods.isCurrentAvatar(uuid)) {
messages.add(GeneralMethods.getAvatarColor() + "Current Avatar"); messages.add(GeneralMethods.getAvatarColor() + "Current Avatar");

View file

@ -8,6 +8,7 @@ import com.projectkorra.projectkorra.storage.DBConnection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -29,6 +30,12 @@ public class Preset {
* presets}, keyed to their UUID * presets}, keyed to their UUID
*/ */
public static ConcurrentHashMap<UUID, List<Preset>> presets = new ConcurrentHashMap<UUID, List<Preset>>(); public static ConcurrentHashMap<UUID, List<Preset>> presets = new ConcurrentHashMap<UUID, List<Preset>>();
static String loadQuery = "SELECT * FROM pk_presets WHERE uuid = ?";
static String loadNameQuery = "SELECT * FROM pk_presets WHERE uuid = ? AND name = ?";
static String deleteQuery = "DELETE FROM pk_presets WHERE uuid = ? AND name = ?";
static String insertQuery = "INSERT INTO pk_presets (uuid, name) VALUES (?, ?)";
static String updateQuery1 = "UPDATE pk_presets SET slot";
static String updateQuery2 = " = ? WHERE uuid = ? AND name = ?";
UUID uuid; UUID uuid;
HashMap<Integer, String> abilities; HashMap<Integer, String> abilities;
@ -74,21 +81,23 @@ public class Preset {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
if (uuid == null) if (uuid == null)
return; return;
ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_presets WHERE uuid = '" + uuid.toString() + "'");
try { try {
if (rs2.next()) { // Presets exist. PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(loadQuery);
ps.setString(1, uuid.toString());
ResultSet rs = ps.executeQuery();
if (rs.next()) { // Presets exist.
int i = 0; int i = 0;
do { do {
HashMap<Integer, String> moves = new HashMap<Integer, String>(); HashMap<Integer, String> moves = new HashMap<Integer, String>();
for (int total = 1; total <= 9; total++) { for (int total = 1; total <= 9; total++) {
String slot = rs2.getString("slot" + total); String slot = rs.getString("slot" + total);
if (slot != null) if (slot != null)
moves.put(total, slot); moves.put(total, slot);
} }
new Preset(uuid, rs2.getString("name"), moves); new Preset(uuid, rs.getString("name"), moves);
i++; i++;
} }
while (rs2.next()); while (rs.next());
ProjectKorra.log.info("Loaded " + i + " presets for " + player.getName()); ProjectKorra.log.info("Loaded " + i + " presets for " + player.getName());
} }
} }
@ -104,19 +113,33 @@ public class Preset {
* *
* @param player The Player the Preset should be bound for * @param player The Player the Preset should be bound for
* @param name The name of the Preset that should be bound * @param name The name of the Preset that should be bound
* @return True if all abilities were successfully bound, or false otherwise
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void bindPreset(Player player, String name) { public static boolean bindPreset(Player player, String name) {
BendingPlayer bPlayer = GeneralMethods.getBendingPlayer(player.getName()); BendingPlayer bPlayer = GeneralMethods.getBendingPlayer(player.getName());
if (bPlayer == null) if (bPlayer == null)
return; return false;
if (!presets.containsKey(player.getUniqueId())) if (!presets.containsKey(player.getUniqueId()))
return; return false;
HashMap<Integer, String> abilities = null;
for (Preset preset : presets.get(player.getUniqueId())) { for (Preset preset : presets.get(player.getUniqueId())) {
if (preset.name.equalsIgnoreCase(name)) { // We found it if (preset.name.equalsIgnoreCase(name)) { // We found it
bPlayer.setAbilities((HashMap<Integer, String>) preset.abilities.clone()); abilities = (HashMap<Integer, String>) preset.abilities.clone();
} }
} }
if (abilities == null) {
}
boolean boundAll = true;
for (int i = 1; i <= 9; i++) {
if (!GeneralMethods.canBend(player.getName(), abilities.get(i))) {
abilities.remove(i);
boundAll = false;
}
}
bPlayer.setAbilities(abilities);
return boundAll;
} }
/** /**
@ -177,9 +200,17 @@ public class Preset {
* Deletes the Preset from the database. * Deletes the Preset from the database.
*/ */
public void delete() { public void delete() {
DBConnection.sql.modifyQuery("DELETE FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); try {
PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(deleteQuery);
ps.setString(1, uuid.toString());
ps.setString(2, name);
ps.execute();
presets.get(uuid).remove(this); presets.get(uuid).remove(this);
} }
catch (SQLException e) {
e.printStackTrace();
}
}
/** /**
* Gets the name of the preset. * Gets the name of the preset.
@ -194,26 +225,39 @@ public class Preset {
* Saves the Preset to the database. * Saves the Preset to the database.
*/ */
public void save() { public void save() {
if (ProjectKorra.plugin.getConfig().getString("Storage.engine").equalsIgnoreCase("mysql")) { try {
DBConnection.sql.modifyQuery("INSERT INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "') " + "ON DUPLICATE KEY UPDATE name=VALUES(name)"); PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(loadNameQuery);
} else { ps.setString(1, uuid.toString());
// DBConnection.sql.modifyQuery("INSERT OR IGNORE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')"); ps.setString(2, name);
// DBConnection.sql.modifyQuery("UPDATE pk_presets SET uuid = '" + uuid.toString() + "', name = '" + name + "'"); ResultSet rs = ps.executeQuery();
DBConnection.sql.modifyQuery("INSERT OR REPLACE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')"); if (!rs.next()) { //if the preset doesn't exist in the DB, create it
ps = DBConnection.sql.getConnection().prepareStatement(insertQuery);
ps.setString(1, uuid.toString());
ps.setString(2, name);
ps.execute();
} }
}
/* catch (SQLException e) {
* Now we know the preset exists in the SQL table, so we can manipulate e.printStackTrace();
* it normally. }
*/ for (Integer i : abilities.keySet()) {
new BukkitRunnable() { new BukkitRunnable() {
PreparedStatement ps;
@Override @Override
public void run() { public void run() {
for (Integer i : abilities.keySet()) { try {
DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot" + i + " = '" + abilities.get(i) + "' WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); ps = DBConnection.sql.getConnection().prepareStatement(updateQuery1 + i + updateQuery2);
ps.setString(1, abilities.get(i));
ps.setString(2, uuid.toString());
ps.setString(3, name);
ps.execute();
}
catch (SQLException e) {
e.printStackTrace();
} }
} }
}.runTaskAsynchronously(ProjectKorra.plugin); }.runTaskAsynchronously(ProjectKorra.plugin);
} }
}
} }

View file

@ -28,13 +28,13 @@ public class DBConnection {
if (!sql.tableExists("pk_players")) { if (!sql.tableExists("pk_players")) {
ProjectKorra.log.info("Creating pk_players table"); ProjectKorra.log.info("Creating pk_players table");
String query = "CREATE TABLE `pk_players` (" + "`id` int(32) NOT NULL AUTO_INCREMENT," + "`uuid` varchar(255)," + "`player` varchar(255)," + "`element` varchar(255)," + "`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 (id));"; String query = "CREATE TABLE `pk_players` (" + "`uuid` varchar(36) NOT NULL," + "`player` varchar(16) NOT NULL," + "`element` varchar(5)," + "`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));";
sql.modifyQuery(query); sql.modifyQuery(query);
} }
if (!sql.tableExists("pk_presets")) { if (!sql.tableExists("pk_presets")) {
ProjectKorra.log.info("Creating pk_presets table"); ProjectKorra.log.info("Creating pk_presets table");
String query = "CREATE TABLE `pk_presets` (" + "`id` int(32) NOT NULL AUTO_INCREMENT," + "`uuid` varchar(255)," + "`name` varchar(255)," + "`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 (id));"; String query = "CREATE TABLE `pk_presets` (" + "`uuid` varchar(36) NOT NULL," + "`name` varchar(255) NOT NULL," + "`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, name));";
sql.modifyQuery(query); sql.modifyQuery(query);
} }
} else { } else {
@ -48,13 +48,13 @@ public class DBConnection {
isOpen = true; isOpen = true;
if (!sql.tableExists("pk_players")) { if (!sql.tableExists("pk_players")) {
ProjectKorra.log.info("Creating pk_players table."); ProjectKorra.log.info("Creating pk_players table.");
String query = "CREATE TABLE `pk_players` (" + "`id` INTEGER PRIMARY KEY," + "`uuid` TEXT(255)," + "`player` TEXT(255)," + "`element` TEXT(255)," + "`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));"; String query = "CREATE TABLE `pk_players` (" + "`uuid` TEXT(36) PRIMARY KEY," + "`player` TEXT(16)," + "`element` TEXT(255)," + "`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));";
sql.modifyQuery(query); sql.modifyQuery(query);
} }
if (!sql.tableExists("pk_presets")) { if (!sql.tableExists("pk_presets")) {
ProjectKorra.log.info("Creating pk_presets table"); ProjectKorra.log.info("Creating pk_presets table");
String query = "CREATE TABLE `pk_presets` (" + "`id` INTEGER PRIMARY KEY," + "`uuid` TEXT(255)," + "`name` TEXT(255)," + "`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));"; String query = "CREATE TABLE `pk_presets` (" + "`uuid` TEXT(36)," + "`name` TEXT(255)," + "`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)," + "PRIMARY KEY (uuid, name));";
sql.modifyQuery(query); sql.modifyQuery(query);
} }
} }