Skip to content

Commit

Permalink
Database directly in code
Browse files Browse the repository at this point in the history
  • Loading branch information
Euphillya committed Dec 15, 2024
1 parent 4bf1181 commit 46e60f2
Show file tree
Hide file tree
Showing 49 changed files with 409 additions and 736 deletions.
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ plugins {
id("maven-publish")
}

group = "fr.euphyllia.skyllia";
version = "1.8";

dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
implementation("com.github.Euphillya:SGBD-MariaDB:1.3")
compileOnly(project(":database"))
}

group = "fr.euphyllia.skyllia";
version = "1.8";

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package fr.euphyllia.skyllia.utils;
package fr.euphyllia.skyllia.api.utils;

import org.bukkit.entity.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,17 @@
*
* Violations will result in a ban of your plugin and account from bStats.
*/
package fr.euphyllia.skyllia.utils;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
package fr.euphyllia.skyllia.api.utils;

import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
Expand All @@ -38,11 +33,6 @@
import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.zip.GZIPOutputStream;
import javax.net.ssl.HttpsURLConnection;

import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

public class Metrics {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package fr.euphyllia.skyllia.utils.models;
package fr.euphyllia.skyllia.api.utils.models;

import fr.euphyllia.skyllia.api.skyblock.model.Position;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package fr.euphyllia.skyllia.utils.models;
package fr.euphyllia.skyllia.api.utils.models;

import org.bukkit.entity.Entity;

Expand Down
10 changes: 2 additions & 8 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import java.io.ByteArrayOutputStream

plugins {
id("java-library")
id("java")
id("maven-publish")
id("io.github.goooler.shadow") version "8.1.8"
id("io.papermc.paperweight.userdev") version "1.7.6" apply false
id("io.papermc.paperweight.userdev") version "1.7.7" apply false
}

val paperRepo = "https://repo.papermc.io/repository/maven-public/";
Expand All @@ -15,6 +14,7 @@ val engineHubRepo = "https://maven.enginehub.org/repo/";
val jitpack = "https://jitpack.io";

dependencies {
implementation(project(":database"))
implementation(project(":api"))
implementation(project(":plugin"))
implementation(project(":nms:v1_20_R1", "reobf"))
Expand Down Expand Up @@ -45,8 +45,6 @@ allprojects {
}

dependencies {
compileOnly("com.github.Euphillya:SGBD-MariaDB:1.3")

compileOnly("org.apache.logging.log4j:log4j-api:2.24.2")
compileOnly("org.apache.logging.log4j:log4j-core:2.24.2")
compileOnly("org.mariadb.jdbc:mariadb-java-client:3.5.1")
Expand All @@ -57,10 +55,6 @@ allprojects {
compileOnly("net.md-5:bungeecord-api:1.20-R0.2")
}

tasks.withType<ShadowJar> {
relocate("fr.euphyllia.sgbd", "fr.euphyllia.skyllia.dependency.sgbd")
}

tasks {
compileJava {
options.encoding = "UTF-8"
Expand Down
20 changes: 20 additions & 0 deletions database/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
plugins {
id("java")
}
group = "fr.euphyllia.skyllia";
version = "1.3";

dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
}

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

tasks {
compileJava {
options.encoding = "UTF-8"
}
}
113 changes: 113 additions & 0 deletions database/src/main/java/fr/euphyllia/skyllia/sgbd/DatabaseLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package fr.euphyllia.skyllia.sgbd;

import fr.euphyllia.skyllia.sgbd.exceptions.DatabaseException;

import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import fr.euphyllia.skyllia.sgbd.stream.AsciiStream;
import fr.euphyllia.skyllia.sgbd.stream.BinaryStream;
import org.jetbrains.annotations.Nullable;

public class DatabaseLoader {

private final MariaDB mariaDB;

public DatabaseLoader(MariaDB mariaDB) {
this.mariaDB = mariaDB;
}

public boolean loadDatabase() throws DatabaseException {
if (mariaDB != null && !mariaDB.isConnected()) {
return mariaDB.onLoad();
}
return false;
}

public void closeDatabase() {
if (mariaDB != null) {
mariaDB.onClose();
}
}

@Nullable
public Connection getMariaDBConnection() throws DatabaseException {
if (mariaDB != null && mariaDB.isConnected()) {
return mariaDB.getConnection();
}
return null;
}

public int executeInt(Connection connection, String query, List<?> param) throws SQLException {
return this.getStatementFinal(connection, query, param).join().executeUpdate();
}


private CompletableFuture<PreparedStatement> getStatementFinal(Connection connection, String query, List<?> param) throws SQLException {
CompletableFuture<PreparedStatement> completableFuture = new CompletableFuture<>();
PreparedStatement statement = connection.prepareStatement(query);
try {
if (param != null) {
int i = 1;
for (Object value : param) {
this.insertStatement(i++, statement, value);
}
}
} finally {
completableFuture.complete(statement);
}
return completableFuture;
}

private void insertStatement(int i, PreparedStatement statement, Object value) throws SQLException {
if (value instanceof byte[] valueBytes) {
statement.setBytes(i, valueBytes);
} else if (value instanceof Timestamp valueTimes) {
statement.setTimestamp(i, valueTimes);
} else if (value instanceof String valueString) {
statement.setString(i, valueString);
} else if (value instanceof Integer valueInt) {
statement.setInt(i, valueInt);
} else if (value instanceof Double valueDouble) {
statement.setDouble(i, valueDouble);
} else if (value instanceof Long valueLong) {
statement.setLong(i, valueLong);
} else if (value instanceof Byte valueByte) {
statement.setByte(i, valueByte);
} else if (value instanceof Short valueShort) {
statement.setShort(i, valueShort);
} else if (value instanceof Float valueFloat) {
statement.setFloat(i, valueFloat);
} else if (value instanceof BigDecimal valueBigDecimal) {
statement.setBigDecimal(i, valueBigDecimal);
} else if (value instanceof Time valueTime) {
statement.setTime(i, valueTime);
} else if (value instanceof AsciiStream valueAsciiStream) {
statement.setAsciiStream(i, valueAsciiStream.x(), valueAsciiStream.length());
} else if (value instanceof BinaryStream valueBinaryStream) {
statement.setBinaryStream(i, valueBinaryStream.x(), valueBinaryStream.length());
} else if (value instanceof Blob valueBlob) {
statement.setBlob(i, valueBlob);
} else if (value instanceof Clob valueClob) {
statement.setClob(i, valueClob);
} else if (value instanceof Array valueArray) {
statement.setArray(i, valueArray);
} else if (value instanceof URL valueURL) {
statement.setURL(i, valueURL);
} else {
statement.setString(i, String.valueOf(value));
}
}

public @Nullable ResultSet execute(Connection connection, String query, List<?> param) throws SQLException {
PreparedStatement statement = this.getStatementFinal(connection, query, param).join();
boolean hasResult = statement.execute();
if (hasResult) {
return statement.getResultSet();
}
return null;
}
}
78 changes: 78 additions & 0 deletions database/src/main/java/fr/euphyllia/skyllia/sgbd/MariaDB.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package fr.euphyllia.skyllia.sgbd;

import com.zaxxer.hikari.HikariDataSource;
import fr.euphyllia.skyllia.sgbd.configuration.MariaDBConfig;
import fr.euphyllia.skyllia.sgbd.exceptions.DatabaseException;
import fr.euphyllia.skyllia.sgbd.model.DBConnect;
import fr.euphyllia.skyllia.sgbd.model.DBInterface;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;

import java.sql.Connection;
import java.sql.SQLException;

public class MariaDB implements DBConnect, DBInterface {

private final Logger logger = LogManager.getLogger(MariaDB.class);
private final MariaDBConfig mariaDBConfig;
private HikariDataSource pool;
private boolean connected;

public MariaDB(final MariaDBConfig configMariaDB) {
this.mariaDBConfig = configMariaDB;
this.connected = false;
}


@Override
public boolean onLoad() throws DatabaseException {
this.pool = new HikariDataSource();
this.pool.setDriverClassName("org.mariadb.jdbc.Driver");
this.pool.setJdbcUrl("jdbc:mariadb://%s:%s/".formatted(mariaDBConfig.hostname(), mariaDBConfig.port()));
this.pool.setUsername(mariaDBConfig.user());
this.pool.setPassword(mariaDBConfig.pass());
this.pool.setConnectionTimeout(mariaDBConfig.timeOut());

this.pool.setMaximumPoolSize(mariaDBConfig.maxPool());
this.pool.setMinimumIdle(mariaDBConfig.maxPool());

try (Connection connection = pool.getConnection()) {
if (connection.isValid(1)) {
this.connected = true;
this.logger.log(Level.INFO, "MariaDB pool initialized (%s)".formatted(mariaDBConfig.maxPool()));
return true;
}
} catch (SQLException e) {
logger.log(Level.FATAL, e.getMessage(), e);
throw new DatabaseException(e);
}
return false;
}

@Override
public void onClose() {
if (this.isConnected()) {
this.pool.close();
}
}

@Override
public boolean isConnected() {
return this.connected;
}

@Override
public @Nullable Connection getConnection() throws DatabaseException {
try {
if (pool.isClosed()) {
return null;
}
return pool.getConnection();
} catch (SQLException e) {
logger.log(Level.FATAL, e.getMessage(), e);
throw new DatabaseException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package fr.euphyllia.skyllia.sgbd.configuration;

public record MariaDBConfig(String hostname, String port, String user, String pass,
Boolean useSSL,
Integer maxPool, Integer timeOut, String database, int dbVersion) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fr.euphyllia.skyllia.sgbd.exceptions;

public class DatabaseException extends Exception {

public DatabaseException(String message) {
super(message);
}

public DatabaseException(Throwable cause) {
super(cause);
}

public DatabaseException(String message, Throwable cause) {
super(message, cause);
}
}
Loading

0 comments on commit 46e60f2

Please sign in to comment.