Remove empty entity files from modb cache.
[elisp/wanderlust.git] / elmo / modb-standard.el
index 77646ba..62fc5b6 100644 (file)
@@ -55,6 +55,7 @@
                      entity-map        ; number, msg-id -> entity mapping.
                      flag-map          ; number -> flag-list mapping
                      flag-count        ; list of (FLAG . COUNT)
+                     overview-handler  ; instance of modb-entity-handler.
                      ))
   (luna-define-internal-accessors 'modb-standard))
 
              (modb-standard-key number)
              (modb-standard-entity-map-internal msgdb))))
     (cond
-     ((and ret (eq (car-safe ret) 'autoload))
-      (cdr (cdr ret))) ; message-id.
-     ((and ret (stringp (car-safe ret)))
-      ;; Already loaded.
-      (car ret))
      ((null ret)
       ;; Garbage entity.
       (elmo-clear-hash-val (modb-standard-key number)
                           (modb-standard-entity-map-internal msgdb))
       nil)                             ; return nil.
+     ((eq (car-safe ret) 'autoload)
+      (cdr (cdr ret)))                 ; message-id.
+     ((elmo-msgdb-message-entity-field (elmo-message-entity-handler ret)
+                                      ret 'message-id)) ; Already loaded.
      (t (error "Internal error: invalid msgdb status")))))
 
 (defun modb-standard-load-entity (modb path &optional section)
        number msgid)
     (cond ((eq (car objects) 'modb-standard-entity-handler)
           ;; (standard PARAMETERS ENTITY*)
-          ;; PARAMETERS is nil (reserved for future extention).
           (let ((handler (apply #'luna-make-entity
                                 (car objects)
                                 (car (cdr objects))))
     (dolist (number (or (cdr section)
                        (modb-standard-number-list-internal modb)))
       (when (setq entity (elmo-msgdb-message-entity modb number))
-       (unless (eq (luna-class-name (elmo-message-entity-handler entity))
-                   (luna-class-name handler))
+       (unless (modb-entity-handler-equal-p
+                handler
+                (elmo-message-entity-handler entity))
          (setq entity (elmo-msgdb-copy-message-entity
                        (elmo-message-entity-handler entity)
                        entity handler)))
        (setq entities (cons (cdr (cdr entity)) entities))))
     (if entities
        (elmo-object-save filename
-                         (cons (luna-class-name handler) (cons nil entities))
-                         elmo-mime-charset)
+                         (nconc
+                          (list (luna-class-name handler)
+                                (modb-entity-handler-dump-parameters handler))
+                          entities))
       (ignore-errors (delete-file filename)))))
 
+(defun modb-standard-cleanup-stale-entities (modb path)
+  (message "Removing stale entities...")
+  (let* ((entity-regex
+         (concat "^" modb-standard-entity-filename "-\\([0-9]+\\)"))
+        (entities (elmo-uniq-list
+                   (mapcar
+                    (lambda (x) (/ x modb-standard-divide-number))
+                    (modb-standard-number-list-internal modb))))
+        (files (mapcar (lambda(x)
+                         (when (string-match entity-regex x)
+                           (string-to-number (match-string 1 x))))
+                       (directory-files path nil entity-regex))))
+    (dolist (entity (car (elmo-list-diff-nonsortable files entities)))
+      (ignore-errors (delete-file
+                     (expand-file-name
+                      (modb-standard-entity-filename entity) path))))))
+
 (defun modb-standard-save-entity (modb path)
   (let ((modified (modb-generic-message-modified-internal modb)))
     (cond ((listp modified)
             (dolist (section sections)
               (modb-standard-save-entity-1 modb path section))))
          (modified
-          (modb-standard-save-entity-1 modb path)))))
+          (modb-standard-cleanup-stale-entities modb path)))))
 
 ;;; Implement
 ;;
          (msg-id (elmo-msgdb-message-entity-field
                   (elmo-message-entity-handler entity) entity 'message-id))
          duplicate)
-      (when msg-id
+      (when (and number msg-id)
        ;; number-list
        (modb-standard-set-number-list-internal
         msgdb
           ((numberp key) (modb-standard-key key)))
      'autoload)))
 
-(defvar modb-standard-default-entity-handler nil)
-
 (luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-standard))
-  (or modb-standard-default-entity-handler
-      (setq modb-standard-default-entity-handler
-           (luna-make-entity 'modb-standard-entity-handler))))
+  (or (modb-standard-overview-handler-internal msgdb)
+      (modb-standard-set-overview-handler-internal
+       msgdb
+       (luna-make-entity 'modb-standard-entity-handler
+                        :mime-charset
+                        (modb-generic-mime-charset-internal msgdb)))))
 
 (require 'product)
 (product-provide (provide 'modb-standard) (require 'elmo-version))