88import org .springframework .jdbc .core .BatchPreparedStatementSetter ;
99import org .springframework .jdbc .core .JdbcTemplate ;
1010import org .springframework .stereotype .Repository ;
11+ import org .springframework .transaction .support .TransactionTemplate ;
1112
1213import java .sql .*;
1314import java .util .ArrayList ;
2324@ Repository
2425public class MessageCacheRepository {
2526 private final JdbcTemplate jdbcTemplate ;
26-
27+ private final TransactionTemplate template ;
28+
2729 /**
28- * Inserts a {@link List} of {@link CachedMessage} objects.
30+ * Replaces the entire message cache with a {@link List} of {@link CachedMessage} objects.
2931 *
30- * @param messages The List to insert.
31- * @throws SQLException If an error occurs.
32+ * @param messages The new message cache.
3233 */
33- public void insertList (@ NotNull List <CachedMessage > messages ) throws DataAccessException {
34+ public void replaceWithList (@ NotNull List <CachedMessage > messages ) {
35+ template .execute (_ -> {
36+ clear ();
37+ insertList (messages );
38+ return null ;
39+ });
40+ }
41+
42+ private void clear () throws DataAccessException {
43+ jdbcTemplate .update ("DELETE FROM message_cache_attachments WHERE 1 = 1" );
44+ jdbcTemplate .update ("DELETE FROM message_cache WHERE 1 = 1" );
45+ }
46+
47+ private void insertList (@ NotNull List <CachedMessage > messages ) throws DataAccessException {
3448 jdbcTemplate .batchUpdate ("MERGE INTO message_cache (message_id, author_id, message_content) VALUES (?, ?, ?)" ,
3549 new BatchPreparedStatementSetter () {
3650 @ Override
@@ -77,11 +91,10 @@ public int getBatchSize() {
7791 * Gets all Messages from the Database.
7892 *
7993 * @return A {@link List} of {@link CachedMessage}s.
80- * @throws SQLException If anything goes wrong.
8194 */
8295 public List <CachedMessage > getAll () throws DataAccessException {
8396 List <CachedMessage > messagesWithLink = jdbcTemplate .query (
84- "SELECT * FROM message_cache LEFT JOIN message_cache_attachments ON message_cache.message_id = message_cache_attachments.message_id" ,
97+ "SELECT * FROM message_cache LEFT JOIN message_cache_attachments ON message_cache.message_id = message_cache_attachments.message_id ORDER BY message_cache.message_id ASC " ,
8598 (rs , _ ) -> this .read (rs ));
8699 Map <Long , CachedMessage > messages =new LinkedHashMap <>();
87100 for (CachedMessage msg : messagesWithLink ) {
@@ -94,22 +107,6 @@ public List<CachedMessage> getAll() throws DataAccessException {
94107 return new ArrayList <>(messages .values ());
95108 }
96109
97- /**
98- * Deletes the given amount of Messages.
99- *
100- * @param amount The amount to delete.
101- * @return If any rows we're affected.
102- * @throws SQLException If anything goes wrong.
103- */
104- public boolean delete (int amount ) throws DataAccessException {
105- int rows = jdbcTemplate .update ("DELETE FROM message_cache LIMIT ?" , amount );
106- if (rows > 0 ){
107- jdbcTemplate .update ("DELETE FROM message_cache_attachments WHERE message_id NOT IN (SELECT message_id FROM message_cache)" );
108- return true ;
109- }
110- return false ;
111- }
112-
113110 private CachedMessage read (ResultSet rs ) throws SQLException {
114111 List <String > attachments = new ArrayList <>();
115112 String attachment = rs .getString ("link" );
0 commit comments