[Prev][Next][Index][Thread]
Re: Hypermail question
I'm sorry to bother you. It's corrected now works good!
It was a update-mail-archive method of mail-archive.lisp(below loop). I add
null checking as in initialize-mail-archive.
- Jong-won Choi
(defmethod update-mail-archive ((mail-archive mail-archive) &optional recache-p)
(with-slots (lock url pathname length-in-bytes size) mail-archive
(with-lock-held (lock :write "Update Mail Archive")
(let ((new-length (file-length-in-bytes pathname))
(old-length (or length-in-bytes 0))
(old-size (or size 0)))
(cond ;; lost bits better fully recompute
((or recache-p (< new-length old-length))
(flet ((init-archive (url file-stream)
(declare (ignore url))
(initialize-mail-archive mail-archive file-stream)))
(declare (dynamic-extent #'init-archive))
(apply-mail-archive url pathname #'init-archive)))
;; incremental addition on the end of the mail file.
(t (with-direct-access-open-file (file-stream pathname :direction :input)
(loop initially (set-up-input-buffer file-stream old-length new-length)
with more-messages-p = t and msg and count = (1+ old-size) and reverse-messages
with start = (ma-start-time mail-archive)
with end = (ma-end-time mail-archive)
do (multiple-value-setq (msg more-messages-p)
(create-message mail-archive file-stream count))
when msg
collect msg into messages
and do (push msg reverse-messages)
(incf count)
(cond-every
;;; Add null check
((or (null start) (msg-before-p msg start)
(setq start (or (msg-time msg) start))))
;;; Add null check
((or (null end) (msg-after-p msg end))
(setq end (or (msg-time msg) end))))
while more-messages-p
finally (setf (ma-messages mail-archive) (nconc (ma-messages mail-archive) messages)
(ma-reverse-messages mail-archive) (nconc reverse-messages (ma-reverse-messages mail-archive))
(ma-size mail-archive) (1- count)
(ma-length-in-bytes mail-archive) new-length
(ma-start-time mail-archive) start
(ma-end-time mail-archive) end
(ma-cache-time mail-archive) (get-universal-time))))))
mail-archive))))
References: