diff options
| author | Xavier horwood <39760456+Xavierhorwood@users.noreply.github.com> | 2024-08-05 21:39:28 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-06 00:39:28 -0400 |
| commit | 08e719236f4ede9225e03aac61d54abc4b576294 (patch) | |
| tree | cd57ee733a878f082d45785659c841270126d8c1 /serverlist-server | |
| parent | e2fd45373473b81b094b4675056cb99363c83c54 (diff) | |
| download | BedrockConnect-08e719236f4ede9225e03aac61d54abc4b576294.tar.gz BedrockConnect-08e719236f4ede9225e03aac61d54abc4b576294.tar.bz2 BedrockConnect-08e719236f4ede9225e03aac61d54abc4b576294.zip | |
Add Mariadb, Postgresql and auto Reconnect (#520)
* add base code
* Add code
* add check true
* add postgresql driver
* Update pom.xml
* add table for postgres
* add auto_reconnect
* Fix line issue
* fix relation "idx_uuid" already exists
* Change to database instead of mysql
* Change more to Database
* Upgrade mysql version
Diffstat (limited to 'serverlist-server')
5 files changed, 115 insertions, 22 deletions
diff --git a/serverlist-server/pom.xml b/serverlist-server/pom.xml index 9083530..00dbe69 100644 --- a/serverlist-server/pom.xml +++ b/serverlist-server/pom.xml @@ -122,15 +122,25 @@ <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> - <version>8.0.28</version> + <version>8.0.33</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> + <groupId>org.mariadb.jdbc</groupId> + <artifactId>mariadb-java-client</artifactId> + <version>LATEST</version> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <version>42.7.3</version> + </dependency> <!-- Proxy Stuff --> diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java index ec31207..cd1202b 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import main.com.pyratron.pugmatt.bedrockconnect.config.Language; import main.com.pyratron.pugmatt.bedrockconnect.sql.Data; +import main.com.pyratron.pugmatt.bedrockconnect.sql.DatabaseTypes; import main.com.pyratron.pugmatt.bedrockconnect.sql.MySQL; import main.com.pyratron.pugmatt.bedrockconnect.utils.PaletteManager; import org.cloudburstmc.netty.channel.raknet.RakConstants; @@ -12,7 +13,6 @@ import org.json.simple.parser.JSONParser; import java.io.*; import java.net.*; -import java.security.Security; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -63,6 +63,8 @@ public class BedrockConnect { String password = ""; String port = "19132"; String bindIp = "0.0.0.0"; + DatabaseTypes databaseType = DatabaseTypes.nosql; + boolean autoReconnect = false; String serverLimit = "100"; @@ -104,16 +106,16 @@ public class BedrockConnect { for (Map.Entry<String, String> setting : settings.entrySet()) { switch(setting.getKey().toLowerCase()) { - case "mysql_host": + case "db_host": hostname = setting.getValue(); break; - case "mysql_db": + case "db_db": database = setting.getValue(); break; - case "mysql_user": + case "db_user": username = setting.getValue(); break; - case "mysql_pass": + case "db_pass": password = setting.getValue(); break; case "server_limit": @@ -123,7 +125,25 @@ public class BedrockConnect { port = setting.getValue(); break; case "nodb": - noDB = setting.getValue().equalsIgnoreCase("true"); + //noDB = setting.getValue().equalsIgnoreCase("true"); + if (setting.getValue().equalsIgnoreCase("true")) + { + databaseType = DatabaseTypes.nosql; + noDB = setting.getValue().equalsIgnoreCase("true"); + } + + break; + case "mysql": + if (setting.getValue().equalsIgnoreCase("true")) + databaseType = DatabaseTypes.mysql; + break; + case "mairadb": + if (setting.getValue().equalsIgnoreCase("true")) + databaseType = DatabaseTypes.mairadb; + break; + case "postgres": + if (setting.getValue().equalsIgnoreCase("true")) + databaseType = DatabaseTypes.postgres; break; case "custom_servers": customServers = setting.getValue(); @@ -215,13 +235,16 @@ public class BedrockConnect { case "global_packet_limit": globalPacketLimit = Integer.parseInt(setting.getValue()); break; + case "auto_reconnect": + autoReconnect = setting.getValue().equalsIgnoreCase("true"); + break; } } if(!noDB) - System.out.println("MySQL Host: " + hostname + "\n" + - "MySQL Database: " + database + "\n" + - "MySQL User: " + username); + System.out.println("Database Host: " + hostname + "\n" + + "Database: " + database + "\n" + + "Database User: " + username); System.out.println("\nServer Limit: " + serverLimit + "\n" + "Port: " + port + "\n"); @@ -273,13 +296,13 @@ public class BedrockConnect { } if(!noDB) { - MySQL = new MySQL(hostname, database, username, password); + MySQL = new MySQL(hostname, database, username, password, databaseType, autoReconnect); connection = null; connection = MySQL.openConnection(); - data = new Data(serverLimit); + data = new Data(serverLimit, databaseType); // Keep MySQL connection alive Timer timer = new Timer(); @@ -315,7 +338,7 @@ public class BedrockConnect { }; timer.scheduleAtFixedRate(task, 0L, 60 * 1000); } else { - data = new Data(serverLimit); + data = new Data(serverLimit, databaseType); Timer timer = new Timer(); TimerTask task = new TimerTask() { public void run() { } diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java index 2be6ac4..55d7dc9 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java @@ -23,21 +23,23 @@ public class Data { String serverLimit; - public Data(String serverLimit) { + public Data(String serverLimit, DatabaseTypes database) { this.serverLimit = serverLimit; if(!BedrockConnect.noDB) { try { - createTables(); + createTables((database == DatabaseTypes.postgres)); } catch (Exception e) { errorAlert(e); } } } - public void createTables() throws SQLException { + public void createTables(boolean postgres) throws SQLException { // Create table if table does not exist - String sqlCreate = "CREATE TABLE IF NOT EXISTS servers" + String sqlCreate = ""; + if (!postgres) + sqlCreate = "CREATE TABLE IF NOT EXISTS servers" + " (id INTEGER PRIMARY KEY AUTO_INCREMENT," + " uuid TEXT," + " name TEXT," @@ -45,6 +47,23 @@ public class Data { + " serverLimit INTEGER," + " INDEX (uuid(255))" + ");"; + else + sqlCreate = "DO $$\n" + + "BEGIN\n" + + " IF NOT EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'servers') THEN\n" + + " CREATE TABLE servers (\n" + + " id SERIAL PRIMARY KEY,\n" + + " uuid TEXT,\n" + + " name TEXT,\n" + + " servers TEXT,\n" + + " serverLimit INTEGER\n" + + " );\n" + + " END IF;\n" + + "\n" + + " IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'idx_uuid') THEN\n" + + " CREATE INDEX idx_uuid ON servers(uuid);\n" + + " END IF;\n" + + "END $$;\n"; Statement stmt = BedrockConnect.connection.createStatement(); stmt.execute(sqlCreate); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/DatabaseTypes.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/DatabaseTypes.java new file mode 100644 index 0000000..553c297 --- /dev/null +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/DatabaseTypes.java @@ -0,0 +1,8 @@ +package main.com.pyratron.pugmatt.bedrockconnect.sql; + +public enum DatabaseTypes { + nosql, + mysql, + mairadb, + postgres, +} diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/MySQL.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/MySQL.java index c2bd20c..abcb2ff 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/MySQL.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/MySQL.java @@ -21,6 +21,10 @@ public class MySQL extends Database { private final String password; private final String hostname; + private final DatabaseTypes databasetype; + + private final Boolean autoReconnect; + private Connection connection; /** @@ -35,23 +39,52 @@ public class MySQL extends Database { * @param password * Password */ - public MySQL(String hostname, String database, String username, String password) { + public MySQL(String hostname, String database, String username, String password, DatabaseTypes databasetype, Boolean autoReconnect) { this.hostname = hostname; this.database = database; this.user = username; this.password = password; this.connection = null; + this.databasetype = databasetype; + this.autoReconnect = autoReconnect; } @Override public Connection openConnection() { try { - Class.forName("com.mysql.cj.jdbc.Driver"); - connection = DriverManager.getConnection("jdbc:mysql://" + this.hostname + "/" + this.database + "?serverTimezone=UTC&useLegacyDatetimeCode=false", this.user, this.password); - System.out.println("- MySQL Connection Started -"); + String Driver = ""; + + switch (databasetype) + { + case mysql: + Class.forName("com.mysql.cj.jdbc.Driver"); + Driver = "jdbc:mysql://"; + break; + case mairadb: + Class.forName("org.mariadb.jdbc.Driver"); + Driver = "jdbc:mariadb://"; + break; + case postgres: + Class.forName("org.postgresql.Driver"); + Driver = "jdbc:postgresql://"; + break; + default: + throw new IllegalArgumentException("Unsupported database type: " + databasetype); + } + + String Extra = ""; + + if (autoReconnect) + { + Extra += "&autoReconnect=true"; + } + + + connection = DriverManager.getConnection(Driver + this.hostname + "/" + this.database + "?serverTimezone=UTC&useLegacyDatetimeCode=false" + Extra, this.user, this.password); + System.out.println("- Database Connection Started -"); } catch (SQLException e) { - System.out.println("ERROR: Could not connect to MySQL server! because: " + e.getMessage()); + System.out.println("ERROR: Could not connect to Database server! because: " + e.getMessage()); } catch (ClassNotFoundException e) { System.out.println("ERROR: JDBC Driver not found!"); } |
