diff options
Diffstat (limited to 'src/indexer/indexer-queue.h')
-rw-r--r-- | src/indexer/indexer-queue.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/indexer/indexer-queue.h b/src/indexer/indexer-queue.h new file mode 100644 index 0000000..a9d5b9d --- /dev/null +++ b/src/indexer/indexer-queue.h @@ -0,0 +1,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 |