* modb.el (elmo-msgdb-flag-available-p): New generic function.
[elisp/wanderlust.git] / elmo / modb-standard.el
index 0f90e29..53d7b2f 100644 (file)
                 number)
   :group 'elmo)
 
+(defcustom modb-standard-economize-entity-size nil
+  "*Economize message entity size.
+When non-nil, redundunt message-id string are not saved."
+  :type 'boolean
+  :group 'elmo)
+
 (defvar modb-standard-entity-filename "entity"
   "Message entity database.")
 
              (number-to-string section))
     modb-standard-entity-filename))
 
+(defsubst modb-standard-loaded-message-id (msgdb number)
+  "Get message-id for autoloaded entity."
+  (let ((ret (elmo-get-hash-val
+             (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)))
+     (t (error "Internal error: invalid msgdb status")))))
+
 (defun modb-standard-load-entity (modb path &optional section)
   (let ((table (or (modb-standard-entity-map-internal modb)
-                  (elmo-make-hash (elmo-msgdb-length modb)))))
+                  (elmo-make-hash (elmo-msgdb-length modb))))
+       (inhibit-quit t)
+       number msgid)
     (dolist (entity (elmo-object-load
                     (expand-file-name
                      (modb-standard-entity-filename section)
                      path)))
-      (elmo-set-hash-val (modb-standard-key
-                         (elmo-msgdb-message-entity-number
-                          (elmo-message-entity-handler entity)
-                          entity))
-                        entity
-                        table)
-      (elmo-set-hash-val (elmo-msgdb-message-entity-field
-                         (elmo-message-entity-handler entity)
-                         entity 'message-id)
-                        entity
-                        table))
+      (setq number (elmo-msgdb-message-entity-number
+                   (elmo-message-entity-handler entity)
+                   entity)
+           msgid (modb-standard-loaded-message-id modb number))
+      (when msgid
+       (setcar entity msgid)
+       (elmo-set-hash-val msgid entity table)
+       (elmo-set-hash-val (modb-standard-key number) entity table)))
     (modb-standard-set-entity-map-internal modb table)))
 
 (defsubst modb-standard-save-entity-1 (modb path &optional section)
       (when (and (or (null section)
                     (= section (/ number modb-standard-divide-number)))
                 (setq entity (elmo-msgdb-message-entity modb number)))
+       (when modb-standard-economize-entity-size
+         (when (stringp (car entity)) (setcar entity t)))
        (setq entities (cons entity entities))))
     (if entities
        (elmo-object-save filename entities)
 (luna-define-method elmo-msgdb-length ((msgdb modb-standard))
   (length (modb-standard-number-list-internal msgdb)))
 
+(luna-define-method elmo-msgdb-flag-available-p ((msgdb modb-standard) flag)
+  t)
+
 (luna-define-method elmo-msgdb-flags ((msgdb modb-standard) number)
   (modb-standard-message-flags msgdb number))
 
          (modb-standard-message-entity msgdb key nil))
       ret)))
 
+(luna-define-method elmo-msgdb-message-number ((msgdb modb-standard)
+                                              message-id)
+  (let ((ret (elmo-get-hash-val
+             message-id
+             (modb-standard-entity-map-internal msgdb))))
+    (if (eq 'autoload (car-safe ret))
+       ;; Not loaded yet but can return number.
+       (nth 1 ret)
+      (elmo-message-entity-number ret))))
+
+(luna-define-method elmo-msgdb-message-field ((msgdb modb-standard)
+                                             number field)
+  (let ((ret (elmo-get-hash-val
+             (modb-standard-key number)
+             (modb-standard-entity-map-internal msgdb))))
+    (if (and (eq 'autoload (car-safe ret)) (eq field 'message-id))
+       ;; Not loaded yet but can return message-id
+       (cdr (cdr ret))
+      (elmo-message-entity-field (elmo-msgdb-message-entity
+                                 msgdb (modb-standard-key number))
+                                field))))
+
 (luna-define-method elmo-msgdb-message-entity ((msgdb modb-standard) key)
   (when key
     (modb-standard-message-entity