(gnus-declare-backend "nnir" 'mail)
(defvar nnir-imap-search-field "TEXT"
- "The IMAP search item when doing an nnir search")
+ "The IMAP search item when doing an nnir search. To use raw
+ imap queries by default set this to \"\"")
(defvar nnir-imap-search-arguments
'(("Whole message" . "TEXT")
("Subject" . "SUBJECT")
("To" . "TO")
("From" . "FROM")
- (nil . "HEADER \"%s\""))
+ ("Head" . "HEADER \"%s\"")
+ (nil . ""))
"Mapping from user readable strings to IMAP search items for use in nnir")
(defvar nnir-imap-search-argument-history ()
(autoload 'imap-search "imap")
(autoload 'imap-quote-specials "imap")
+(eval-when-compile
+ (autoload 'nnimap-buffer "nnimap")
+ (autoload 'nnimap-command "nnimap")
+ (autoload 'nnimap-possibly-change-group "nnimap"))
+
(defun nnir-run-imap (query srv &optional group-option)
"Run a search against an IMAP back-end server.
This uses a custom query language parser; see `nnir-imap-make-query' for
(defs (caddr (gnus-server-to-method srv)))
(criteria (or (cdr (assq 'criteria query))
nnir-imap-search-field))
- artlist buf)
+ (gnus-inhibit-demon t)
+ artlist)
(message "Opening server %s" server)
(condition-case ()
- (when (nnimap-open-server server defs) ;; xxx
- (setq buf nnimap-server-buffer) ;; xxx
- (message "Searching %s..." group)
- (let ((arts 0)
- (mbx (gnus-group-real-name group)))
- (when (imap-mailbox-select mbx nil buf)
- (mapc
- (lambda (artnum)
- (push (vector group artnum 1) artlist)
- (setq arts (1+ arts)))
- (imap-search (nnir-imap-make-query criteria qstring) buf))
- (message "Searching %s... %d matches" mbx arts)))
- (message "Searching %s...done" group))
- (quit nil))
+ (when (nnimap-possibly-change-group (gnus-group-short-name group) server)
+ (with-current-buffer (nnimap-buffer)
+ (message "Searching %s..." group)
+ (let ((arts 0)
+ (result
+ (nnimap-command "UID SEARCH %s"
+ (if (string= criteria "")
+ qstring
+ (nnir-imap-make-query criteria qstring)
+ ))))
+ (mapc
+ (lambda (artnum)
+ (push (vector group artnum 1) artlist)
+ (setq arts (1+ arts)))
+ (and (car result)
+ (delete 0 (mapcar #'string-to-number
+ (cdr (assoc "SEARCH" (cdr result)))))))
+ (message "Searching %s... %d matches" group arts)))
+ (message "Searching %s...done" group))
+ (quit nil))
(reverse artlist))))
(defun nnir-imap-make-query (criteria qstring)