static int pop3_migration_get_special(struct mail *_mail, enum mail_fetch_field field, const char **value_r) { struct mail_private *mail = (struct mail_private *)_mail; union mail_module_context *mmail = POP3_MIGRATION_MAIL_CONTEXT(mail); struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(_mail->box); struct imap_msg_map map_key, *map; if (field == MAIL_FETCH_UIDL_BACKEND || field == MAIL_FETCH_POP3_ORDER) { if (mbox->uidl_sync_failed || pop3_migration_uidl_sync(_mail->box) < 0) { mbox->uidl_sync_failed = TRUE; mail_storage_set_error(_mail->box->storage, MAIL_ERROR_TEMP, "POP3 UIDLs couldn't be synced"); return -1; } memset(&map_key, 0, sizeof(map_key)); map_key.uid = _mail->uid; map = array_bsearch(&mbox->imap_msg_map, &map_key, imap_msg_map_uid_cmp); if (map != NULL && map->pop3_uidl != NULL) { if (field == MAIL_FETCH_UIDL_BACKEND) *value_r = map->pop3_uidl; else *value_r = t_strdup_printf("%u", map->pop3_seq); return 0; } /* not found from POP3 server, fallback to default */ } return mmail->super.get_special(_mail, field, value_r); }
static int fts_mail_get_special(struct mail *_mail, enum mail_fetch_field field, const char **value_r) { struct mail_private *mail = (struct mail_private *)_mail; struct fts_mail *fmail = FTS_MAIL_CONTEXT(mail); struct fts_transaction_context *ft = FTS_CONTEXT(_mail->transaction); const struct fts_score_map *scores; if (field != MAIL_FETCH_SEARCH_RELEVANCY || ft->scores == NULL) scores = NULL; else { scores = array_bsearch(&ft->scores->score_map, &_mail->uid, fts_score_cmp); } if (scores != NULL) { i_assert(scores->uid == _mail->uid); (void)i_snprintf(fmail->score, sizeof(fmail->score), "%f", scores->score); *value_r = fmail->score; return 0; } return fmail->module_ctx.super.get_special(_mail, field, value_r); }
struct command *command_find(const char *name) { if (commands_unsorted) { array_sort(&managesieve_commands, command_cmp); commands_unsorted = FALSE; } return array_bsearch(&managesieve_commands, name, command_bsearch); }
static struct smtp_server_command_reg * smtp_server_command_find(struct smtp_server *server, const char *name) { if (server->commands_unsorted) { array_sort(&server->commands_reg, smtp_server_command_cmp); server->commands_unsorted = FALSE; } return array_bsearch(&server->commands_reg, name, smtp_server_command_bsearch); }
const struct mail_search_register_arg * mail_search_register_find(struct mail_search_register *reg, const char *key) { struct mail_search_register_arg arg; if (!reg->args_sorted) { array_sort(®->args, mail_search_register_arg_cmp); reg->args_sorted = TRUE; } arg.key = key; return array_bsearch(®->args, &arg, mail_search_register_arg_cmp); }
bool imapc_msgmap_uid_to_rseq(struct imapc_msgmap *msgmap, uint32_t uid, uint32_t *rseq_r) { const uint32_t *p, *first; p = array_bsearch(&msgmap->uids, &uid, uint32_cmp); if (p == NULL) { *rseq_r = 0; return FALSE; } first = array_idx(&msgmap->uids, 0); *rseq_r = (p - first) + 1; return TRUE; }
bool mail_index_transaction_is_expunged(struct mail_index_transaction *t, uint32_t seq) { struct mail_transaction_expunge_guid key; if (!array_is_created(&t->expunges)) return FALSE; if (t->expunges_nonsorted) mail_index_transaction_sort_expunges(t); key.uid = seq; return array_bsearch(&t->expunges, &key, mail_transaction_expunge_guid_cmp) != NULL; }