⚡️ Remove unnecessary database operation
[Sone.git] / src / main / java / net / pterodactylus / sone / database / memory / MemoryDatabase.kt
index 702d4e2..a9459e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - MemoryDatabase.java - Copyright © 2013–2016 David Roden
+ * Sone - MemoryDatabase.kt - Copyright © 2013–2019 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@ import com.google.common.base.Preconditions.checkNotNull
 import com.google.common.collect.HashMultimap
 import com.google.common.collect.Multimap
 import com.google.common.collect.TreeMultimap
-import com.google.common.util.concurrent.AbstractService
+import com.google.common.util.concurrent.*
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import net.pterodactylus.sone.data.Album
@@ -49,8 +49,6 @@ import kotlin.concurrent.withLock
 
 /**
  * Memory-based [PostDatabase] implementation.
- *
- * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
  */
 @Singleton
 class MemoryDatabase @Inject constructor(private val configuration: Configuration) : AbstractService(), Database {
@@ -72,6 +70,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
        private val soneImages: Multimap<String, Image> = HashMultimap.create<String, Image>()
        private val memoryBookmarkDatabase = MemoryBookmarkDatabase(this, configurationLoader)
        private val memoryFriendDatabase = MemoryFriendDatabase(configurationLoader)
+       private val saveRateLimiter: RateLimiter = RateLimiter.create(1.0)
 
        override val soneLoader get() = this::getSone
 
@@ -84,8 +83,10 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
        override val bookmarkedPosts get() = memoryBookmarkDatabase.bookmarkedPosts
 
        override fun save() {
-               saveKnownPosts()
-               saveKnownPostReplies()
+               if (saveRateLimiter.tryAcquire()) {
+                       saveKnownPosts()
+                       saveKnownPostReplies()
+               }
        }
 
        override fun doStart() {
@@ -283,22 +284,24 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
 
        protected fun isPostKnown(post: Post) = readLock.withLock { post.id in knownPosts }
 
-       protected fun setPostKnown(post: Post, known: Boolean): Unit =
+       fun setPostKnown(post: Post, known: Boolean): Unit =
                        writeLock.withLock {
                                if (known)
                                        knownPosts.add(post.id)
                                else
                                        knownPosts.remove(post.id)
+                               saveKnownPosts()
                        }
 
        protected fun isPostReplyKnown(postReply: PostReply) = readLock.withLock { postReply.id in knownPostReplies }
 
-       protected fun setPostReplyKnown(postReply: PostReply, known: Boolean): Unit =
+       fun setPostReplyKnown(postReply: PostReply, known: Boolean): Unit =
                        writeLock.withLock {
                                if (known)
                                        knownPostReplies.add(postReply.id)
                                else
                                        knownPostReplies.remove(postReply.id)
+                               saveKnownPostReplies()
                        }
 
        private fun loadKnownPosts() =
@@ -314,7 +317,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
                        try {
                                readLock.withLock {
                                        knownPosts.forEachIndexed { index, knownPostId ->
-                                               configuration.getStringValue("KnowsPosts/$index/ID").value = knownPostId
+                                               configuration.getStringValue("KnownPosts/$index/ID").value = knownPostId
                                        }
                                        configuration.getStringValue("KnownPosts/${knownPosts.size}/ID").value = null
                                }