]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Removed fetch_init/fetch_next from mail-storage. search_* makes it
authorTimo Sirainen <tss@iki.fi>
Sun, 26 Oct 2003 20:13:15 +0000 (22:13 +0200)
committerTimo Sirainen <tss@iki.fi>
Sun, 26 Oct 2003 20:13:15 +0000 (22:13 +0200)
unnecessary

--HG--
branch : HEAD

18 files changed:
src/imap/cmd-copy.c
src/imap/cmd-search.c
src/imap/cmd-store.c
src/imap/imap-fetch.c
src/imap/imap-fetch.h
src/imap/imap-search.c
src/imap/imap-search.h
src/imap/imap-sort.c
src/imap/imap-thread.c
src/lib-storage/index/index-fetch.c
src/lib-storage/index/index-search.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/mail-storage.h
src/lib-storage/proxy-mailbox.c
src/pop3/client.c
src/pop3/commands.c

index 0a1dccd33c1c8c12f510840e6c2275bfba3fb695..3956cf8513a83298516a11d867015aba5df78351 100644 (file)
@@ -2,29 +2,32 @@
 
 #include "common.h"
 #include "commands.h"
+#include "imap-search.h"
 
 static int fetch_and_copy(struct mail_copy_context *copy_ctx,
                          struct mailbox *srcbox, struct mailbox *destbox,
                          const char *messageset, int uidset, int *all_found)
 {
-       struct mail_fetch_context *fetch_ctx;
+       struct mail_search_arg *search_arg;
+       struct mail_search_context *search_ctx;
        struct mail *mail;
        int failed = FALSE;
 
-       fetch_ctx = srcbox->fetch_init(srcbox, MAIL_FETCH_STREAM_HEADER |
-                                      MAIL_FETCH_STREAM_BODY, NULL,
-                                      messageset, uidset);
-       if (fetch_ctx == NULL)
+       search_arg = imap_search_get_msgset_arg(messageset, uidset);
+       search_ctx = srcbox->search_init(srcbox, NULL, search_arg, NULL,
+                                        MAIL_FETCH_STREAM_HEADER |
+                                        MAIL_FETCH_STREAM_BODY, NULL);
+       if (search_ctx == NULL)
                return FALSE;
 
-       while ((mail = srcbox->fetch_next(fetch_ctx)) != NULL) {
+       while ((mail = srcbox->search_next(search_ctx)) != NULL) {
                if (!destbox->copy(mail, copy_ctx)) {
                        failed = TRUE;
                        break;
                }
        }
 
-       if (!srcbox->fetch_deinit(fetch_ctx, all_found))
+       if (!srcbox->search_deinit(search_ctx, all_found))
                return FALSE;
 
        return !failed;
index a6eeb5545ffbfd2dad64dd6569a4d75f7a9dbfd7..b6d7471a8b7dd16524f97f408f5bf2f27dcbadb2 100644 (file)
@@ -37,7 +37,7 @@ static int imap_search(struct client *client, const char *charset,
                str_printfa(str, " %u", uid ? mail->uid : mail->seq);
        }
 
-       ret = client->mailbox->search_deinit(ctx);
+       ret = client->mailbox->search_deinit(ctx, NULL);
 
        if (!first || ret) {
                str_append(str, "\r\n");
index 61b2dcbfefda8b24e5bb90a9926c0b2e7add48f6..4022de732672805a31dc3e76c3e27e5d164e918e 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "common.h"
 #include "commands.h"
+#include "imap-search.h"
 
 static int get_modify_type(struct client *client, const char *item,
                           enum modify_type *modify_type, int *silent)
@@ -59,7 +60,8 @@ int cmd_store(struct client *client)
        struct mail_full_flags flags;
        enum modify_type modify_type;
        struct mailbox *box;
-       struct mail_fetch_context *fetch_ctx;
+       struct mail_search_arg *search_arg;
+       struct mail_search_context *search_ctx;
        struct mail *mail;
        const char *messageset, *item;
        int silent, all_found, failed;
@@ -104,14 +106,16 @@ int cmd_store(struct client *client)
                                    MAILBOX_LOCK_READ);
        }
 
-       fetch_ctx = failed ? NULL :
-               box->fetch_init(box, MAIL_FETCH_FLAGS, NULL,
-                               messageset, client->cmd_uid);
-       if (fetch_ctx == NULL)
+       search_arg = imap_search_get_msgset_arg(messageset, client->cmd_uid);
+       search_ctx = failed ? NULL :
+               box->search_init(box, NULL, search_arg, NULL,
+                                MAIL_FETCH_FLAGS, NULL);
+
+       if (search_ctx == NULL)
                failed = TRUE;
        else {
                failed = FALSE;
-               while ((mail = box->fetch_next(fetch_ctx)) != NULL) {
+               while ((mail = box->search_next(search_ctx)) != NULL) {
                        if (!mail->update_flags(mail, &flags, modify_type)) {
                                failed = TRUE;
                                break;
@@ -126,7 +130,7 @@ int cmd_store(struct client *client)
                }
        }
 
-       if (!box->fetch_deinit(fetch_ctx, &all_found))
+       if (!box->search_deinit(search_ctx, &all_found))
                failed = TRUE;
 
        (void)box->lock(box, MAILBOX_LOCK_UNLOCK);
index 2a92bedc73959c7736af146144891bc7ca95e75b..d8f150c63bb5b8ba9cce73bbc2552897596cf09f 100644 (file)
@@ -10,6 +10,7 @@
 #include "imap-date.h"
 #include "commands.h"
 #include "imap-fetch.h"
+#include "imap-search.h"
 
 #include <unistd.h>
 
@@ -330,6 +331,7 @@ int imap_fetch(struct client *client,
               const char *messageset, int uidset)
 {
        struct mailbox *box = client->mailbox;
+       struct mail_search_arg *search_arg;
        struct imap_fetch_context ctx;
        struct mail *mail;
        struct imap_fetch_body_data *body;
@@ -386,13 +388,14 @@ int imap_fetch(struct client *client,
                        return -1;
        }
 
-       ctx.fetch_ctx = box->fetch_init(box, fetch_data, wanted_headers,
-                                       messageset, uidset);
-       if (ctx.fetch_ctx == NULL)
+       search_arg = imap_search_get_msgset_arg(messageset, uidset);
+       ctx.search_ctx = box->search_init(box, NULL, search_arg, NULL,
+                                         fetch_data, wanted_headers);
+       if (ctx.search_ctx == NULL)
                ctx.failed = TRUE;
        else {
                ctx.str = str_new(default_pool, 8192);
-               while ((mail = box->fetch_next(ctx.fetch_ctx)) != NULL) {
+               while ((mail = box->search_next(ctx.search_ctx)) != NULL) {
                        if (!fetch_mail(&ctx, mail)) {
                                ctx.failed = TRUE;
                                break;
@@ -400,7 +403,7 @@ int imap_fetch(struct client *client,
                }
                str_free(ctx.str);
 
-               if (!box->fetch_deinit(ctx.fetch_ctx, &all_found))
+               if (!box->search_deinit(ctx.search_ctx, &all_found))
                        ctx.failed = TRUE;
        }
 
index bd55060ff8807f2a0b7a229b6784c844575df5d5..e53623b2a131492fee771233fcce263dd40dc991 100644 (file)
@@ -19,7 +19,7 @@ struct imap_fetch_body_data {
 };
 
 struct imap_fetch_context {
-       struct mail_fetch_context *fetch_ctx;
+       struct mail_search_context *search_ctx;
 
        enum mail_fetch_field fetch_data;
        enum imap_fetch_field imap_data;
index 9b2c6168d6ba5a3b94f43fcbba4464a3ef0a713e..50836dbf313d275f87098afe8d32f9e63b2141e7 100644 (file)
@@ -349,3 +349,13 @@ imap_search_args_build(pool_t pool, struct imap_arg *args, const char **error)
        return first_sarg;
 }
 
+struct mail_search_arg *
+imap_search_get_msgset_arg(const char *messageset, int uidset)
+{
+       struct mail_search_arg *arg;
+
+       arg = t_new(struct mail_search_arg, 1);
+       arg->type = uidset ? SEARCH_UID : SEARCH_SET;
+       arg->value.str = t_strdup(messageset);
+       return arg;
+}
index bc710ea047e364d81d161d18625dba287812d15b..c2a9a8d8d570b41e680046bd6f4d7db2e2175dfa 100644 (file)
@@ -5,4 +5,7 @@
 struct mail_search_arg *
 imap_search_args_build(pool_t pool, struct imap_arg *args, const char **error);
 
+struct mail_search_arg *
+imap_search_get_msgset_arg(const char *messageset, int uidset);
+
 #endif
index 6589283b867f246e6cd26a42c429c5d797898487..4e8818bd1b82e06ebb420a2674f1f31334fdef7a 100644 (file)
@@ -244,7 +244,7 @@ int imap_sort(struct client *client, const char *charset,
                mail_sort_input(ctx, mail);
 
        mail_sort_flush(ctx);
-       ret = client->mailbox->search_deinit(ctx->search_ctx);
+       ret = client->mailbox->search_deinit(ctx->search_ctx, NULL);
 
        if (ctx->written || ret) {
                str_append(ctx->str, "\r\n");
index 57b8a7f51f6c30b60c60cbdb3d8858d5ace40d4b..87a468d2bde4ef01011f37378042ef6008cb0999 100644 (file)
@@ -142,7 +142,7 @@ int imap_thread(struct client *client, const char *charset,
        mail_thread_finish(ctx);
        o_stream_send_str(client->output, "\r\n");
 
-       ret = client->mailbox->search_deinit(ctx->search_ctx);
+       ret = client->mailbox->search_deinit(ctx->search_ctx, NULL);
         mail_thread_deinit(ctx);
        return ret;
 }
index 89c1a3cbcdfc0feae45ed2a4c9c7ee036d60db64..fdaaf8020c622f56fc55a20ea38d81ae64ad10a8 100644 (file)
 #include "index-messageset.h"
 #include "index-mail.h"
 
-struct mail_fetch_context {
-       struct index_mailbox *ibox;
-       struct mail_index *index;
-
-       struct messageset_context *msgset_ctx;
-       struct index_mail mail;
-
-       enum mail_lock_type old_lock;
-};
-
-struct mail_fetch_context *
-index_storage_fetch_init(struct mailbox *box,
-                        enum mail_fetch_field wanted_fields,
-                        const char *const *wanted_headers,
-                        const char *messageset, int uidset)
-{
-       struct index_mailbox *ibox = (struct index_mailbox *) box;
-       struct mail_fetch_context *ctx;
-       int check_mail;
-
-       ctx = i_new(struct mail_fetch_context, 1);
-       ctx->old_lock = ibox->index->lock_type;
-
-       check_mail = (client_workarounds &
-                     WORKAROUND_OE6_FETCH_NO_NEWMAIL) == 0;
-       if (!index_storage_sync_and_lock(ibox, check_mail, TRUE,
-                                        MAIL_LOCK_SHARED))
-               return NULL;
-
-       ctx->ibox = ibox;
-       ctx->index = ibox->index;
-
-       index_mail_init(ibox, &ctx->mail, wanted_fields, wanted_headers);
-       ctx->msgset_ctx = index_messageset_init(ibox, messageset, uidset, TRUE);
-       return ctx;
-}
-
-int index_storage_fetch_deinit(struct mail_fetch_context *ctx, int *all_found)
-{
-       int ret;
-
-       ret = index_messageset_deinit(ctx->msgset_ctx);
-
-       if (all_found != NULL)
-               *all_found = ret > 0;
-
-       if (ctx->ibox->fetch_mail.pool != NULL)
-               index_mail_deinit(&ctx->ibox->fetch_mail);
-       if (ctx->mail.pool != NULL)
-               index_mail_deinit(&ctx->mail);
-
-       if (!index_storage_lock(ctx->ibox, ctx->old_lock))
-               ret = -1;
-
-       i_free(ctx);
-       return ret >= 0;
-}
-
-struct mail *index_storage_fetch_next(struct mail_fetch_context *ctx)
-{
-       const struct messageset_mail *msgset_mail;
-       int ret;
-
-       do {
-               msgset_mail = index_messageset_next(ctx->msgset_ctx);
-               if (msgset_mail == NULL) {
-                       ret = -1;
-                       break;
-               }
-
-               ctx->mail.mail.seq = msgset_mail->client_seq;
-               ctx->mail.mail.uid = msgset_mail->rec->uid;
-
-               ret = index_mail_next(&ctx->mail, msgset_mail->rec,
-                                     msgset_mail->idx_seq, FALSE);
-       } while (ret == 0);
-
-       if (ret < 0) {
-               /* error or last record */
-               index_mail_deinit(&ctx->mail);
-               return NULL;
-       }
-
-       return &ctx->mail.mail;
-}
-
 static struct mail *
 fetch_record(struct index_mailbox *ibox, struct mail_index_record *rec,
             unsigned int idx_seq, enum mail_fetch_field wanted_fields)
index d93f732753e7d499b33cc1224b009d02865cd443..68bc9ccf21bc292b461f2006edd9fafddf2299d9 100644 (file)
@@ -870,15 +870,21 @@ index_storage_search_init(struct mailbox *box, const char *charset,
        return ctx;
 }
 
-int index_storage_search_deinit(struct mail_search_context *ctx)
+int index_storage_search_deinit(struct mail_search_context *ctx, int *all_found)
 {
-       int ret;
+       int ret, msgset_ret;
 
        ret = !ctx->failed && ctx->error == NULL;
 
        if (ctx->msgset_ctx != NULL) {
-               if (index_messageset_deinit(ctx->msgset_ctx) < 0)
+               msgset_ret = index_messageset_deinit(ctx->msgset_ctx);
+               if (msgset_ret < 0)
                        ret = FALSE;
+               if (all_found != NULL)
+                       *all_found = msgset_ret > 0;
+       } else {
+               if (all_found != NULL)
+                       *all_found = !ctx->failed;
        }
 
        if (ctx->ibox->fetch_mail.pool != NULL)
index eba3509bb4414095de8c97bddf191522e1388835..18204f2550da63551c2a7075ca45ac9b85e7cdff 100644 (file)
@@ -98,14 +98,6 @@ int index_storage_get_status(struct mailbox *box,
                             struct mailbox_status *status);
 int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags);
 
-struct mail_fetch_context *
-index_storage_fetch_init(struct mailbox *box,
-                        enum mail_fetch_field wanted_fields,
-                        const char *const *wanted_headers,
-                        const char *messageset, int uidset);
-int index_storage_fetch_deinit(struct mail_fetch_context *ctx, int *all_found);
-struct mail *index_storage_fetch_next(struct mail_fetch_context *ctx);
-
 struct mail *index_storage_fetch_uid(struct mailbox *box, unsigned int uid,
                                     enum mail_fetch_field wanted_fields);
 struct mail *index_storage_fetch_seq(struct mailbox *box, unsigned int seq,
@@ -119,7 +111,8 @@ index_storage_search_init(struct mailbox *box, const char *charset,
                          const enum mail_sort_type *sort_program,
                          enum mail_fetch_field wanted_fields,
                          const char *const wanted_headers[]);
-int index_storage_search_deinit(struct mail_search_context *ctx);
+int index_storage_search_deinit(struct mail_search_context *ctx,
+                               int *all_found);
 struct mail *index_storage_search_next(struct mail_search_context *ctx);
 
 struct mail_copy_context *index_storage_copy_init(struct mailbox *box);
index afac326951280592b64f28acebb2f61d68fd8506..986d8beaf78db4bcd95d393eea226e9986817a3f 100644 (file)
@@ -857,9 +857,6 @@ struct mailbox maildir_mailbox = {
        index_storage_get_status,
        index_storage_sync,
        maildir_storage_auto_sync,
-       index_storage_fetch_init,
-       index_storage_fetch_deinit,
-       index_storage_fetch_next,
        index_storage_fetch_uid,
        index_storage_fetch_seq,
         index_storage_search_get_sorting,
index 1f2794e055f966e39d84d3395c62ffdc93021594..d10c0a365a531ff9227dfda4faa5c6761c283645 100644 (file)
@@ -857,9 +857,6 @@ struct mailbox mbox_mailbox = {
        index_storage_get_status,
        index_storage_sync,
        mbox_storage_auto_sync,
-       index_storage_fetch_init,
-       index_storage_fetch_deinit,
-       index_storage_fetch_next,
        index_storage_fetch_uid,
        index_storage_fetch_seq,
         index_storage_search_get_sorting,
index 7a99ffcd0c3eea76a7e56c58c9694ac775df6865..5ced9790bbcef9be60dbdf4af6268a9ad2cc8d65 100644 (file)
@@ -253,21 +253,6 @@ struct mailbox {
        void (*auto_sync)(struct mailbox *box, enum mailbox_sync_flags flags,
                          unsigned int min_newmail_notify_interval);
 
-       /* Initialize new fetch request. wanted_fields isn't required, but it
-          can be used for optimizations. update_flags must be set to TRUE, if
-          you want to call mail->update_flags() */
-       struct mail_fetch_context *
-               (*fetch_init)(struct mailbox *box,
-                             enum mail_fetch_field wanted_fields,
-                             const char *const *wanted_headers,
-                             const char *messageset, int uidset);
-       /* Deinitialize fetch request. all_found is set to TRUE if all of the
-          fetched messages were found (ie. not just deleted). */
-       int (*fetch_deinit)(struct mail_fetch_context *ctx, int *all_found);
-       /* Fetch the next message. Returned mail object can be used until
-          the next call to fetch_next() or fetch_deinit(). */
-       struct mail *(*fetch_next)(struct mail_fetch_context *ctx);
-
        /* Simplified fetching for a single UID or sequence. Must be called
           between fetch_init() .. fetch_deinit() or
           search_init() .. search_deinit() */
@@ -296,8 +281,9 @@ struct mailbox {
                               const enum mail_sort_type *sort_program,
                               enum mail_fetch_field wanted_fields,
                               const char *const wanted_headers[]);
-       /* Deinitialize search request. */
-       int (*search_deinit)(struct mail_search_context *ctx);
+       /* Deinitialize search request. all_found is set to TRUE if all of the
+          messages in search range were found. */
+       int (*search_deinit)(struct mail_search_context *ctx, int *all_found);
        /* Search the next message. Returned mail object can be used until
           the next call to search_next() or search_deinit(). */
        struct mail *(*search_next)(struct mail_search_context *ctx);
index f241598ad882eba63f00d7a10ab4ede738cda455..a3e8ab9ffc42465e42d3695c67e102a15182b184 100644 (file)
@@ -54,17 +54,6 @@ static void _auto_sync(struct mailbox *box, enum mailbox_sync_flags flags,
        p->box->auto_sync(p->box, flags, min_newmail_notify_interval);
 }
 
-static struct mail_fetch_context *
-_fetch_init(struct mailbox *box, enum mail_fetch_field wanted_fields,
-           const char *const *wanted_headers,
-           const char *messageset, int uidset)
-{
-       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
-
-       return p->box->fetch_init(p->box, wanted_fields, wanted_headers,
-                                 messageset, uidset);
-}
-
 static struct mail *_fetch_uid(struct mailbox *box, unsigned int uid,
                               enum mail_fetch_field wanted_fields)
 {
@@ -142,8 +131,6 @@ void proxy_mailbox_init(struct proxy_mailbox *proxy, struct mailbox *box)
        pb->name = box->name;
        pb->storage = box->storage;
 
-       pb->fetch_deinit = box->fetch_deinit;
-       pb->fetch_next = box->fetch_next;
        pb->search_deinit = box->search_deinit;
        pb->search_next = box->search_next;
        pb->save_deinit = box->save_deinit;
@@ -159,7 +146,6 @@ void proxy_mailbox_init(struct proxy_mailbox *proxy, struct mailbox *box)
        pb->get_status = _get_status;
        pb->sync = _sync;
        pb->auto_sync = _auto_sync;
-       pb->fetch_init = _fetch_init;
        pb->fetch_uid = _fetch_uid;
        pb->fetch_seq = _fetch_seq;
        pb->search_get_sorting = _search_get_sorting;
index a269f794632c1f2b13a4ece915877a59b3eb5fa1..4762bc58084843d33c5f56dac49fb3b55101676f 100644 (file)
@@ -7,6 +7,7 @@
 #include "ostream.h"
 #include "mail-storage.h"
 #include "commands.h"
+#include "mail-search.h"
 
 #include <stdlib.h>
 
@@ -39,10 +40,10 @@ static void client_output_timeout(void *context)
 
 static int init_mailbox(struct client *client)
 {
-       struct mail_fetch_context *ctx;
+       struct mail_search_arg search_arg;
+       struct mail_search_context *ctx;
        struct mail *mail;
        struct mailbox_status status;
-       const char *messageset;
        int i, all_found, failed;
 
        if (!client->mailbox->get_status(client->mailbox,
@@ -58,12 +59,14 @@ static int init_mailbox(struct client *client)
        if (client->messages_count == 0)
                return TRUE;
 
+       memset(&search_arg, 0, sizeof(search_arg));
+       search_arg.type = SEARCH_ALL;
+
        client->message_sizes = i_new(uoff_t, client->messages_count);
-       messageset = t_strdup_printf("1:%u", client->messages_count);
        for (i = 0; i < 2; i++) {
-               ctx = client->mailbox->fetch_init(client->mailbox,
-                                                 MAIL_FETCH_SIZE, NULL,
-                                                 messageset, FALSE);
+               ctx = client->mailbox->search_init(client->mailbox, NULL,
+                                                  &search_arg, NULL,
+                                                  MAIL_FETCH_SIZE, NULL);
                if (ctx == NULL) {
                        client_send_storage_error(client);
                        return FALSE;
@@ -71,7 +74,7 @@ static int init_mailbox(struct client *client)
 
                client->total_size = 0;
                failed = FALSE;
-               while ((mail = client->mailbox->fetch_next(ctx)) != NULL) {
+               while ((mail = client->mailbox->search_next(ctx)) != NULL) {
                        uoff_t size = mail->get_size(mail);
 
                        if (size == (uoff_t)-1) {
@@ -84,7 +87,7 @@ static int init_mailbox(struct client *client)
                        client->message_sizes[mail->seq-1] = size;
                }
 
-               if (!client->mailbox->fetch_deinit(ctx, &all_found)) {
+               if (!client->mailbox->search_deinit(ctx, &all_found)) {
                        client_send_storage_error(client);
                        return FALSE;
                }
index 45b4ea226f41d69493b6d686633cdbf37068e67d..218a2f1f1542aba5e3f9a58ccb9ee44005ac86aa 100644 (file)
@@ -6,6 +6,7 @@
 #include "str.h"
 #include "message-size.h"
 #include "mail-storage.h"
+#include "mail-search.h"
 #include "capability.h"
 #include "commands.h"
 
@@ -255,20 +256,25 @@ static void stream_send_escaped(struct ostream *output, struct istream *input,
 static void fetch(struct client *client, unsigned int msgnum,
                  uoff_t body_lines)
 {
-       struct mail_fetch_context *ctx;
+       struct mail_search_arg search_arg;
+       struct mail_search_context *ctx;
        struct mail *mail;
        struct istream *stream;
 
-       ctx = client->mailbox->fetch_init(client->mailbox,
-                                         MAIL_FETCH_STREAM_HEADER |
-                                         MAIL_FETCH_STREAM_BODY, NULL,
-                                         dec2str(msgnum+1), FALSE);
+       memset(&search_arg, 0, sizeof(search_arg));
+       search_arg.type = SEARCH_SET;
+       search_arg.value.str = dec2str(msgnum+1);
+
+       ctx = client->mailbox->search_init(client->mailbox, NULL,
+                                          &search_arg, NULL,
+                                          MAIL_FETCH_STREAM_HEADER |
+                                          MAIL_FETCH_STREAM_BODY, NULL);
        if (ctx == NULL) {
                client_send_storage_error(client);
                return;
        }
 
-       mail = client->mailbox->fetch_next(ctx);
+       mail = client->mailbox->search_next(ctx);
        stream = mail == NULL ? NULL : mail->get_stream(mail, NULL, NULL);
        if (stream == NULL)
                client_send_line(client, "-ERR Message not found.");
@@ -284,7 +290,7 @@ static void fetch(struct client *client, unsigned int msgnum,
                client_send_line(client, ".");
        }
 
-       (void)client->mailbox->fetch_deinit(ctx, NULL);
+       (void)client->mailbox->search_deinit(ctx, NULL);
 }
 
 static int cmd_retr(struct client *client, const char *args)
@@ -333,33 +339,37 @@ static int cmd_top(struct client *client, const char *args)
 
 static void list_uids(struct client *client, unsigned int message)
 {
-       struct mail_fetch_context *ctx;
+       struct mail_search_arg search_arg;
+       struct mail_search_context *ctx;
        struct mail *mail;
-       const char *messageset;
        int found = FALSE;
 
        if (client->messages_count == 0 && message == 0)
                return;
 
-       messageset = message == 0 ?
-               t_strdup_printf("1:%u", client->messages_count) :
-               t_strdup_printf("%u", message);
+       memset(&search_arg, 0, sizeof(search_arg));
+       if (message == 0)
+               search_arg.type = SEARCH_ALL;
+       else {
+               search_arg.type = SEARCH_SET;
+               search_arg.value.str = dec2str(message);
+       }
 
-       ctx = client->mailbox->fetch_init(client->mailbox, 0, NULL,
-                                         messageset, FALSE);
+       ctx = client->mailbox->search_init(client->mailbox, NULL,
+                                          &search_arg, NULL, 0, NULL);
        if (ctx == NULL) {
                client_send_storage_error(client);
                return;
        }
 
-       while ((mail = client->mailbox->fetch_next(ctx)) != NULL) {
+       while ((mail = client->mailbox->search_next(ctx)) != NULL) {
                client_send_line(client, message == 0 ?
                                 "%u %u.%u" : "+OK %u %u.%u",
                                 mail->seq, client->uidvalidity, mail->uid);
                found = TRUE;
        }
 
-       (void)client->mailbox->fetch_deinit(ctx, NULL);
+       (void)client->mailbox->search_deinit(ctx, NULL);
 
        if (!found && message != 0)
                client_send_line(client, "-ERR Message not found.");