;;; elmo-msgdb.el -- Message Database for Elmo.
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
;; Author: Yuuichi Teranishi <teranisi@gohome.org>
+;; Masahiro MURATA <muse@ba2.so-net.ne.jp>
;; Keywords: mail, net news
;; This file is part of ELMO (Elisp Library for Message Orchestration).
(defsubst elmo-msgdb-append-element (list element)
(if list
- ;(append list (list element))
+;;; (append list (list element))
(nconc list (list element))
;; list is nil
(list element)))
ret-val))
(defun elmo-msgdb-mark-append (alist id mark)
- "Append mark"
+ "Append mark."
(setq alist (elmo-msgdb-append-element alist
(list id mark))))
(defun elmo-msgdb-mark-alist-to-seen-list (number-alist mark-alist seen-marks)
- "Make seen-list from mark-alist"
+ "Make seen-list from MARK-ALIST."
(let ((seen-mark-list (string-to-char-list seen-marks))
ret-val ent)
(while number-alist
number-list))
(string-to-int (elmo-filter-value condition)))))
((string= key "first")
- (setq result (< (-
+ (setq result (< (-
(length number-list)
(length (memq
(elmo-msgdb-overview-entity-get-number entity)
number-list)))
(string-to-int (elmo-filter-value condition)))))
((string= key "from")
- (setq result (string-match
+ (setq result (string-match
(elmo-filter-value condition)
(elmo-msgdb-overview-entity-get-from entity))))
((string= key "subject")
- (setq result (string-match
+ (setq result (string-match
(elmo-filter-value condition)
(elmo-msgdb-overview-entity-get-subject entity))))
((string= key "to")
(elmo-date-make-sortable-string
(elmo-date-get-datevec
(elmo-filter-value condition))))))
- (setq result (if (string= key "before") res (not res))))))
+ (setq result (if (string= key "before") res (not res)))))
+ ((member key elmo-msgdb-extra-fields)
+ (let ((extval (elmo-msgdb-overview-entity-get-extra-field entity key)))
+ (if (stringp extval)
+ (setq result (string-match
+ (elmo-filter-value condition)
+ extval))))))
(if (eq (elmo-filter-type condition) 'unmatch)
(setq result (not result)))
result))
(if (and (not reserve-cache) message-id)
(elmo-cache-delete message-id
folder (car msg-list)))
- ;; This is no good!!!!
- ;(setq overview (delete (assoc message-id overview) overview))
+;;; This is no good!!!!
+;;; (setq overview (delete (assoc message-id overview) overview))
(setq overview
(delq
(setq ov-entity
(defsubst elmo-msgdb-overview-entity-set-number (entity number)
(and entity (aset (cdr entity) 0 number))
entity)
- ;(setcar (cadr entity) number) entity)
+;;;(setcar (cadr entity) number) entity)
(defsubst elmo-msgdb-overview-entity-set-from (entity from)
(and entity (aset (cdr entity) 2 from))
(elmo-msgdb-killed-list-load dir)
msgs))))
+(defun elmo-msgdb-killed-list-length (killed-list)
+ (let ((killed killed-list)
+ (ret-val 0))
+ (while (car killed)
+ (if (consp (car killed))
+ (setq ret-val (+ ret-val 1 (- (cdar killed) (caar killed))))
+ (setq ret-val (+ ret-val 1)))
+ (setq killed (cdr killed)))
+ ret-val))
+
+(defun elmo-msgdb-max-of-killed (killed-list)
+ (let ((klist killed-list)
+ (max 0)
+ k)
+ (while (car klist)
+ (if (< max
+ (setq k
+ (if (consp (car klist))
+ (cdar klist)
+ (car klist))))
+ (setq max k))
+ (setq klist (cdr klist)))
+ max))
+
(defun elmo-living-messages (messages killed-list)
(if killed-list
(delq nil
(message "Sorting...")
(let ((overview (elmo-msgdb-get-overview msgdb)))
(setq overview (elmo-msgdb-overview-sort-by-date overview))
- (message "Sorting...done.")
+ (message "Sorting...done")
(list overview (nth 1 msgdb)(nth 2 msgdb)(nth 3 msgdb)(nth 4 msgdb))))
(defun elmo-msgdb-clear-overview-hashtb (entity hashtb)
(elmo-delete-directory path t))))
(defun elmo-msgdb-rename-path (old-folder new-folder &optional old-spec new-spec)
- (let* ((old (directory-file-name (elmo-msgdb-expand-path old-spec)))
- (new (directory-file-name (elmo-msgdb-expand-path new-spec)))
+ (let* ((old (directory-file-name (elmo-msgdb-expand-path old-folder)))
+ (new (directory-file-name (elmo-msgdb-expand-path new-folder)))
(new-dir (directory-file-name (file-name-directory new))))
(if (not (file-directory-p old))
()
(if (file-exists-p new)
- (error "already exists directory: %s" new)
+ (error "Already exists directory: %s" new)
(if (not (file-exists-p new-dir))
(elmo-make-directory new-dir))
(rename-file old new)))))
+(defun elmo-generic-folder-diff (spec folder &optional number-list)
+ (let ((cached-in-db-max (elmo-folder-get-info-max folder))
+ (in-folder (elmo-call-func folder "max-of-folder"))
+ (in-db t)
+ unsync messages
+ in-db-max)
+ (if (or number-list (not cached-in-db-max))
+ (let ((number-list (or number-list
+ (mapcar 'car
+ (elmo-msgdb-number-load
+ (elmo-msgdb-expand-path folder))))))
+ ;; No info-cache.
+ (setq in-db (sort number-list '<))
+ (setq in-db-max (or (nth (max 0 (1- (length in-db))) in-db)
+ 0))
+ (if (not number-list)
+ (elmo-folder-set-info-hashtb folder in-db-max nil)))
+ (setq in-db-max cached-in-db-max))
+ (setq unsync (if (and in-db
+ (car in-folder))
+ (- (car in-folder) in-db-max)
+ (if (and in-folder
+ (null in-db))
+ (cdr in-folder)
+ (if (null (car in-folder))
+ nil))))
+ (setq messages (cdr in-folder))
+ (if (and unsync messages (> unsync messages))
+ (setq unsync messages))
+ (cons (or unsync 0) (or messages 0))))
+
+(defun elmo-generic-list-folder-unread (spec number-alist mark-alist
+ unread-marks)
+ (delq nil
+ (mapcar
+ (function (lambda (x)
+ (if (member (cadr (assq (car x) mark-alist)) unread-marks)
+ (car x))))
+ mark-alist)))
+
+(defsubst elmo-folder-get-info (folder &optional hashtb)
+ (elmo-get-hash-val folder
+ (or hashtb elmo-folder-info-hashtb)))
+
+(defun elmo-folder-set-info-hashtb (folder max numbers &optional new unread)
+ (let ((info (elmo-folder-get-info folder)))
+ (when info
+ (or new (setq new (nth 0 info)))
+ (or unread (setq unread (nth 1 info)))
+ (or numbers (setq numbers (nth 2 info)))
+ (or max (setq max (nth 3 info))))
+ (elmo-set-hash-val folder
+ (list new unread numbers max)
+ elmo-folder-info-hashtb)))
+
+(defun elmo-folder-set-info-max-by-numdb (folder msgdb-number)
+ (let ((num-db (sort (mapcar 'car msgdb-number) '<)))
+ (elmo-folder-set-info-hashtb
+ folder
+ (or (nth (max 0 (1- (length num-db))) num-db) 0)
+ nil ;;(length num-db)
+ )))
+
+(defun elmo-folder-get-info-max (folder)
+ "Get folder info from cache."
+ (nth 3 (elmo-folder-get-info folder)))
+
+(defun elmo-folder-get-info-length (folder)
+ (nth 2 (elmo-folder-get-info folder)))
+
+(defun elmo-folder-get-info-unread (folder)
+ (nth 1 (elmo-folder-get-info folder)))
+
+(defun elmo-folder-info-make-hashtb (info-alist hashtb)
+ (let* ((hashtb (or hashtb
+ (elmo-make-hash (length info-alist)))))
+ (mapcar
+ '(lambda (x)
+ (let ((info (cadr x)))
+ (and (intern-soft (car x) hashtb)
+ (elmo-set-hash-val (car x)
+ (list (nth 2 info) ;; new
+ (nth 3 info) ;; unread
+ (nth 1 info) ;; length
+ (nth 0 info)) ;; max
+ hashtb))))
+ info-alist)
+ (setq elmo-folder-info-hashtb hashtb)))
+
(require 'product)
(product-provide (provide 'elmo-msgdb) (require 'elmo-version))