1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#ifndef INDEXER_QUEUE_H
#define INDEXER_QUEUE_H
#include "indexer.h"
typedef void indexer_queue_callback_t(int status, void *context);
struct indexer_request {
struct indexer_request *prev, *next;
char *username;
char *mailbox;
char *session_id;
unsigned int max_recent_msgs;
/* index messages in this mailbox */
bool index:1;
/* optimize this mailbox */
bool optimize:1;
/* currently indexing this mailbox */
bool working:1;
/* after indexing is finished, add this request back to the queue and
reindex it (i.e. a new indexing request came while we were
working.) */
bool reindex_head:1;
bool reindex_tail:1;
/* when working finished, call this number of contexts and leave the
rest to the reindexing. */
unsigned int working_context_idx;
ARRAY(void *) contexts;
};
struct indexer_queue *indexer_queue_init(indexer_queue_callback_t *callback);
void indexer_queue_deinit(struct indexer_queue **queue);
/* The callback is called whenever a new request is added to the queue. */
void indexer_queue_set_listen_callback(struct indexer_queue *queue,
void (*callback)(struct indexer_queue *));
void indexer_queue_append(struct indexer_queue *queue, bool append,
const char *username, const char *mailbox,
const char *session_id, unsigned int max_recent_msgs,
void *context);
void indexer_queue_append_optimize(struct indexer_queue *queue,
const char *username, const char *mailbox,
void *context);
void indexer_queue_cancel_all(struct indexer_queue *queue);
bool indexer_queue_is_empty(struct indexer_queue *queue);
unsigned int indexer_queue_count(struct indexer_queue *queue);
/* Return the next request from the queue, without removing it. */
struct indexer_request *indexer_queue_request_peek(struct indexer_queue *queue);
/* Remove the next request from the queue. You must call
indexer_queue_request_finish() to free its memory. */
void indexer_queue_request_remove(struct indexer_queue *queue);
/* Give a status update about how far the indexing is going on. */
void indexer_queue_request_status(struct indexer_queue *queue,
struct indexer_request *request,
int percentage);
/* Move the next request to the end of the queue. */
void indexer_queue_move_head_to_tail(struct indexer_queue *queue);
/* Start working on a request */
void indexer_queue_request_work(struct indexer_request *request);
/* Finish the request and free its memory. */
void indexer_queue_request_finish(struct indexer_queue *queue,
struct indexer_request **request,
bool success);
#endif
|