-(defun elmo-msgdb-number-save (dir obj)
- (elmo-object-save
- (expand-file-name elmo-msgdb-number-filename dir)
- obj))
-
-(defun elmo-msgdb-mark-save (dir obj)
- (elmo-object-save
- (expand-file-name elmo-msgdb-mark-filename dir)
- obj))
-
-(defun elmo-msgdb-change-mark (msgdb before after)
- "Set the BEFORE marks to AFTER."
- (let ((mark-alist (elmo-msgdb-get-mark-alist msgdb))
- entity)
- (while mark-alist
- (setq entity (car mark-alist))
- (when (string= (cadr entity) before)
- (setcar (cdr entity) after))
- (setq mark-alist (cdr mark-alist)))))
-
-(defsubst elmo-msgdb-seen-save (dir obj)
- (elmo-object-save
- (expand-file-name elmo-msgdb-seen-filename dir)
- obj))
-
-(defsubst elmo-msgdb-overview-save (dir overview)
- (elmo-object-save
- (expand-file-name elmo-msgdb-overview-filename dir)
- overview))
-
-(defun elmo-msgdb-search-internal-primitive (condition entity number-list)
- (let ((key (elmo-filter-key condition))
- (case-fold-search t)
- result)
- (cond
- ((string= key "last")
- (setq result (<= (length (memq
- (elmo-msgdb-overview-entity-get-number entity)
- number-list))
- (string-to-int (elmo-filter-value condition)))))
- ((string= key "first")
- (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
- (elmo-filter-value condition)
- (elmo-msgdb-overview-entity-get-from entity))))
- ((string= key "subject")
- (setq result (string-match
- (elmo-filter-value condition)
- (elmo-msgdb-overview-entity-get-subject entity))))
- ((string= key "to")
- (setq result (string-match
- (elmo-filter-value condition)
- (elmo-msgdb-overview-entity-get-to entity))))
- ((string= key "cc")
- (setq result (string-match
- (elmo-filter-value condition)
- (elmo-msgdb-overview-entity-get-cc entity))))
- ((or (string= key "since")
- (string= key "before"))
- (let ((res (string< (timezone-make-date-sortable
- (elmo-msgdb-overview-entity-get-date entity))
- (elmo-date-make-sortable-string
- (elmo-date-get-datevec
- (elmo-filter-value condition))))))
- (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))
-
-(defun elmo-msgdb-search-internal (condition entity number-list)
- (cond
- ((vectorp condition)
- (elmo-msgdb-search-internal-primitive condition entity number-list))
- ((eq (car condition) 'and)
- (and (elmo-msgdb-search-internal
- (nth 1 condition) entity number-list)
- (elmo-msgdb-search-internal
- (nth 2 condition) entity number-list)))
- ((eq (car condition) 'or)
- (or (elmo-msgdb-search-internal
- (nth 1 condition) entity number-list)
- (elmo-msgdb-search-internal
- (nth 2 condition) entity number-list)))))
-
-(defun elmo-msgdb-delete-msgs (msgdb msgs)
- "Delete MSGS from MSGDB
-content of MSGDB is changed."
- (save-excursion
- (let* (;(msgdb (elmo-folder-msgdb folder))
- (overview (car msgdb))
- (number-alist (cadr msgdb))
- (mark-alist (caddr msgdb))
- (hashtb (elmo-msgdb-get-overviewht msgdb))
- (newmsgdb (list overview number-alist mark-alist hashtb))
- ov-entity)
- ;; remove from current database.
- (while msgs
- (setq overview
- (delq
- (setq ov-entity
- (elmo-msgdb-overview-get-entity (car msgs) newmsgdb))
- overview))
- (when (and elmo-use-overview-hashtb hashtb)
- (elmo-msgdb-clear-overview-hashtb ov-entity hashtb))
- (setq number-alist
- (delq (assq (car msgs) number-alist) number-alist))
- (setq mark-alist (delq (assq (car msgs) mark-alist) mark-alist))
- (setq msgs (cdr msgs)))
- ;(elmo-folder-set-message-modified-internal folder t)
- (setcar msgdb overview)
- (setcar (cdr msgdb) number-alist)
- (setcar (cddr msgdb) mark-alist)
- (setcar (nthcdr 3 msgdb) hashtb))
- t)) ;return value
-
-(defsubst elmo-msgdb-set-overview (msgdb overview)
- (setcar msgdb overview))
-
-(defsubst elmo-msgdb-set-number-alist (msgdb number-alist)
- (setcar (cdr msgdb) number-alist))
-
-(defsubst elmo-msgdb-set-mark-alist (msgdb mark-alist)
- (setcar (cddr msgdb) mark-alist))
-
-(defsubst elmo-msgdb-overview-entity-get-references (entity)
- (and entity (aref (cdr entity) 1)))
-
-(defsubst elmo-msgdb-overview-entity-set-references (entity references)
- (and entity (aset (cdr entity) 1 references))
- entity)
-
-;; entity -> parent-entity
-(defsubst elmo-msgdb-overview-get-parent-entity (entity database)
- (setq entity (elmo-msgdb-overview-entity-get-references entity))
- ;; entity is parent-id.
- (and entity (assoc entity database)))
-
-(defsubst elmo-msgdb-overview-entity-get-number (entity)
- (and entity (aref (cdr entity) 0)))
-
-(defsubst elmo-msgdb-overview-entity-get-from-no-decode (entity)
- (and entity (aref (cdr entity) 2)))
-
-(defsubst elmo-msgdb-overview-entity-get-from (entity)
- (and entity
- (aref (cdr entity) 2)
- (elmo-msgdb-get-decoded-cache (aref (cdr entity) 2))))
-
-(defsubst elmo-msgdb-overview-entity-set-number (entity number)
- (and entity (aset (cdr entity) 0 number))
- entity)
-;;;(setcar (cadr entity) number) entity)
-
-(defsubst elmo-msgdb-overview-entity-set-from (entity from)
- (and entity (aset (cdr entity) 2 from))
- entity)
-
-(defsubst elmo-msgdb-overview-entity-get-subject (entity)
- (and entity
- (aref (cdr entity) 3)
- (elmo-msgdb-get-decoded-cache (aref (cdr entity) 3))))
-
-(defsubst elmo-msgdb-overview-entity-get-subject-no-decode (entity)
- (and entity (aref (cdr entity) 3)))
-
-(defsubst elmo-msgdb-overview-entity-set-subject (entity subject)
- (and entity (aset (cdr entity) 3 subject))
- entity)
-
-(defsubst elmo-msgdb-overview-entity-get-date (entity)
- (and entity (aref (cdr entity) 4)))
-
-(defsubst elmo-msgdb-overview-entity-set-date (entity date)
- (and entity (aset (cdr entity) 4 date))
- entity)
-
-(defsubst elmo-msgdb-overview-entity-get-to (entity)
- (and entity (aref (cdr entity) 5)))
-
-(defsubst elmo-msgdb-overview-entity-get-cc (entity)
- (and entity (aref (cdr entity) 6)))
-
-(defsubst elmo-msgdb-overview-entity-get-size (entity)
- (and entity (aref (cdr entity) 7)))
-
-(defsubst elmo-msgdb-overview-entity-set-size (entity size)
- (and entity (aset (cdr entity) 7 size))
- entity)
-
-(defsubst elmo-msgdb-overview-entity-get-id (entity)
- (and entity (car entity)))
-
-(defsubst elmo-msgdb-overview-entity-get-extra-field (entity field-name)
- (let ((extra (and entity (aref (cdr entity) 8))))
- (and extra
- (cdr (assoc field-name extra)))))
-
-(defsubst elmo-msgdb-overview-entity-set-extra-field (entity field-name value)
- (let ((extras (and entity (aref (cdr entity) 8)))
- extra)
- (if (setq extra (assoc field-name extras))
- (setcdr extra value)
- (elmo-msgdb-overview-entity-set-extra
- entity
- (cons (cons field-name value) extras)))))
-
-(defsubst elmo-msgdb-overview-entity-get-extra (entity)
- (and entity (aref (cdr entity) 8)))
-
-(defsubst elmo-msgdb-overview-entity-set-extra (entity extra)
- (and entity (aset (cdr entity) 8 extra))
- entity)
-
-(defun elmo-msgdb-overview-get-entity-by-number (database number)
- (when number
- (let ((db database)
- entity)
- (while db
- (if (eq (elmo-msgdb-overview-entity-get-number (car db)) number)
- (setq entity (car db)
- db nil) ; exit loop
- (setq db (cdr db))))
- entity)))
-
-(defun elmo-msgdb-overview-get-entity (id msgdb)
- (when id
- (let ((ovht (elmo-msgdb-get-overviewht msgdb)))
- (if ovht ; use overview hash
- (if (stringp id) ;; ID is message-id
- (elmo-get-hash-val id ovht)
- (elmo-get-hash-val (format "#%d" id) ovht))
- (let* ((overview (elmo-msgdb-get-overview msgdb))
- (number-alist (elmo-msgdb-get-number-alist msgdb))
- (message-id (if (stringp id)
- id ;; ID is message-id
- (cdr (assq id number-alist))))
- entity)
- (if message-id
- (assoc message-id overview)
- ;; ID is number. message-id is nil or no exists in number-alist.
- (elmo-msgdb-overview-get-entity-by-number overview id)))))))