From 69f8d2373589752571d23cc23afabf08da7dea07 Mon Sep 17 00:00:00 2001 From: Emi Boucly Date: Thu, 30 Jan 2025 11:49:13 +0100 Subject: [PATCH] =?UTF-8?q?feat(database):=20persistence=20des=20posts=20d?= =?UTF-8?q?ans=20une=20base=20de=20donn=C3=A9es=20sqlite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chat/pom.xml | 5 + chat/src/main/java/module-info.java | 1 + .../main/java/rtgre/chat/ChatController.java | 4 - .../main/java/rtgre/modeles/DatabaseApi.java | 100 ++++++++++++++++++ .../main/java/rtgre/modeles/PostVector.java | 21 ++++ .../main/java/rtgre/server/ChatServer.java | 8 ++ 6 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 chat/src/main/java/rtgre/modeles/DatabaseApi.java diff --git a/chat/pom.xml b/chat/pom.xml index d541f55..c771398 100644 --- a/chat/pom.xml +++ b/chat/pom.xml @@ -59,6 +59,11 @@ json 20240303 + + org.xerial + sqlite-jdbc + 3.48.0.0 + diff --git a/chat/src/main/java/module-info.java b/chat/src/main/java/module-info.java index b4e5b23..4fb2698 100644 --- a/chat/src/main/java/module-info.java +++ b/chat/src/main/java/module-info.java @@ -6,6 +6,7 @@ module rtgre.chat { requires javafx.swing; requires net.synedra.validatorfx; requires org.json; + requires java.sql; opens rtgre.chat to javafx.fxml; diff --git a/chat/src/main/java/rtgre/chat/ChatController.java b/chat/src/main/java/rtgre/chat/ChatController.java index 43ab9d8..a01087c 100644 --- a/chat/src/main/java/rtgre/chat/ChatController.java +++ b/chat/src/main/java/rtgre/chat/ChatController.java @@ -502,8 +502,4 @@ public class ChatController implements Initializable { LOGGER.info(contactMap.toString()); } } - - public void errorAlert() { - new Alert(Alert.AlertType.ERROR, i18nBundle.getString("connectionError")).showAndWait(); - } } \ No newline at end of file diff --git a/chat/src/main/java/rtgre/modeles/DatabaseApi.java b/chat/src/main/java/rtgre/modeles/DatabaseApi.java new file mode 100644 index 0000000..f93b5a9 --- /dev/null +++ b/chat/src/main/java/rtgre/modeles/DatabaseApi.java @@ -0,0 +1,100 @@ +package rtgre.modeles; + +import javax.xml.transform.Result; +import java.io.File; +import java.sql.*; +import java.util.UUID; + +import static rtgre.chat.ChatApplication.LOGGER; + +public class DatabaseApi { + private Connection con; + private Statement stmt; + + public DatabaseApi() { + try { + this.con = DriverManager.getConnection("jdbc:sqlite:chat/src/main/resources/rtgre/chat/dbase.db"); + this.stmt = con.createStatement(); + initDB(con); + LOGGER.info("Database connected!"); + } catch (SQLException e) { + LOGGER.severe("Can't connect to database! \n" + e.getMessage()); + e.printStackTrace(); + } + } + + private void initDB(Connection con) { + try { + String sql = "CREATE TABLE IF NOT EXISTS `posts` (" + + " `id` text PRIMARY KEY NOT NULL," + + " `timestamp` long," + + " `from` text," + + " `to` text," + + " `body` text" + + ");"; + stmt = con.createStatement(); + stmt.execute(sql); + } catch (SQLException e) { + LOGGER.severe("Cannot initialize database!"); + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + + public ResultSet getPostById(UUID uuid) { + String query = "SELECT * FROM posts WHERE id = " + uuid.toString(); + try { + return stmt.executeQuery(query); + } catch (SQLException e) { + LOGGER.severe("Can't get post by id!"); + return null; + } + } + + public ResultSet getPostsSince(long timestamp) { + String query = "SELECT * FROM posts WHERE timestamp >= " + timestamp + "ORDER BY timestamp DESC"; + try { + return stmt.executeQuery(query); + } catch (SQLException e) { + LOGGER.severe("Can't get post since " + timestamp + "!"); + return null; + } + } + + public ResultSet getPosts() { + String query = "SELECT * FROM posts"; + try { + return stmt.executeQuery(query); + } catch (SQLException e) { + LOGGER.severe("Can't get posts!"); + return null; + } + } + + public boolean addPost(Post post) { + String query = "INSERT INTO posts VALUES (?, ?, ?, ?, ?)"; + try { + PreparedStatement pstmt = con.prepareStatement(query); + pstmt.setString(1, post.getId().toString()); + pstmt.setLong(2, post.getTimestamp()); + pstmt.setString(3, post.getFrom()); + pstmt.setString(4, post.getTo()); + pstmt.setString(5, post.getBody()); + + pstmt.executeUpdate(); + return true; + } catch (SQLException e) { + LOGGER.severe("Can't add post!"); + return false; + } + } + + public void close() { + try { + con.close(); + } catch (SQLException e) { + LOGGER.severe("Can't close database connection! Is database connected ?"); + } + } + +} diff --git a/chat/src/main/java/rtgre/modeles/PostVector.java b/chat/src/main/java/rtgre/modeles/PostVector.java index 1db1105..2902b44 100644 --- a/chat/src/main/java/rtgre/modeles/PostVector.java +++ b/chat/src/main/java/rtgre/modeles/PostVector.java @@ -1,8 +1,12 @@ package rtgre.modeles; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.UUID; import java.util.Vector; +import static rtgre.chat.ChatApplication.LOGGER; + public class PostVector extends Vector { public Post getPostById(UUID uuid) { @@ -24,4 +28,21 @@ public class PostVector extends Vector { return posts; } + public void loadPosts() { + try { + DatabaseApi database = new DatabaseApi(); + ResultSet postResult = database.getPosts(); + while (postResult.next()) { + this.add(new Post( + UUID.fromString(postResult.getString("id")), + postResult.getLong("timestamp"), + postResult.getString("from"), + postResult.getString("to"), + postResult.getString("body") + )); + } + } catch (SQLException e) { + LOGGER.severe("Cannot load posts!"); + } + } } diff --git a/chat/src/main/java/rtgre/server/ChatServer.java b/chat/src/main/java/rtgre/server/ChatServer.java index 282eebe..6345a62 100644 --- a/chat/src/main/java/rtgre/server/ChatServer.java +++ b/chat/src/main/java/rtgre/server/ChatServer.java @@ -1,5 +1,6 @@ package rtgre.server; +import javafx.scene.chart.PieChart; import org.json.JSONException; import org.json.JSONObject; import rtgre.chat.ChatController; @@ -26,6 +27,7 @@ public class ChatServer { private PostVector postVector; private ContactMap contactMap; private RoomMap roomMap; + private DatabaseApi database; static { try { @@ -59,6 +61,7 @@ public class ChatServer { contactMap.loadDefaultContacts(); roomMap.loadDefaultRooms(); roomMap.setLoginSets(); + postVector.loadPosts(); } public void close() throws IOException { @@ -358,6 +361,11 @@ public class ChatServer { sendEventToContact(contactMap.getContact(post.getTo()), postEvent); postVector.add(post); + + database = new DatabaseApi(); + database.addPost(post); + database.close(); + LOGGER.info("Fin de doMessage:dm"); } else { Post post = new Post(