]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Added mail_transaction_log_view_set_all()
authorTimo Sirainen <tss@iki.fi>
Tue, 22 May 2012 13:54:55 +0000 (16:54 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 22 May 2012 13:54:55 +0000 (16:54 +0300)
src/lib-index/mail-transaction-log-view.c
src/lib-index/mail-transaction-log.h

index 77bbdb46af8733c8cb3d06a3b0007f8b5cfb68fe..9c24dc7bb38c032b393102c0d1c3283a1b09e8d4 100644 (file)
@@ -280,6 +280,48 @@ int mail_transaction_log_view_set(struct mail_transaction_log_view *view,
        return 1;
 }
 
+int mail_transaction_log_view_set_all(struct mail_transaction_log_view *view)
+{
+       struct mail_transaction_log_file *file, *first = view->log->files;
+
+       /* make sure .log.2 file is opened */
+       (void)mail_transaction_log_find_file(view->log, 1, FALSE, &file);
+
+       for (file = view->log->files; file != NULL; file = file->next) {
+               if (mail_transaction_log_file_map(file, file->hdr.hdr_size,
+                                                 (uoff_t)-1) < 0)
+                       return -1;
+               if (file->hdr.prev_file_seq == 0) {
+                       /* this file resets the index. skip the old ones. */
+                       first = file;
+               }
+       }
+
+       mail_transaction_log_view_unref_all(view);
+       for (file = first; file != NULL; file = file->next) {
+               array_append(&view->file_refs, &file, 1);
+               file->refcount++;
+       }
+
+       view->tail = first;
+       view->cur = view->tail;
+       view->cur_offset = view->tail->hdr.hdr_size;
+
+       view->prev_file_seq = view->cur->hdr.file_seq;
+       view->prev_file_offset = view->cur_offset;
+
+       view->min_file_seq = view->cur->hdr.file_seq;
+       view->min_file_offset = view->cur_offset;
+       view->max_file_seq = view->head->hdr.file_seq;
+       view->max_file_offset = view->head->sync_offset;
+       view->broken = FALSE;
+
+       if (mail_transaction_log_file_get_highest_modseq_at(view->cur,
+                               view->cur_offset, &view->prev_modseq) < 0)
+               return -1;
+       return 0;
+}
+
 void mail_transaction_log_view_clear(struct mail_transaction_log_view *view,
                                     uint32_t oldest_file_seq)
 {
index d98b22a2c2d37ca0ca8c2b804a80ea8b7186c244..7fc1ac1a4605f6e126a57904f9937e0b2b9aab86 100644 (file)
@@ -217,6 +217,9 @@ int mail_transaction_log_view_set(struct mail_transaction_log_view *view,
                                  uint32_t min_file_seq, uoff_t min_file_offset,
                                  uint32_t max_file_seq, uoff_t max_file_offset,
                                  bool *reset_r);
+/* Scan through all of the log files that we can find.
+   Returns -1 if error, 0 if ok. */
+int mail_transaction_log_view_set_all(struct mail_transaction_log_view *view);
 /* Clear the view. Keep oldest_file_seq and newer log files referenced so we
    don't get desynced. */
 void mail_transaction_log_view_clear(struct mail_transaction_log_view *view,