From c67d57e5e9e518501b2da54efbc5e8c2de82abdf Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Fri, 13 Apr 2018 22:47:25 +0300 Subject: [PATCH] Implemented MySQL for Sponge #564 --- .../plan/system/database/ServerDBSystem.java | 4 +- .../database/databases/sql/MySQLDB.java | 13 +++-- .../database/databases/sql/SpongeMySQLDB.java | 47 +++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/SpongeMySQLDB.java diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/ServerDBSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/database/ServerDBSystem.java index 9b323eb2c..c17ec6e63 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/ServerDBSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/ServerDBSystem.java @@ -7,7 +7,9 @@ package com.djrapitops.plan.system.database; import com.djrapitops.plan.api.exceptions.database.DBInitException; import com.djrapitops.plan.system.database.databases.sql.MySQLDB; import com.djrapitops.plan.system.database.databases.sql.SQLiteDB; +import com.djrapitops.plan.system.database.databases.sql.SpongeMySQLDB; import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plugin.api.Check; /** * Bukkit Database system that initializes SQLite and MySQL database objects. @@ -18,7 +20,7 @@ public class ServerDBSystem extends DBSystem { @Override protected void initDatabase() throws DBInitException { - databases.add(new MySQLDB()); + databases.add(Check.isSpongeAvailable() ? new SpongeMySQLDB() : new MySQLDB()); databases.add(new SQLiteDB()); String dbType = Settings.DB_TYPE.toString().toLowerCase().trim(); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/MySQLDB.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/MySQLDB.java index 34cf4fed0..01f8321d2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/MySQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/MySQLDB.java @@ -1,9 +1,11 @@ package com.djrapitops.plan.system.database.databases.sql; +import com.djrapitops.plan.api.exceptions.database.DBInitException; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plugin.api.utility.log.Log; import org.apache.commons.dbcp2.BasicDataSource; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @@ -12,7 +14,7 @@ import java.sql.SQLException; */ public class MySQLDB extends SQLDB { - private BasicDataSource dataSource; + protected DataSource dataSource; public MySQLDB() { } @@ -21,8 +23,9 @@ public class MySQLDB extends SQLDB { * Setups the {@link BasicDataSource} */ @Override - public void setupDataSource() { - dataSource = new BasicDataSource(); + public void setupDataSource() throws DBInitException { + BasicDataSource dataSource = new BasicDataSource(); + this.dataSource = dataSource; dataSource.setDriverClassName("com.mysql.jdbc.Driver"); String host = Settings.DB_HOST.toString(); @@ -62,7 +65,9 @@ public class MySQLDB extends SQLDB { @Override public void close() { try { - dataSource.close(); + if (dataSource != null && dataSource instanceof BasicDataSource) { + ((BasicDataSource) dataSource).close(); + } } catch (SQLException e) { Log.toLog(this.getClass(), e); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/SpongeMySQLDB.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/SpongeMySQLDB.java new file mode 100644 index 000000000..a066005ca --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/SpongeMySQLDB.java @@ -0,0 +1,47 @@ +package com.djrapitops.plan.system.database.databases.sql; + +import com.djrapitops.plan.api.exceptions.database.DBInitException; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plugin.api.utility.log.Log; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.service.sql.SqlService; + +import java.sql.SQLException; +import java.util.Optional; + +/** + * MySQLDB implementation for Sponge since default driver is not available. + * + * @author Rsl1122 + */ +public class SpongeMySQLDB extends MySQLDB { + + @Override + public void setupDataSource() throws DBInitException { + Optional sqlServiceProvider = Sponge.getServiceManager().provide(SqlService.class); + if (!sqlServiceProvider.isPresent()) { + return; + } + + String host = Settings.DB_HOST.toString(); + String port = Integer.toString(Settings.DB_PORT.getNumber()); + String database = Settings.DB_DATABASE.toString(); + String launchOptions = Settings.DB_LAUNCH_OPTIONS.toString(); + if (launchOptions.isEmpty() || !launchOptions.startsWith("?") || launchOptions.endsWith("&")) { + Log.error("Launch Options were faulty, using default (?rewriteBatchedStatements=true&useSSL=false)"); + launchOptions = "?rewriteBatchedStatements=true&useSSL=false"; + } + + String url = host + ":" + port + "/" + database + launchOptions; + String username = Settings.DB_USER.toString(); + String password = Settings.DB_PASS.toString(); + try { + this.dataSource = sqlServiceProvider.get().getDataSource( + "jdbc:mysql://" + username + ":" + password + "@" + url + ); + } catch (SQLException e) { + throw new DBInitException(e); + } + } + +} \ No newline at end of file