Files
SAE31_2024/src/fr/monkhanny/dorfromantik/utils/Database.java

230 lines
8.4 KiB
Java
Raw Normal View History

2024-12-02 20:51:28 +01:00
package fr.monkhanny.dorfromantik.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Database {
// Chargement des variables d'environnement
private static final String URL = "jdbc:mariadb://dwarves.iut-fbleau.fr/stiti";
private static final String LOGIN = "stiti";
private static final String PASSWORD = "stiti1234";
// Variable de passerelle entre le programme et la base de données
private Connection database;
/**
* Ouvre la connexion avec la base de données
*/
public Database() throws SQLException {
try {
// Chargement du driver MariaDB
Class.forName("org.mariadb.jdbc.Driver");
try {
// Connexion à la base de données
this.database = DriverManager.getConnection(URL, LOGIN, PASSWORD);
}catch (SQLException e) {
// Gestion de l'erreur de connexion
throw new SQLException("Échec de la connexion à la base de données: " + e.getMessage(), e);
}
} catch (ClassNotFoundException e) {
// Si le driver n'est pas trouvé
throw new SQLException("Driver MariaDB introuvable dans le classpath", e);
}
}
public Connection getDatabase() {
return this.database;
}
/**
* Récupère le seed correspondant au mode de jeu (series_id)
* @param seriesId L'ID de la série (mode de jeu)
* @return Le seed associé à ce mode de jeu
* @throws SQLException Si une erreur se produit lors de la récupération du seed
*/
public long getSeedBySeriesId(long seriesId) throws SQLException {
String query = "SELECT series_id FROM Series WHERE series_id = " + seriesId;
long seed = -1; // Valeur par défaut si le seed n'est pas trouvé
try (Statement stmt = this.database.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
if (rs.next()) {
seed = rs.getLong("series_id");
}
}
return seed;
}
public List<PlayerScore> getAllScores(long seriesId) throws SQLException {
List<PlayerScore> allScores = new ArrayList<>();
2024-12-04 10:34:00 +01:00
// Requête pour récupérer les scores et le nom de la série
String query = "SELECT s.score, se.name " +
"FROM Scores s " +
"JOIN Series se ON s.series_id = se.series_id " +
"WHERE s.series_id = ? " +
"ORDER BY s.score DESC";
2024-12-03 11:41:20 +01:00
2024-12-02 20:51:28 +01:00
try (PreparedStatement stmt = this.database.prepareStatement(query)) {
2024-12-04 10:34:00 +01:00
stmt.setLong(1, seriesId); // Paramètre pour filtrer par series_id
2024-12-02 20:51:28 +01:00
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int score = rs.getInt("score");
2024-12-04 10:34:00 +01:00
String seriesName = rs.getString("name"); // Nom de la série
// Ajouter l'objet PlayerScore à la liste avec un nom générique et le score
allScores.add(new PlayerScore(seriesName, score)); // Ajout du nom de la série
2024-12-02 20:51:28 +01:00
}
}
}
2024-12-04 10:34:00 +01:00
2024-12-02 20:51:28 +01:00
return allScores;
2024-12-04 10:34:00 +01:00
}
public List<String> getAllSeries() {
List<String> series = new ArrayList<>();
try {
String query = "SELECT name FROM series ORDER BY date_created DESC"; // Trier par date
Statement statement = this.database.createStatement();
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
series.add(resultSet.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return series;
}
2024-12-02 20:51:28 +01:00
public long getSeedByName(String name) throws SQLException {
String query = "SELECT series_id FROM Series WHERE name = " + "\'" + name + "\'" +";";
long seed = -1; // Valeur par défaut si le seed n'est pas trouvé
try (Statement stmt = this.database.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
if (rs.next()) {
seed = rs.getLong("series_id");
}
}
return seed;
}
2024-12-03 11:41:20 +01:00
public void addScore(long seriesId, int score) throws SQLException {
String insertQuery = "INSERT INTO Scores (series_id, score) VALUES (?, ?)";
2024-12-02 20:51:28 +01:00
try (PreparedStatement stmt = this.database.prepareStatement(insertQuery)) {
2024-12-03 11:41:20 +01:00
stmt.setLong(1, seriesId);
stmt.setInt(2, score);
2024-12-02 20:51:28 +01:00
stmt.executeUpdate();
} catch (SQLException e) {
System.err.println("Erreur lors de l'ajout du score: " + e.getMessage());
throw e;
}
}
public void addCustomSeed(String name, long customSeed) throws SQLException {
// Vérifier si la seed existe déjà
String checkQuery = "SELECT COUNT(*) FROM Series WHERE series_id = ?";
try (PreparedStatement checkStmt = this.database.prepareStatement(checkQuery)) {
checkStmt.setLong(1, customSeed);
ResultSet rs = checkStmt.executeQuery();
if (rs.next() && rs.getInt(1) > 0) {
// la seed existe déjà
return; // Ne pas insérer si la seed existe déjà
}
}
// Si la seed n'existe pas, procéder à l'insertion
String insertQuery = "INSERT INTO Series (name, series_id, creation_date) VALUES (?, ?, CURRENT_TIMESTAMP)";
try (PreparedStatement stmt = this.database.prepareStatement(insertQuery)) {
stmt.setString(1, name);
stmt.setLong(2, customSeed);
stmt.executeUpdate();
} catch (SQLException e) {
System.err.println("Erreur lors de l'ajout de la seed custom: " + e.getMessage());
throw e;
}
}
2024-12-03 11:41:20 +01:00
/**
2024-12-02 20:51:28 +01:00
* Récupère les meilleurs scores des joueurs (limite de 10 scores)
2024-12-03 11:41:20 +01:00
* @return une liste de résultats sous forme de tableau contenant le score et la date formatée
2024-12-02 20:51:28 +01:00
*/
public List<PlayerScore> getTopPlayers() throws SQLException {
List<PlayerScore> topPlayers = new ArrayList<>();
2024-12-04 10:34:00 +01:00
// Requête pour récupérer les scores et le nom de la série, triée par score décroissant
String query = "SELECT s.score, se.name FROM Scores s " +
"JOIN Series se ON s.series_id = se.series_id " +
"ORDER BY s.score DESC LIMIT 10";
2024-12-02 20:51:28 +01:00
try (Statement stmt = this.database.createStatement();
2024-12-04 10:34:00 +01:00
ResultSet rs = stmt.executeQuery(query)) {
2024-12-02 20:51:28 +01:00
while (rs.next()) {
int score = rs.getInt("score");
2024-12-04 10:34:00 +01:00
String seriesName = rs.getString("name"); // Nom de la série
2024-12-04 18:06:34 +01:00
2024-12-04 10:34:00 +01:00
// Ajouter l'objet PlayerScore à la liste
topPlayers.add(new PlayerScore(seriesName, score)); // Assurez-vous que PlayerScore accepte un nom de série
2024-12-02 20:51:28 +01:00
}
}
return topPlayers;
}
2024-12-04 10:34:00 +01:00
2024-12-02 20:51:28 +01:00
2024-12-03 11:41:20 +01:00
2024-12-02 20:51:28 +01:00
/**
* Récupère les scores d'une série spécifique, triés en ordre décroissant (du plus élevé au plus bas)
* @param seriesId L'ID de la série
* @return Liste des scores pour la série donnée
* @throws SQLException En cas d'erreur lors de la récupération des scores
*/
public List<Integer> getScoresBySeriesId(long seriesId) throws SQLException {
List<Integer> scores = new ArrayList<>();
String query = "SELECT score FROM Scores WHERE series_id = ? ORDER BY score DESC";
try (PreparedStatement stmt = this.database.prepareStatement(query)) {
stmt.setLong(1, seriesId);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
scores.add(rs.getInt("score"));
}
}
}
// If you want the scores to be in descending order (from highest to lowest)
Collections.sort(scores, Collections.reverseOrder());
return scores;
}
public void close() {
try {
if (this.database != null && !this.database.isClosed()) {
this.database.close();
}
} catch (SQLException e) {
System.err.println("Erreur lors de la fermeture de la base de données : " + e.getMessage());
}
}
}