Try to prune the Gnus registry if it's full.
authorTed Zlatanov <tzz@lifelogs.com>
Mon, 9 May 2011 17:48:03 +0000 (12:48 -0500)
committerTed Zlatanov <tzz@lifelogs.com>
Mon, 9 May 2011 17:48:03 +0000 (12:48 -0500)
* gnus-registry.el (gnus-registry-insert): Add wrapper that calls
`registry-prune' if `registry-full' returns t.
(gnus-registry-handle-action)
(gnus-registry-get-or-make-entry, gnus-registry-set-id-key)
(gnus-registry-usage-test): Use it.

* registry.el (registry-full): Add convenience method.
(registry-insert): Use it.

lisp/ChangeLog
lisp/gnus-registry.el
lisp/registry.el

index 30c8e54..ae870e3 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-09  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * registry.el (registry-full): Add convenience method.
+       (registry-insert): Use it.
+
+       * gnus-registry.el (gnus-registry-insert): Add wrapper that calls
+       `registry-prune' if `registry-full' returns t.
+       (gnus-registry-handle-action)
+       (gnus-registry-get-or-make-entry, gnus-registry-set-id-key)
+       (gnus-registry-usage-test): Use it.
+
 2011-05-07  Julien Danjou  <julien@danjou.info>
 
        * shr.el (shr-link): Make shr-link inherit from link by default.
index e6c96ab..02e4ce7 100644 (file)
@@ -383,7 +383,7 @@ This is not required after changing `gnus-registry-cache-file'."
     (gnus-message 10 "Gnus registry: new entry for %s is %S"
                   id
                   entry)
-    (registry-insert db id entry)))
+    (gnus-registry-insert db id entry)))
 
 ;; Function for nn{mail|imap}-split-fancy: look up all references in
 ;; the cache and if a match is found, return that group.
@@ -962,8 +962,8 @@ only the last one's marks are returned."
          (entries (registry-lookup db (list id))))
 
     (when (null entries)
-      (registry-insert db id (list (list 'creation-time (current-time))
-                                   '(group) '(sender) '(subject)))
+      (gnus-registry-insert db id (list (list 'creation-time (current-time))
+                                        '(group) '(sender) '(subject)))
       (setq entries (registry-lookup db (list id))))
 
     (nth 1 (assoc id entries))))
@@ -979,9 +979,17 @@ only the last one's marks are returned."
          (entry (gnus-registry-get-or-make-entry id)))
     (registry-delete db (list id) nil)
     (setq entry (cons (cons key vals) (assq-delete-all key entry)))
-    (registry-insert db id entry)
+    (gnus-registry-insert db id entry)
     entry))
 
+(defun gnus-registry-insert (db id entry)
+  "Just like `registry-insert' but tries to prune on error."
+  (when (registry-full db)
+    (message "Trying to prune the registry because it's full")
+    (registry-prune db))
+  (registry-insert db id entry)
+  entry)
+
 (defun gnus-registry-import-eld (file)
   (interactive "fOld registry file to import? ")
   ;; example content:
@@ -1075,7 +1083,7 @@ only the last one's marks are returned."
     (should (equal (gnus-registry-get-id-key "34" 'group) '("togroup")))
     (should (equal (gnus-registry-get-id-key "34" 'subject) '("subject 4")))
     (message "Trying to insert a duplicate key")
-    (should-error (registry-insert db "55" '()))
+    (should-error (gnus-registry-insert db "55" '()))
     (message "Looking up individual keys (gnus-registry-get-or-make-entry)")
     (should (gnus-registry-get-or-make-entry "22"))
     (message "Saving the Gnus registry to %s" tempfile)
index 51bfc9c..8a908a8 100644 (file)
@@ -261,6 +261,11 @@ With assert non-nil, errors out if the key does not exist already."
          (remhash key data)))
       keys))
 
+  (defmethod registry-full ((db registry-db))
+    "Checks if registry-db THIS is full."
+    (< (registry-size db)
+       (oref db :max-hard)))
+
   (defmethod registry-insert ((db registry-db) key entry)
     "Insert ENTRY under KEY into the registry-db THIS.
 Updates the secondary ('tracked') indices as well.
@@ -269,8 +274,7 @@ Errors out if the key exists already."
     (assert (not (gethash key (oref db :data))) nil
            "Key already exists in database")
 
-    (assert (< (registry-size db)
-              (oref db :max-hard))
+    (assert (registry-full db)
            nil
            "registry max-hard size limit reached")