From 70449399bc03a114241b0586f2aa2e5adb3adf40 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 Jun 2016 21:30:46 +0200 Subject: [PATCH] Added MySQL Support --- config.yml | 26 +++++++++ src/de/epiceric/shopchest/ShopChest.java | 13 +++-- src/de/epiceric/shopchest/config/Config.java | 25 +++++++++ src/de/epiceric/shopchest/sql/Database.java | 55 +++++++------------- src/de/epiceric/shopchest/sql/Error.java | 15 ------ src/de/epiceric/shopchest/sql/Errors.java | 19 ------- src/de/epiceric/shopchest/sql/MySQL.java | 36 +++++++++++++ src/de/epiceric/shopchest/sql/SQLite.java | 44 ++++++++++++++++ 8 files changed, 159 insertions(+), 74 deletions(-) delete mode 100644 src/de/epiceric/shopchest/sql/Error.java delete mode 100644 src/de/epiceric/shopchest/sql/Errors.java create mode 100644 src/de/epiceric/shopchest/sql/MySQL.java create mode 100644 src/de/epiceric/shopchest/sql/SQLite.java diff --git a/config.yml b/config.yml index 04fdfe6..120dd47 100644 --- a/config.yml +++ b/config.yml @@ -72,6 +72,32 @@ blacklist: [] # - "STONE:1" # - "DIAMOND_BLOCK" +database: + + # Select the type of database which should be used + # Either use 'SQLite' or 'MySQL'. Otherwise you will break the plugin! + type: "SQLite" + + # If the specified is 'MySQL', specify the... + # (You can leave this empty if you're using SQLite) + mysql: + + # ...hostname where the database is accessible + hostname: "" + + # ...port where the database is accessible (default: 3306) + port: 3306 + + # ...database you want to use + database: "" + + # ...username you are going to login with + username: "" + + # ...password you are going to login with + # Be careful, as anyone who can read this file, can read the password! + password: "" + # Priority: default < group < player shop-limits: diff --git a/src/de/epiceric/shopchest/ShopChest.java b/src/de/epiceric/shopchest/ShopChest.java index eb495b2..efad496 100644 --- a/src/de/epiceric/shopchest/ShopChest.java +++ b/src/de/epiceric/shopchest/ShopChest.java @@ -11,6 +11,8 @@ import de.epiceric.shopchest.interfaces.utils.*; import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop.ShopType; import de.epiceric.shopchest.sql.Database; +import de.epiceric.shopchest.sql.MySQL; +import de.epiceric.shopchest.sql.SQLite; import de.epiceric.shopchest.utils.Metrics; import de.epiceric.shopchest.utils.Metrics.Graph; import de.epiceric.shopchest.utils.Metrics.Plotter; @@ -66,6 +68,7 @@ public class ShopChest extends JavaPlugin { @Override public void onEnable() { logger = getLogger(); + instance = this; if (getServer().getPluginManager().getPlugin("Vault") == null) { logger.severe("Could not find plugin 'Vault'!"); @@ -121,7 +124,13 @@ public class ShopChest extends JavaPlugin { reloadConfig(); saveDefaultConfig(); - database = new Database(this); + if (Config.database_type() == Database.DatabaseType.SQLite){ + logger.info("Using SQLite"); + database = new SQLite(this); + } else { + logger.info("Using MySQL"); + database = new MySQL(this); + } switch (Utils.getVersion(getServer())) { @@ -161,8 +170,6 @@ public class ShopChest extends JavaPlugin { setupPermissions(); - instance = this; - UpdateChecker uc = new UpdateChecker(this, getDescription().getWebsite()); UpdateCheckerResult result = uc.updateNeeded(); diff --git a/src/de/epiceric/shopchest/config/Config.java b/src/de/epiceric/shopchest/config/Config.java index c6517b1..feb2b9b 100644 --- a/src/de/epiceric/shopchest/config/Config.java +++ b/src/de/epiceric/shopchest/config/Config.java @@ -1,6 +1,7 @@ package de.epiceric.shopchest.config; import de.epiceric.shopchest.ShopChest; +import de.epiceric.shopchest.sql.Database; import java.util.ArrayList; import java.util.HashSet; @@ -11,6 +12,30 @@ public class Config { private static ShopChest plugin = ShopChest.getInstance(); + public static String database_mysql_host() { + return plugin.getConfig().getString("database.mysql.hostname"); + } + + public static int database_mysql_port() { + return plugin.getConfig().getInt("database.mysql.port"); + } + + public static String database_mysql_database() { + return plugin.getConfig().getString("database.mysql.database"); + } + + public static String database_mysql_username() { + return plugin.getConfig().getString("database.mysql.username"); + } + + public static String database_mysql_password() { + return plugin.getConfig().getString("database.mysql.password"); + } + + public static Database.DatabaseType database_type() { + return Database.DatabaseType.valueOf(plugin.getConfig().getString("database.type")); + } + public static Set minimum_prices() { return (plugin.getConfig().getConfigurationSection("minimum-prices") == null) ? new HashSet() : plugin.getConfig().getConfigurationSection("minimum-prices").getKeys(true); } diff --git a/src/de/epiceric/shopchest/sql/Database.java b/src/de/epiceric/shopchest/sql/Database.java index 323489b..0f2d11b 100644 --- a/src/de/epiceric/shopchest/sql/Database.java +++ b/src/de/epiceric/shopchest/sql/Database.java @@ -16,57 +16,33 @@ import java.io.IOException; import java.sql.*; import java.util.UUID; -public class Database { +public abstract class Database { - private ShopChest plugin; - private Connection connection; + public ShopChest plugin; + public Connection connection; - public Database(ShopChest instance) { - plugin = instance; + public Database(ShopChest plugin) { + this.plugin = plugin; initialize(); } - private Connection getSQLConnection() { - File dbFile = new File(plugin.getDataFolder(), "shops.db"); - - if (!dbFile.exists()) { - try { - dbFile.createNewFile(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - - try { - if (connection != null && !connection.isClosed()) { - return connection; - } - - Class.forName("org.sqlite.JDBC"); - connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile); - - return connection; - } catch (Exception ex) { - ex.printStackTrace(); - } - - return null; - } + public abstract Connection getConnection(); private void initialize() { - connection = getSQLConnection(); + connection = getConnection(); + try { String queryCreateTable = "CREATE TABLE IF NOT EXISTS shop_list (" + "`id` int(11) NOT NULL," + - "`vendor` varchar(32) NOT NULL," + - "`product` varchar(32) NOT NULL," + - "`world` varchar(32) NOT NULL," + + "`vendor` tinytext NOT NULL," + + "`product` text NOT NULL," + + "`world` tinytext NOT NULL," + "`x` int(11) NOT NULL," + "`y` int(11) NOT NULL," + "`z` int(11) NOT NULL," + "`buyprice` float(32) NOT NULL," + "`sellprice` float(32) NOT NULL," + - "`shoptype` varchar(32) NOT NULL," + + "`shoptype` tinytext NOT NULL," + "PRIMARY KEY (`id`)" + ");"; @@ -74,7 +50,7 @@ public class Database { s.executeUpdate(queryCreateTable); s.close(); - PreparedStatement ps = connection.prepareStatement("SELECT * FROM shop_list WHERE id = ?"); + PreparedStatement ps = connection.prepareStatement("SELECT * FROM shop_list"); ResultSet rs = ps.executeQuery(); close(ps, rs); @@ -283,4 +259,9 @@ public class Database { SELLPRICE, SHOPTYPE; } + + public enum DatabaseType { + SQLite, + MySQL; + } } \ No newline at end of file diff --git a/src/de/epiceric/shopchest/sql/Error.java b/src/de/epiceric/shopchest/sql/Error.java deleted file mode 100644 index 99e60d8..0000000 --- a/src/de/epiceric/shopchest/sql/Error.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.epiceric.shopchest.sql; - -import de.epiceric.shopchest.ShopChest; - -import java.util.logging.Level; - -public class Error { - public static void execute(ShopChest plugin, Exception ex) { - plugin.getLogger().log(Level.SEVERE, "Couldn't execute MySQL statement: ", ex); - } - - public static void close(ShopChest plugin, Exception ex) { - plugin.getLogger().log(Level.SEVERE, "Failed to close MySQL connection: ", ex); - } -} diff --git a/src/de/epiceric/shopchest/sql/Errors.java b/src/de/epiceric/shopchest/sql/Errors.java deleted file mode 100644 index 3e06cb6..0000000 --- a/src/de/epiceric/shopchest/sql/Errors.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.epiceric.shopchest.sql; - -public class Errors { - public static String sqlConnectionExecute() { - return "Couldn't execute MySQL statement: "; - } - - public static String sqlConnectionClose() { - return "Failed to close MySQL connection: "; - } - - public static String noSQLConnection() { - return "Unable to retreive MYSQL connection: "; - } - - public static String noTableFound() { - return "Database Error: No Table Found"; - } -} diff --git a/src/de/epiceric/shopchest/sql/MySQL.java b/src/de/epiceric/shopchest/sql/MySQL.java new file mode 100644 index 0000000..74cd6da --- /dev/null +++ b/src/de/epiceric/shopchest/sql/MySQL.java @@ -0,0 +1,36 @@ +package de.epiceric.shopchest.sql; + +import de.epiceric.shopchest.ShopChest; +import de.epiceric.shopchest.config.Config; + +import java.sql.Connection; +import java.sql.DriverManager; + +public class MySQL extends Database { + + public MySQL(ShopChest plugin) { + super(plugin); + } + + @Override + public Connection getConnection() { + try { + if (connection != null && !connection.isClosed()) { + return connection; + } + + Class.forName("com.mysql.jdbc.Driver"); + + String connectUrl = "jdbc:mysql://" + Config.database_mysql_host() + ":" + Config.database_mysql_port() + "/" + Config.database_mysql_database(); + plugin.getLogger().info("Connecting to MySQL Server \"" + connectUrl + "\" as user \"" + Config.database_mysql_username() + "\""); + + connection = DriverManager.getConnection(connectUrl, Config.database_mysql_username(), Config.database_mysql_password()); + + return connection; + } catch (Exception ex) { + ex.printStackTrace(); + } + + return null; + } +} diff --git a/src/de/epiceric/shopchest/sql/SQLite.java b/src/de/epiceric/shopchest/sql/SQLite.java new file mode 100644 index 0000000..68bf022 --- /dev/null +++ b/src/de/epiceric/shopchest/sql/SQLite.java @@ -0,0 +1,44 @@ +package de.epiceric.shopchest.sql; + +import de.epiceric.shopchest.ShopChest; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; + +public class SQLite extends Database { + + public SQLite(ShopChest plugin) { + super(plugin); + } + + @Override + public Connection getConnection() { + File folder = plugin.getDataFolder(); + File dbFile = new File(folder, "shops.db"); + + if (!dbFile.exists()) { + try { + dbFile.createNewFile(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + try { + if (connection != null && !connection.isClosed()) { + return connection; + } + + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile); + + return connection; + } catch (Exception ex) { + ex.printStackTrace(); + } + + return null; + } +}