Can someone check over my database code for me?

Discussion in 'Spigot Plugin Development' started by DotRar, May 26, 2016.

?

Does it work?

  1. Yes

    0 vote(s)
    0.0%
  2. No (Please comment. Pretty please?)

    100.0%
  1. I'm purchasing a dedicated server soon to setup a minecraft network, could someone please double check my database code and check if something is going to go horribly wrong please as this is my first time working with databases?


    Code (Text):

    package com.perkelle.dev.eco;

    import com.perkelle.dev.eco.utils.FileManager;
    import org.bukkit.Bukkit;
    import org.bukkit.plugin.Plugin;

    import java.sql.*;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Executors;

    public enum DB {

        INSTANCE;

        private FileManager fm = new FileManager();

        private Plugin pl;

        private Connection conn;

        private Calendar c = Calendar.getInstance();

        public void openConnection(Plugin pl) {
            this.pl = pl;

            String host = fm.getConfig().getString("db.host"),
                    username = fm.getConfig().getString("db.username"),
                    password = fm.getConfig().getString("db.password"),
                    database = fm.getConfig().getString("db.database");
            int port = fm.getConfig().getInt("db.port");

            try {
                if (conn != null && !conn.isClosed()) return;
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password);

                Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                    public void run() {
                        try {
                            PreparedStatement eco = conn.prepareStatement("CREATE TABLE IF NOT EXISTS eco(UUID VARCHAR(32), SHARDS INT, CRYSTALS INT);");
                            eco.execute();
                            eco.close();

                            PreparedStatement tntPerks = conn.prepareStatement("CREATE TABLE IF NOT EXISTS tntperks(UUID VARCHAR(32), PERKS TEXT);");
                            tntPerks.execute();
                            tntPerks.close();

                            PreparedStatement doubleCoins = conn.prepareStatement("CREATE TABLE IF NOT EXISTS doubleCoins(NAME VARCHAR(16), SECONDS MEDIUMINT(7));");
                            doubleCoins.execute();
                            doubleCoins.close();
                        } catch(SQLException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch(ClassNotFoundException e) {
                System.out.println("com.mysql.jdbc.Driver is not installed!");
                Core.disablePlugin();
            } catch(SQLException e) {
                e.printStackTrace();
                Core.disablePlugin();
                return;
            }
        }

        public void closeConnection() {
            try {
                conn.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }

        public int getShards(final String uuid) {
            Callable<Integer> task = new Callable<Integer>() {
                public Integer call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT * FROM eco WHERE UUID = '"+uuid+"';");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return Integer.parseInt(resultSet.getString("SHARDS"));
                        } catch(Exception e) {
                            return 0;
                        }
                    }

                    return 0;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return 0;
            } catch(ExecutionException e) {
                return 0;
            }
        }

        public int getCrystals(final String uuid) {
            Callable<Integer> task = new Callable<Integer>() {
                public Integer call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT CRYSTALS FROM eco WHERE UUID = '"+uuid+"';");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return Integer.parseInt(resultSet.getString("CRYSTALS"));
                        } catch (Exception e) {
                            return 0;
                        }
                    }
                    return 0;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return 0;
            } catch(ExecutionException e) {
                return 0;
            }
        }

        public void addShards(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+(getShards(uuid)+amount)+","+getCrystals(uuid)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void addCrystals(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    String toExecute;
                    switch(c.get(Calendar.DAY_OF_WEEK)) {
                        case Calendar.FRIDAY: {
                            toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        }
                        case Calendar.SATURDAY: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        case Calendar.SUNDAY: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        default: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+amount+";";
                    }
                    toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid)+amount)+";";
                    try {
                        PreparedStatement ps = conn.prepareStatement(toExecute);
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void removeShards(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+(getShards(uuid)-amount)+","+getCrystals(uuid)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void removeCrystals(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid)-amount)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public List<String> getTNTPerks(final String uuid) {
            Callable<List<String>> task = new Callable<List<String>>() {
                public List<String> call() {
                    List<String> perks = new ArrayList<String>();
                    try {
                        PreparedStatement ps = conn.prepareStatement("SELECT * FROM tntperks WHERE UUID = '"+uuid+"');");
                        ResultSet resultSet = ps.executeQuery();
                        ps.close();
                        if(resultSet.first()) {
                            String result = resultSet.getString("PERKS");
                            for (String perk : result.split(",")) {
                                perks.add(perk);
                            }
                        }
                        return perks;
                    } catch(SQLException e) {
                        return perks;
                    }
                }
            };

            try {
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(ExecutionException e) {
                return new ArrayList<String>();
            } catch(InterruptedException e) {
                return new ArrayList<String>();
            }
        }

        public String getRawTNTPerks(final String uuid) {
            Callable<String> task = new Callable<String>() {
                public String call() {
                    String query = "SELECT * FROM tntperks WHERE UUID = '"+uuid+"');";
                    try {
                        PreparedStatement ps = conn.prepareStatement(query);
                        ResultSet resultSet = ps.executeQuery();
                        ps.close();
                        if(resultSet.first()) {
                            return resultSet.getString("PERKS");
                        }
                        return "";
                    } catch(SQLException e) {
                        return "";
                    }
                }
            };

            try {
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(ExecutionException e) {
                return "";
            } catch(InterruptedException e) {
                return "";
            }
        }

        public void addPerk(final String uuid, final String perk) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    String perks = getRawTNTPerks(uuid);
                    StringBuilder builder = new StringBuilder();

                    if(perks.equals("")) {
                        builder.append(perk);
                    }
                    else if(perks.endsWith(",")) {
                        builder.append(perk);
                    }
                    else {
                        builder.append(","+perk);
                    }

                    perks = builder.toString();

                    String toExecute = "REPLACE INTO tntperks(UUID, PERKS) VALUES("+uuid+","+perks+");";

                    try {
                        PreparedStatement ps = conn.prepareStatement(toExecute);
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public boolean hasPerk(final String uuid, final String perk) {
            List<String> perks = getTNTPerks(uuid);
            return perks.contains(perk);
        }

        public boolean isDoubleCoins() {
            switch(c.get(Calendar.DAY_OF_WEEK)) {
                case Calendar.FRIDAY: return true;
                case Calendar.SATURDAY: return true;
                case Calendar.SUNDAY: return true;
            }

            return isBooster();
        }

        public boolean isBooster() {
            Callable<Boolean> task = new Callable<Boolean>() {
                public Boolean call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT COUNT (*) FROM doubleCoins;");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            int i = resultSet.getInt("COUNT(*)");
                            if(i == 0) return false;
                            else return true;
                        } catch (Exception e) {
                            return false;
                        }
                    }
                    return false;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return false;
            } catch(ExecutionException e) {
                return false;
            }
        }

        public String getBoosterActivator() {
            if(!isBooster()) return "";

            Callable<String> task = new Callable<String>() {
                public String call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT * FROM doubleCoins;");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return resultSet.getString("name");
                        } catch (Exception e) {
                            return "";
                        }
                    }
                    return "";
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return "";
            } catch(ExecutionException e) {
                return "";
            }
        }
    }
    /CODE]
     
    #1 DotRar, May 26, 2016
    Last edited: May 26, 2016
  2. This is your 3rd post today. You need to do research yourself.

    In this case, you could set up a custom SQL database using something like phpMyAdmin and test it yourself
     
    • Agree Agree x 2
  3. You aren't using PreparedStatements, your code is vulnerable to SQL injection. Other than that, it doesn't look like your database will blow up.
     
    • Agree Agree x 2
  4. How is it vulnerable?
     
  5. Don't use PMA, there are a fuck ton of exploits that don't even have CVE's yet. Mostly to add your server to a botnet, but also load_file() among many other things.
    Use MongoDB because it doesn't use queries and deters most skids.
     
  6. Or, use the database that would fit his case more (which, in this case is an SQL variant).

    Mainly vulnerable through websites, small chances of it happening on a server, but they are still there. Best practice is to avoid regular types, and use PreparedStatement s when possible to avoid any possibility of the injection.
     
  7. I may consider moving to MongoDB, MariaDB or something else in the future but I want to keep MySQL for now as I have had a little bit of experience with it. Won't use PMA ;)

    The database won't be touched within a website, only through the mc servers. And then the only thing that is retrieved from the player is their name and UUID.

    As for prepared statements, would this work?:
    Code (Text):
    public String getRawTNTPerks(final String uuid) {
            Callable<String> task = new Callable<String>() {
                public String call() {
                    String query = "SELECT * FROM tntperks WHERE UUID = '"+uuid+"');";
                    try {
                        ResultSet resultSet = conn.prepareStatement(query).executeQuery();
                        if(resultSet.first()) {
                            String result = resultSet.getString("PERKS");
                            return result;
                        }
                        return "";
                    } catch(SQLException e) {
                        return "";
                    }
                }
            };

            try {
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(ExecutionException e) {
                return "";
            } catch(InterruptedException e) {
                return "";
            }
        }
     
  8. Ok I just updated the code to use PreparedStatements. Does it look ok?:

    Code (Text):
    package com.perkelle.dev.eco;

    import com.perkelle.dev.eco.utils.FileManager;
    import org.bukkit.Bukkit;
    import org.bukkit.plugin.Plugin;

    import java.sql.*;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Executors;

    public enum DB {

        INSTANCE;

        private FileManager fm = new FileManager();

        private Plugin pl;

        private Connection conn;

        private Calendar c = Calendar.getInstance();

        public void openConnection(Plugin pl) {
            this.pl = pl;

            String host = fm.getConfig().getString("db.host"),
                    username = fm.getConfig().getString("db.username"),
                    password = fm.getConfig().getString("db.password"),
                    database = fm.getConfig().getString("db.database");
            int port = fm.getConfig().getInt("db.port");

            try {
                if (conn != null && !conn.isClosed()) return;
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password);

                Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                    public void run() {
                        try {
                            PreparedStatement eco = conn.prepareStatement("CREATE TABLE IF NOT EXISTS eco(UUID VARCHAR(32), SHARDS INT, CRYSTALS INT);");
                            eco.execute();
                            eco.close();

                            PreparedStatement tntPerks = conn.prepareStatement("CREATE TABLE IF NOT EXISTS tntperks(UUID VARCHAR(32), PERKS TEXT);");
                            tntPerks.execute();
                            tntPerks.close();

                            PreparedStatement doubleCoins = conn.prepareStatement("CREATE TABLE IF NOT EXISTS doubleCoins(NAME VARCHAR(16), SECONDS MEDIUMINT(7));");
                            doubleCoins.execute();
                            doubleCoins.close();
                        } catch(SQLException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch(ClassNotFoundException e) {
                System.out.println("com.mysql.jdbc.Driver is not installed!");
                Core.disablePlugin();
            } catch(SQLException e) {
                e.printStackTrace();
                Core.disablePlugin();
                return;
            }
        }

        public void closeConnection() {
            try {
                conn.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }

        public int getShards(final String uuid) {
            Callable<Integer> task = new Callable<Integer>() {
                public Integer call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT * FROM eco WHERE UUID = '"+uuid+"';");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return Integer.parseInt(resultSet.getString("SHARDS"));
                        } catch(Exception e) {
                            return 0;
                        }
                    }

                    return 0;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return 0;
            } catch(ExecutionException e) {
                return 0;
            }
        }

        public int getCrystals(final String uuid) {
            Callable<Integer> task = new Callable<Integer>() {
                public Integer call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT CRYSTALS FROM eco WHERE UUID = '"+uuid+"';");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return Integer.parseInt(resultSet.getString("CRYSTALS"));
                        } catch (Exception e) {
                            return 0;
                        }
                    }
                    return 0;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return 0;
            } catch(ExecutionException e) {
                return 0;
            }
        }

        public void addShards(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+(getShards(uuid)+amount)+","+getCrystals(uuid)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void addCrystals(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    String toExecute;
                    switch(c.get(Calendar.DAY_OF_WEEK)) {
                        case Calendar.FRIDAY: {
                            toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        }
                        case Calendar.SATURDAY: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        case Calendar.SUNDAY: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+(amount*2)+";";
                        default: toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid))+amount+";";
                    }
                    toExecute = "REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid)+amount)+";";
                    try {
                        PreparedStatement ps = conn.prepareStatement(toExecute);
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void removeShards(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+(getShards(uuid)-amount)+","+getCrystals(uuid)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public void removeCrystals(final String uuid, final int amount) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    try {
                        PreparedStatement ps = conn.prepareStatement("REPLACE INTO eco(UUID, SHARDS, CRYSTALS) VALUES("+uuid+","+getShards(uuid)+","+(getCrystals(uuid)-amount)+";");
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public List<String> getTNTPerks(final String uuid) {
            Callable<List<String>> task = new Callable<List<String>>() {
                public List<String> call() {
                    List<String> perks = new ArrayList<String>();
                    try {
                        PreparedStatement ps = conn.prepareStatement("SELECT * FROM tntperks WHERE UUID = '"+uuid+"');");
                        ResultSet resultSet = ps.executeQuery();
                        ps.close();
                        if(resultSet.first()) {
                            String result = resultSet.getString("PERKS");
                            for (String perk : result.split(",")) {
                                perks.add(perk);
                            }
                        }
                        return perks;
                    } catch(SQLException e) {
                        return perks;
                    }
                }
            };

            try {
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(ExecutionException e) {
                return new ArrayList<String>();
            } catch(InterruptedException e) {
                return new ArrayList<String>();
            }
        }

        public String getRawTNTPerks(final String uuid) {
            Callable<String> task = new Callable<String>() {
                public String call() {
                    String query = "SELECT * FROM tntperks WHERE UUID = '"+uuid+"');";
                    try {
                        PreparedStatement ps = conn.prepareStatement(query);
                        ResultSet resultSet = ps.executeQuery();
                        ps.close();
                        if(resultSet.first()) {
                            return resultSet.getString("PERKS");
                        }
                        return "";
                    } catch(SQLException e) {
                        return "";
                    }
                }
            };

            try {
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(ExecutionException e) {
                return "";
            } catch(InterruptedException e) {
                return "";
            }
        }

        public void addPerk(final String uuid, final String perk) {
            Bukkit.getServer().getScheduler().runTaskAsynchronously(pl, new Runnable() {
                public void run() {
                    String perks = getRawTNTPerks(uuid);
                    StringBuilder builder = new StringBuilder();

                    if(perks.equals("")) {
                        builder.append(perk);
                    }
                    else if(perks.endsWith(",")) {
                        builder.append(perk);
                    }
                    else {
                        builder.append(","+perk);
                    }

                    perks = builder.toString();

                    String toExecute = "REPLACE INTO tntperks(UUID, PERKS) VALUES("+uuid+","+perks+");";

                    try {
                        PreparedStatement ps = conn.prepareStatement(toExecute);
                        ps.execute();
                        ps.close();
                    } catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public boolean hasPerk(final String uuid, final String perk) {
            List<String> perks = getTNTPerks(uuid);
            return perks.contains(perk);
        }

        public boolean isDoubleCoins() {
            switch(c.get(Calendar.DAY_OF_WEEK)) {
                case Calendar.FRIDAY: return true;
                case Calendar.SATURDAY: return true;
                case Calendar.SUNDAY: return true;
            }

            return isBooster();
        }

        public boolean isBooster() {
            Callable<Boolean> task = new Callable<Boolean>() {
                public Boolean call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT COUNT (*) FROM doubleCoins;");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            int i = resultSet.getInt("COUNT(*)");
                            if(i == 0) return false;
                            else return true;
                        } catch (Exception e) {
                            return false;
                        }
                    }
                    return false;
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return false;
            } catch(ExecutionException e) {
                return false;
            }
        }

        public String getBoosterActivator() {
            if(!isBooster()) return "";

            Callable<String> task = new Callable<String>() {
                public String call() throws Exception {
                    PreparedStatement ps = conn.prepareStatement("SELECT * FROM doubleCoins;");
                    ResultSet resultSet = ps.executeQuery();
                    ps.close();

                    if(resultSet.first()) {
                        try {
                            return resultSet.getString("name");
                        } catch (Exception e) {
                            return "";
                        }
                    }
                    return "";
                }
            };

            try{
                return Executors.newSingleThreadExecutor().submit(task).get();
            } catch(InterruptedException e) {
                return "";
            } catch(ExecutionException e) {
                return "";
            }
        }
    }
     
     
  9. The table for double coins what would happen if the player changes there name would anything explode or doesn't it matter?
     
  10. Only their name is referenced and then it is removed after an hour
     
  11. Code (Java):
    PreparedStatement stmt = connection.prepareStatement("SELECT * FROM `optimus_profiles` WHERE `uuid`=?;");
    stmt.setString(1, player.getUniqueId().toString());
    ResultSet results = stmt.executeQuery();
    if(results.next()){
            // Code here...
    }