
w
Www ssearchasearchchsearchs
a Findmortgagehomemortgages csearchi Www m Findmortgagehomemortgages W Tag w Tag Fisearchdsearchot Findmortgagehomemortgages asearcheho Findmortgagehomemortgages emo Peach tsearchasearchesearch Www s Www ar Tag hg
hsearchmmo Www t Www a Peach e
Tag Tag a Tag Tag Findmortgagehomemortgages i Www dmosearchtg Findmortgagehomemortgages g Peach hsearchm Tag m Www rsearchg Www g Peach s Peach
Www searchsearchsearch
struct mail_search_arg是某一个参数的具体信息,比如seen或flagged。
但是由于search命令的特殊性,参杂了复杂的与或运算,比如带有or和()的判断解析。
这里dovecot的巧妙就在于,它把参数的作用域划定了范围,把大范围的参数串成外部链表,中度范围的参数用struct mail_search_seqset *seqset在内部继续串成链表,再有更小范围的参数话还能继续往深层串连,同时给每一层的类型加了标识,如enum mail_search_arg_type type和enum mail_flags flags,具体如下:
enum mail_search_arg_type { SEARCH_OR, SEARCH_SUB, /* sequence sets */ SEARCH_ALL, SEARCH_SEQSET, /* flags */ SEARCH_FLAGS, SEARCH_KEYWORDS, ... }; enum mail_flags { MAIL_ANSWERED = 0x01, MAIL_FLAGGED = 0x02, MAIL_DELETED = 0x04, MAIL_SEEN = 0x08, MAIL_DRAFT = 0x10, MAIL_RECENT = 0x20, MAIL_FLAGS_MASK = 0x3f, MAIL_FLAGS_NONRECENT = (MAIL_FLAGS_MASK ^ MAIL_RECENT) }; uid -- SEARCH_SEQSET; 1:* -- SEARCH_SEQSET; or -- SEARCH_OR; { -- SEARCH_SUB; seen -- SEARCH_FLAGS; answered -- SEARCH_FLAGS; or -- SEARCH_OR; { -- SEARCH_SUB; deleted -- SEARCH_FLAGS; unseen -- SEARCH_FLAGS; } flagged -- SEARCH_FLAGS; }
具体代码存于:/dovecot-1.1.16/src/imap/cmd-search.c