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.");
}
}
GeneralMethods.saveElements(bPlayer);
Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, type, Result.ADD));
return;
} 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.");
return;
}
Preset.bindPreset(player, name);
boolean boundAll = Preset.bindPreset(player, name);
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;
} else if (Arrays.asList(createaliases).contains(args.get(0)) && hasPermission(sender, "create")) { //bending preset create name
int limit = GeneralMethods.getMaxPresets(player);

View file

@ -217,17 +217,20 @@ public class WhoCommand extends PKCommand {
String element = rs2.getString("element");
messages.add(playerName + " - ");
if (element.contains("a"))
messages.add(AirMethods.getAirColor() + "- Airbender");
if (element.contains("w"))
messages.add(WaterMethods.getWaterColor() + "- Waterbender");
if (element.contains("e"))
messages.add(EarthMethods.getEarthColor() + "- Earthbender");
if (element.contains("f"))
messages.add(FireMethods.getFireColor() + "- Firebender");
if (element.contains("c"))
messages.add(ChiMethods.getChiColor() + "- Chiblocker");
if (element == null) {
messages.add(" - Nonbender");
} else {
if (element.contains("a"))
messages.add(AirMethods.getAirColor() + "- Airbender");
if (element.contains("w"))
messages.add(WaterMethods.getWaterColor() + "- Waterbender");
if (element.contains("e"))
messages.add(EarthMethods.getEarthColor() + "- Earthbender");
if (element.contains("f"))
messages.add(FireMethods.getFireColor() + "- Firebender");
if (element.contains("c"))
messages.add(ChiMethods.getChiColor() + "- Chiblocker");
}
if (GeneralMethods.hasRPG()) {
if (RPGMethods.isCurrentAvatar(uuid)) {
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.scheduler.BukkitRunnable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
@ -29,6 +30,12 @@ public class Preset {
* presets}, keyed to their UUID
*/
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;
HashMap<Integer, String> abilities;
@ -74,21 +81,23 @@ public class Preset {
UUID uuid = player.getUniqueId();
if (uuid == null)
return;
ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_presets WHERE uuid = '" + uuid.toString() + "'");
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;
do {
HashMap<Integer, String> moves = new HashMap<Integer, String>();
for (int total = 1; total <= 9; total++) {
String slot = rs2.getString("slot" + total);
String slot = rs.getString("slot" + total);
if (slot != null)
moves.put(total, slot);
}
new Preset(uuid, rs2.getString("name"), moves);
new Preset(uuid, rs.getString("name"), moves);
i++;
}
while (rs2.next());
while (rs.next());
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 name The name of the Preset that should be bound
* @return True if all abilities were successfully bound, or false otherwise
*/
@SuppressWarnings("unchecked")
public static void bindPreset(Player player, String name) {
public static boolean bindPreset(Player player, String name) {
BendingPlayer bPlayer = GeneralMethods.getBendingPlayer(player.getName());
if (bPlayer == null)
return;
return false;
if (!presets.containsKey(player.getUniqueId()))
return;
return false;
HashMap<Integer, String> abilities = null;
for (Preset preset : presets.get(player.getUniqueId())) {
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,8 +200,16 @@ public class Preset {
* Deletes the Preset from the database.
*/
public void delete() {
DBConnection.sql.modifyQuery("DELETE FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'");
presets.get(uuid).remove(this);
try {
PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(deleteQuery);
ps.setString(1, uuid.toString());
ps.setString(2, name);
ps.execute();
presets.get(uuid).remove(this);
}
catch (SQLException e) {
e.printStackTrace();
}
}
/**
@ -194,26 +225,39 @@ public class Preset {
* Saves the Preset to the database.
*/
public void save() {
if (ProjectKorra.plugin.getConfig().getString("Storage.engine").equalsIgnoreCase("mysql")) {
DBConnection.sql.modifyQuery("INSERT INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "') " + "ON DUPLICATE KEY UPDATE name=VALUES(name)");
} else {
// DBConnection.sql.modifyQuery("INSERT OR IGNORE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')");
// DBConnection.sql.modifyQuery("UPDATE pk_presets SET uuid = '" + uuid.toString() + "', name = '" + name + "'");
DBConnection.sql.modifyQuery("INSERT OR REPLACE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')");
}
/*
* Now we know the preset exists in the SQL table, so we can manipulate
* it normally.
*/
new BukkitRunnable() {
@Override
public void run() {
for (Integer i : abilities.keySet()) {
DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot" + i + " = '" + abilities.get(i) + "' WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'");
}
try {
PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(loadNameQuery);
ps.setString(1, uuid.toString());
ps.setString(2, name);
ResultSet rs = ps.executeQuery();
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();
}
}.runTaskAsynchronously(ProjectKorra.plugin);
}
}
catch (SQLException e) {
e.printStackTrace();
}
for (Integer i : abilities.keySet()) {
new BukkitRunnable() {
PreparedStatement ps;
@Override
public void run() {
try {
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);
}
}
}

View file

@ -28,13 +28,13 @@ public class DBConnection {
if (!sql.tableExists("pk_players")) {
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);
}
if (!sql.tableExists("pk_presets")) {
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);
}
} else {
@ -48,13 +48,13 @@ public class DBConnection {
isOpen = true;
if (!sql.tableExists("pk_players")) {
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);
}
if (!sql.tableExists("pk_presets")) {
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);
}
}