Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/fts-squat/squat-uidlist.c @ 9575:0a00dcc4f0ea HEAD
lib-storage: Allow shared namespace prefix to use %variable modifiers.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 26 May 2010 17:07:51 +0100 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
8850
diff
changeset
|
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */ |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
5 #include "bsearch-insert-pos.h" |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
6 #include "file-cache.h" |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
7 #include "file-lock.h" |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
8 #include "read-full.h" |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
9 #include "write-full.h" |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "ostream.h" |
7373
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
11 #include "mmap-util.h" |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
12 #include "squat-trie-private.h" |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "squat-uidlist.h" |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include <stdio.h> |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include <sys/stat.h> |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
18 #define UIDLIST_LIST_SIZE 31 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
19 #define UIDLIST_BLOCK_LIST_COUNT 100 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
20 #define UID_LIST_MASK_RANGE 0x80000000 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
22 /* set = points to uidlist index number, unset = points to uidlist offset */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
23 #define UID_LIST_POINTER_MASK_LIST_IDX 0x80000000 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
25 #define UIDLIST_PACKED_FLAG_BITMASK 1 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
26 #define UIDLIST_PACKED_FLAG_BEGINS_WITH_POINTER 2 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
28 struct uidlist_list { |
7370
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
29 unsigned int uid_count:31; |
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
30 unsigned int uid_begins_with_pointer:1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
31 uint32_t uid_list[UIDLIST_LIST_SIZE]; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 }; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct squat_uidlist { |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 struct squat_trie *trie; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
36 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
37 char *path; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
38 int fd; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
39 struct file_cache *file_cache; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
40 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
41 struct file_lock *file_lock; |
7371 | 42 struct dotlock *dotlock; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
43 uoff_t locked_file_size; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
44 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
45 void *mmap_base; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
46 size_t mmap_size; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
47 struct squat_uidlist_file_header hdr; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
48 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
49 const void *data; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
50 size_t data_size; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
51 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
52 unsigned int cur_block_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
53 const uint32_t *cur_block_offsets; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
54 const uint32_t *cur_block_end_indexes; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
55 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
56 size_t max_size; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
57 unsigned int corrupted:1; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
58 unsigned int building:1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
59 }; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
60 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
61 struct squat_uidlist_build_context { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
62 struct squat_uidlist *uidlist; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
63 struct ostream *output; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
64 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
65 ARRAY_TYPE(uint32_t) block_offsets; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
66 ARRAY_TYPE(uint32_t) block_end_indexes; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
67 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
68 ARRAY_DEFINE(lists, struct uidlist_list); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
69 uint32_t list_start_idx; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
70 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
71 struct squat_uidlist_file_header build_hdr; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
72 unsigned int need_reopen:1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
73 }; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
74 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
75 struct squat_uidlist_rebuild_context { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
76 struct squat_uidlist *uidlist; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
77 struct squat_uidlist_build_context *build_ctx; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
78 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 int fd; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 struct ostream *output; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
82 ARRAY_TYPE(uint32_t) new_block_offsets, new_block_end_indexes; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
83 uoff_t cur_block_start_offset; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
85 uint32_t list_sizes[UIDLIST_BLOCK_LIST_COUNT]; |
7210
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
86 uint32_t next_uid_list_idx; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
87 unsigned int list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
88 unsigned int new_count; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 }; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
91 static void squat_uidlist_close(struct squat_uidlist *uidlist); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
92 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
93 void squat_uidlist_delete(struct squat_uidlist *uidlist) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
94 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
95 if (unlink(uidlist->path) < 0 && errno != ENOENT) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
96 i_error("unlink(%s) failed: %m", uidlist->path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
97 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
99 static void squat_uidlist_set_corrupted(struct squat_uidlist *uidlist, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
100 const char *reason) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
101 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
102 if (uidlist->corrupted) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
103 return; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
104 uidlist->corrupted = TRUE; |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
105 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
106 i_error("Corrupted squat uidlist file %s: %s", uidlist->path, reason); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
107 squat_trie_delete(uidlist->trie); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
110 static int |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
111 uidlist_write_array(struct ostream *output, const uint32_t *uid_list, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
112 unsigned int uid_count, uint32_t packed_flags, |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
113 uint32_t offset, bool write_size, uint32_t *size_r) |
4879 | 114 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
115 uint8_t *uidbuf, *bufp, sizebuf[SQUAT_PACK_MAX_SIZE], *sizebufp; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
116 uint8_t listbuf[SQUAT_PACK_MAX_SIZE], *listbufp = listbuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
117 uint32_t uid, uid2, prev, base_uid, size_value; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
118 unsigned int i, bitmask_len, uid_list_len; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
119 unsigned int idx, max_idx, mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
120 bool datastack; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
121 int num; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
122 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
123 if ((packed_flags & UIDLIST_PACKED_FLAG_BEGINS_WITH_POINTER) != 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
124 squat_pack_num(&listbufp, offset); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
125 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
126 /* @UNSAFE */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
127 base_uid = uid_list[0] & ~UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
128 datastack = uid_count < 1024*8/SQUAT_PACK_MAX_SIZE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
129 if (datastack) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
130 uidbuf = t_malloc(SQUAT_PACK_MAX_SIZE * uid_count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
131 else |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
132 uidbuf = i_malloc(SQUAT_PACK_MAX_SIZE * uid_count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
133 bufp = uidbuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
134 squat_pack_num(&bufp, base_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
135 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
136 bitmask_len = (uid_list[uid_count-1] - base_uid + 7) / 8 + |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
137 (bufp - uidbuf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
138 if (bitmask_len < uid_count) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
139 bitmask_build: |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
140 i_assert(bitmask_len < SQUAT_PACK_MAX_SIZE*uid_count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
141 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
142 memset(bufp, 0, bitmask_len - (bufp - uidbuf)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
143 if ((uid_list[0] & UID_LIST_MASK_RANGE) == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
144 i = 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
145 uid = i == uid_count ? 0 : uid_list[i]; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
146 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
147 i = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
148 uid = uid_list[0] + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
149 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
150 base_uid++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
151 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
152 for (; i < uid_count; i++) { |
7218 | 153 i_assert((uid & ~UID_LIST_MASK_RANGE) >= base_uid); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
154 if ((uid & UID_LIST_MASK_RANGE) == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
155 uid -= base_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
156 uid2 = uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
157 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
158 uid &= ~UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
159 uid -= base_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
160 uid2 = uid_list[i+1] - base_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
161 i++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
162 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
163 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
164 if (uid2 - uid < 3*8) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
165 for (; uid <= uid2; uid++) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
166 bufp[uid / 8] |= 1 << (uid % 8); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
167 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
168 /* first byte */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
169 idx = uid / 8; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
170 num = uid % 8; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
171 if (num != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
172 uid += 8 - num; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
173 for (mask = 0; num < 8; num++) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
174 mask |= 1 << num; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
175 bufp[idx++] |= mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
176 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
177 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
178 /* middle bytes */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
179 num = uid2 % 8; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
180 max_idx = idx + (uid2 - num - uid)/8; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
181 for (; idx < max_idx; idx++, uid += 8) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
182 bufp[idx] = 0xff; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
183 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
184 /* last byte */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
185 for (mask = 0; num >= 0; num--) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
186 mask |= 1 << num; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
187 bufp[idx] |= mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
188 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
189 uid = i+1 == uid_count ? 0 : uid_list[i+1]; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
190 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
191 uid_list_len = bitmask_len; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
192 packed_flags |= UIDLIST_PACKED_FLAG_BITMASK; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
193 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
194 bufp = uidbuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
195 prev = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
196 for (i = 0; i < uid_count; i++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
197 uid = uid_list[i]; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
198 if (unlikely((uid & ~UID_LIST_MASK_RANGE) < prev)) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
199 return -1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
200 if ((uid & UID_LIST_MASK_RANGE) == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
201 squat_pack_num(&bufp, (uid - prev) << 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
202 prev = uid + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
203 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
204 uid &= ~UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
205 squat_pack_num(&bufp, 1 | (uid - prev) << 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
206 squat_pack_num(&bufp, uid_list[i+1] - uid - 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
207 prev = uid_list[i+1] + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
208 i++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
209 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
210 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
211 uid_list_len = bufp - uidbuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
212 if (uid_list_len > bitmask_len) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
213 bufp = uidbuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
214 squat_pack_num(&bufp, base_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
215 goto bitmask_build; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
216 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
217 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
218 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
219 size_value = ((uid_list_len + |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
220 (listbufp - listbuf)) << 2) | packed_flags; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
221 if (write_size) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
222 sizebufp = sizebuf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
223 squat_pack_num(&sizebufp, size_value); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
224 o_stream_send(output, sizebuf, sizebufp - sizebuf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
225 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
226 o_stream_send(output, listbuf, listbufp - listbuf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
227 o_stream_send(output, uidbuf, uid_list_len); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
228 if (!datastack) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
229 i_free(uidbuf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
230 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
231 *size_r = size_value; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
232 return 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
233 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
234 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
235 static int |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
236 uidlist_write(struct ostream *output, const struct uidlist_list *list, |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
237 bool write_size, uint32_t *size_r) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
238 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
239 const uint32_t *uid_list = list->uid_list; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
240 uint8_t buf[SQUAT_PACK_MAX_SIZE], *bufp; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
241 uint32_t uid_count = list->uid_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
242 uint32_t packed_flags = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
243 uint32_t offset = 0; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
244 int ret; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
245 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
246 if (list->uid_begins_with_pointer) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
247 /* continued UID list */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
248 packed_flags |= UIDLIST_PACKED_FLAG_BEGINS_WITH_POINTER; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
249 if ((uid_list[0] & UID_LIST_POINTER_MASK_LIST_IDX) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
250 offset = ((uid_list[0] & ~UID_LIST_POINTER_MASK_LIST_IDX) << 1) | 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
251 if (list->uid_count == 1) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
252 bufp = buf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
253 squat_pack_num(&bufp, offset); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
254 o_stream_send(output, buf, bufp - buf); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
255 *size_r = (bufp - buf) << 2 | packed_flags; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
256 return 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
257 } |
7369
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
258 } else if (unlikely(output->offset <= uid_list[0])) { |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
259 i_assert(output->closed); |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
260 return -1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
261 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
262 i_assert(list->uid_count > 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
263 offset = (output->offset - uid_list[0]) << 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
264 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
265 uid_list++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
266 uid_count--; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
267 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
268 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7220
diff
changeset
|
269 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
270 ret = uidlist_write_array(output, uid_list, uid_count, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
271 packed_flags, offset, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
272 write_size, size_r); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7220
diff
changeset
|
273 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
274 return ret; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
275 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
276 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
277 static void squat_uidlist_map_blocks_set_pointers(struct squat_uidlist *uidlist) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
278 { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
279 const void *base; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
280 size_t end_index_size, end_size; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
281 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
282 base = CONST_PTR_OFFSET(uidlist->data, uidlist->hdr.block_list_offset + |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
283 sizeof(uint32_t)); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
284 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
285 end_index_size = uidlist->cur_block_count * sizeof(uint32_t); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
286 end_size = end_index_size + uidlist->cur_block_count * sizeof(uint32_t); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
287 if (end_size <= uidlist->data_size) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
288 uidlist->cur_block_end_indexes = base; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
289 uidlist->cur_block_offsets = |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
290 CONST_PTR_OFFSET(base, end_index_size); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
291 } else { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
292 uidlist->cur_block_end_indexes = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
293 uidlist->cur_block_offsets = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
294 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
295 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
296 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
297 static int uidlist_file_cache_read(struct squat_uidlist *uidlist, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
298 size_t offset, size_t size) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
299 { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
300 if (uidlist->file_cache == NULL) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
301 return 0; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
302 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
303 if (file_cache_read(uidlist->file_cache, offset, size) < 0) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
304 i_error("read(%s) failed: %m", uidlist->path); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
305 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
306 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
307 uidlist->data = file_cache_get_map(uidlist->file_cache, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
308 &uidlist->data_size); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
309 squat_uidlist_map_blocks_set_pointers(uidlist); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
310 return 0; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
311 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
312 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
313 static int squat_uidlist_map_blocks(struct squat_uidlist *uidlist) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
314 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
315 const struct squat_uidlist_file_header *hdr = &uidlist->hdr; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
316 const void *base; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
317 uint32_t block_count, blocks_offset, blocks_size, i, verify_count; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
318 |
7218 | 319 if (hdr->block_list_offset == 0) { |
320 /* empty file */ | |
321 uidlist->cur_block_count = 0; | |
322 return 1; | |
323 } | |
324 | |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
325 /* get number of blocks */ |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
326 if (uidlist_file_cache_read(uidlist, hdr->block_list_offset, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
327 sizeof(block_count)) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
328 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
329 blocks_offset = hdr->block_list_offset + sizeof(block_count); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
330 if (blocks_offset > uidlist->data_size) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
331 squat_uidlist_set_corrupted(uidlist, "block list outside file"); |
7218 | 332 return 0; |
5414 | 333 } |
334 | |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
335 base = CONST_PTR_OFFSET(uidlist->data, hdr->block_list_offset); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
336 memcpy(&block_count, base, sizeof(block_count)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
337 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
338 /* map the blocks */ |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
339 blocks_size = block_count * sizeof(uint32_t)*2; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
340 if (uidlist_file_cache_read(uidlist, blocks_offset, blocks_size) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
341 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
342 if (blocks_offset + blocks_size > uidlist->data_size) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
343 squat_uidlist_set_corrupted(uidlist, "block list outside file"); |
7218 | 344 return 0; |
4879 | 345 } |
346 | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
347 uidlist->cur_block_count = block_count; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
348 squat_uidlist_map_blocks_set_pointers(uidlist); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
349 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
350 /* verify just a couple of the end indexes to make sure they |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
351 look correct */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
352 verify_count = I_MIN(block_count, 8); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
353 for (i = 1; i < verify_count; i++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
354 if (unlikely(uidlist->cur_block_end_indexes[i-1] >= |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
355 uidlist->cur_block_end_indexes[i])) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
356 squat_uidlist_set_corrupted(uidlist, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
357 "block list corrupted"); |
7218 | 358 return 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
359 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
360 } |
7218 | 361 return 1; |
4879 | 362 } |
363 | |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
364 static int squat_uidlist_map_header(struct squat_uidlist *uidlist) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
365 { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
366 if (uidlist->hdr.indexid == 0) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
367 /* still being built */ |
7218 | 368 return 1; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
369 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
370 if (uidlist->hdr.indexid != uidlist->trie->hdr.indexid) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
371 /* see if trie was recreated */ |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
372 squat_trie_refresh(uidlist->trie); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
373 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
374 if (uidlist->hdr.indexid != uidlist->trie->hdr.indexid) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
375 squat_uidlist_set_corrupted(uidlist, "wrong indexid"); |
7218 | 376 return 0; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
377 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
378 if (uidlist->hdr.used_file_size < sizeof(uidlist->hdr) || |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
379 (uidlist->hdr.used_file_size > uidlist->mmap_size && |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
380 uidlist->mmap_base != NULL)) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
381 squat_uidlist_set_corrupted(uidlist, "broken used_file_size"); |
7218 | 382 return 0; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
383 } |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
384 return squat_uidlist_map_blocks(uidlist); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
385 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
386 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
387 static void squat_uidlist_unmap(struct squat_uidlist *uidlist) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
388 { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
389 if (uidlist->mmap_size != 0) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
390 if (munmap(uidlist->mmap_base, uidlist->mmap_size) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
391 i_error("munmap(%s) failed: %m", uidlist->path); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
392 uidlist->mmap_base = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
393 uidlist->mmap_size = 0; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
394 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
395 uidlist->cur_block_count = 0; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
396 uidlist->cur_block_end_indexes = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
397 uidlist->cur_block_offsets = NULL; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
398 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
399 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
400 static int squat_uidlist_mmap(struct squat_uidlist *uidlist) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 { |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 struct stat st; |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
403 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
404 if (fstat(uidlist->fd, &st) < 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
405 i_error("fstat(%s) failed: %m", uidlist->path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
406 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
408 if (st.st_size < (off_t)sizeof(uidlist->hdr)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
409 squat_uidlist_set_corrupted(uidlist, "File too small"); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
410 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 } |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
412 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
413 squat_uidlist_unmap(uidlist); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
414 uidlist->mmap_size = st.st_size; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
415 uidlist->mmap_base = mmap(NULL, uidlist->mmap_size, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
416 PROT_READ | PROT_WRITE, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
417 MAP_SHARED, uidlist->fd, 0); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
418 if (uidlist->mmap_base == MAP_FAILED) { |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
419 uidlist->data = uidlist->mmap_base = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
420 uidlist->data_size = uidlist->mmap_size = 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
421 i_error("mmap(%s) failed: %m", uidlist->path); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 return -1; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 } |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
424 uidlist->data = uidlist->mmap_base; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
425 uidlist->data_size = uidlist->mmap_size; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
426 return 0; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
427 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
429 static int squat_uidlist_map(struct squat_uidlist *uidlist) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
430 { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
431 const struct squat_uidlist_file_header *mmap_hdr = uidlist->mmap_base; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
432 int ret; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
433 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
434 if (mmap_hdr != NULL && !uidlist->building && |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
435 uidlist->hdr.block_list_offset == mmap_hdr->block_list_offset) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
436 /* file hasn't changed */ |
7218 | 437 return 1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
438 } |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
439 |
7371 | 440 if ((uidlist->trie->flags & SQUAT_INDEX_FLAG_MMAP_DISABLE) == 0) { |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
441 if (mmap_hdr == NULL || uidlist->building || |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
442 uidlist->mmap_size < mmap_hdr->used_file_size) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
443 if (squat_uidlist_mmap(uidlist) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
444 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
445 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
446 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
447 if (!uidlist->building) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
448 memcpy(&uidlist->hdr, uidlist->mmap_base, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
449 sizeof(uidlist->hdr)); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
450 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
451 } else if (uidlist->building) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
452 /* we want to update blocks mapping, but using the header |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
453 in memory */ |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
454 } else { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
455 ret = pread_full(uidlist->fd, &uidlist->hdr, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
456 sizeof(uidlist->hdr), 0); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
457 if (ret <= 0) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
458 if (ret < 0) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
459 i_error("pread(%s) failed: %m", uidlist->path); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
460 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
461 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
462 i_error("Corrupted %s: File too small", uidlist->path); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
463 return 0; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
464 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
465 uidlist->data = NULL; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
466 uidlist->data_size = 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
467 } |
7371 | 468 if (uidlist->file_cache == NULL && |
469 (uidlist->trie->flags & SQUAT_INDEX_FLAG_MMAP_DISABLE) != 0) | |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
470 uidlist->file_cache = file_cache_new(uidlist->fd); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
471 return squat_uidlist_map_header(uidlist); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 |
7373
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
474 static int squat_uidlist_read_to_memory(struct squat_uidlist *uidlist) |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
475 { |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
476 size_t i, page_size = mmap_get_page_size(); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
477 char x; |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
478 |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
479 if (uidlist->file_cache != NULL) { |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
480 return uidlist_file_cache_read(uidlist, 0, |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
481 uidlist->hdr.used_file_size); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
482 } |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
483 /* Tell the kernel we're going to use the uidlist data, so it loads |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
484 it into memory and keeps it there. */ |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
485 (void)madvise(uidlist->mmap_base, uidlist->mmap_size, MADV_WILLNEED); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
486 /* It also speeds up a bit for us to sequentially load everything |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
487 into memory, although at least Linux catches up quite fast even |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
488 without this code. Compiler can quite easily optimize away this |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
489 entire for loop, but volatile seems to help with gcc 4.2. */ |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
490 for (i = 0; i < uidlist->mmap_size; i += page_size) |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
491 x = ((const volatile char *)uidlist->data)[i]; |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
492 return 0; |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
493 } |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
494 |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
495 static void squat_uidlist_free_from_memory(struct squat_uidlist *uidlist) |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
496 { |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
497 size_t page_size = mmap_get_page_size(); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
498 |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
499 if (uidlist->file_cache != NULL) { |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
500 file_cache_invalidate(uidlist->file_cache, |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
501 page_size, (uoff_t)-1); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
502 } else { |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
503 (void)madvise(uidlist->mmap_base, uidlist->mmap_size, |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
504 MADV_DONTNEED); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
505 } |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
506 } |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
507 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
508 struct squat_uidlist *squat_uidlist_init(struct squat_trie *trie) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 { |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
510 struct squat_uidlist *uidlist; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 uidlist = i_new(struct squat_uidlist, 1); |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 uidlist->trie = trie; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
514 uidlist->path = i_strconcat(trie->path, ".uids", NULL); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 uidlist->fd = -1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
516 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 return uidlist; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 void squat_uidlist_deinit(struct squat_uidlist *uidlist) |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 { |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 squat_uidlist_close(uidlist); |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
524 i_free(uidlist->path); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 i_free(uidlist); |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
528 static int squat_uidlist_open(struct squat_uidlist *uidlist) |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
529 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
530 squat_uidlist_close(uidlist); |
4878
88a91d9a867b
Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents:
4855
diff
changeset
|
531 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
532 uidlist->fd = open(uidlist->path, O_RDWR); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
533 if (uidlist->fd == -1) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
534 if (errno == ENOENT) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
535 memset(&uidlist->hdr, 0, sizeof(uidlist->hdr)); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 return 0; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
538 i_error("open(%s) failed: %m", uidlist->path); |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
539 return -1; |
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
540 } |
7218 | 541 return squat_uidlist_map(uidlist) <= 0 ? -1 : 0; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
542 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
543 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
544 static void squat_uidlist_close(struct squat_uidlist *uidlist) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
545 { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
546 i_assert(!uidlist->building); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
547 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
548 squat_uidlist_unmap(uidlist); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
549 if (uidlist->file_cache != NULL) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
550 file_cache_free(&uidlist->file_cache); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
551 if (uidlist->file_lock != NULL) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
552 file_lock_free(&uidlist->file_lock); |
7371 | 553 if (uidlist->dotlock != NULL) |
554 file_dotlock_delete(&uidlist->dotlock); | |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
555 if (uidlist->fd != -1) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
556 if (close(uidlist->fd) < 0) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
557 i_error("close(%s) failed: %m", uidlist->path); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
558 uidlist->fd = -1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
559 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
560 uidlist->corrupted = FALSE; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
561 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
562 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
563 int squat_uidlist_refresh(struct squat_uidlist *uidlist) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
564 { |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
565 /* we assume here that trie is locked, so that we don't need to worry |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
566 about it when reading the header */ |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
567 if (uidlist->fd == -1 || |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
568 uidlist->hdr.indexid != uidlist->trie->hdr.indexid) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
569 if (squat_uidlist_open(uidlist) < 0) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
570 return -1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
571 } else { |
7218 | 572 if (squat_uidlist_map(uidlist) <= 0) |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
573 return -1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
574 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
575 return 0; |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
576 } |
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
577 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
578 static int squat_uidlist_is_file_stale(struct squat_uidlist *uidlist) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
580 struct stat st, st2; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
582 i_assert(uidlist->fd != -1); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
583 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
584 if (stat(uidlist->path, &st) < 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
585 if (errno == ENOENT) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
586 return 1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
588 i_error("stat(%s) failed: %m", uidlist->path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
589 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
590 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
591 if (fstat(uidlist->fd, &st2) < 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
592 i_error("fstat(%s) failed: %m", uidlist->path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
593 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
594 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
595 uidlist->locked_file_size = st2.st_size; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
597 return st.st_ino == st2.st_ino && |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
598 CMP_DEV_T(st.st_dev, st2.st_dev) ? 0 : 1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
600 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
601 static int squat_uidlist_lock(struct squat_uidlist *uidlist) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
602 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
603 int ret; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
604 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
605 for (;;) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
606 i_assert(uidlist->fd != -1); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
607 i_assert(uidlist->file_lock == NULL); |
7371 | 608 i_assert(uidlist->dotlock == NULL); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 |
7371 | 610 if (uidlist->trie->lock_method != FILE_LOCK_METHOD_DOTLOCK) { |
611 ret = file_wait_lock(uidlist->fd, uidlist->path, | |
612 F_WRLCK, | |
613 uidlist->trie->lock_method, | |
614 SQUAT_TRIE_LOCK_TIMEOUT, | |
615 &uidlist->file_lock); | |
616 } else { | |
617 ret = file_dotlock_create(&uidlist->trie->dotlock_set, | |
618 uidlist->path, 0, | |
619 &uidlist->dotlock); | |
620 } | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
621 if (ret == 0) { |
7371 | 622 i_error("squat uidlist %s: Locking timed out", |
623 uidlist->path); | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
624 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
625 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
626 if (ret < 0) |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
627 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
629 ret = squat_uidlist_is_file_stale(uidlist); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
630 if (ret == 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
631 break; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 |
7371 | 633 if (uidlist->file_lock != NULL) |
634 file_unlock(&uidlist->file_lock); | |
635 else | |
636 file_dotlock_delete(&uidlist->dotlock); | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
637 if (ret < 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
638 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
639 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
640 squat_uidlist_close(uidlist); |
8205
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
641 uidlist->fd = squat_trie_create_fd(uidlist->trie, |
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
642 uidlist->path, 0); |
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
643 if (uidlist->fd == -1) |
4883
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
644 return -1; |
d8adbe93c969
Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents:
4879
diff
changeset
|
645 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
646 return 1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
649 static int squat_uidlist_open_or_create(struct squat_uidlist *uidlist) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 { |
7218 | 651 int ret; |
652 | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
653 if (uidlist->fd == -1) { |
8205
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
654 uidlist->fd = squat_trie_create_fd(uidlist->trie, |
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
655 uidlist->path, 0); |
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
656 if (uidlist->fd == -1) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
657 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
659 if (squat_uidlist_lock(uidlist) <= 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
660 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
662 if (uidlist->locked_file_size != 0) { |
7218 | 663 if ((ret = squat_uidlist_map(uidlist)) < 0) |
664 return -1; | |
665 if (ret == 0) { | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
666 /* broken file, truncate */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
667 if (ftruncate(uidlist->fd, 0) < 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
668 i_error("ftruncate(%s) failed: %m", |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
669 uidlist->path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
670 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
671 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
672 uidlist->locked_file_size = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
673 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
674 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
675 if (uidlist->locked_file_size == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
676 /* write using 0 until we're finished */ |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
677 memset(&uidlist->hdr, 0, sizeof(uidlist->hdr)); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
678 if (write_full(uidlist->fd, &uidlist->hdr, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
679 sizeof(uidlist->hdr)) < 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
680 i_error("write(%s) failed: %m", uidlist->path); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 return -1; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
682 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
683 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 return 0; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
686 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
687 int squat_uidlist_build_init(struct squat_uidlist *uidlist, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
688 struct squat_uidlist_build_context **ctx_r) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
689 { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
690 struct squat_uidlist_build_context *ctx; |
7371 | 691 int ret; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
692 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
693 i_assert(!uidlist->building); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
694 |
7371 | 695 ret = squat_uidlist_open_or_create(uidlist); |
696 if (ret == 0 && | |
697 lseek(uidlist->fd, uidlist->hdr.used_file_size, SEEK_SET) < 0) { | |
698 i_error("lseek(%s) failed: %m", uidlist->path); | |
699 ret = -1; | |
700 } | |
701 | |
702 if (ret < 0) { | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
703 if (uidlist->file_lock != NULL) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
704 file_unlock(&uidlist->file_lock); |
7371 | 705 if (uidlist->dotlock != NULL) |
706 file_dotlock_delete(&uidlist->dotlock); | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
707 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
708 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
709 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
710 ctx = i_new(struct squat_uidlist_build_context, 1); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
711 ctx->uidlist = uidlist; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
712 ctx->output = o_stream_create_fd(uidlist->fd, 0, FALSE); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
713 if (ctx->output->offset == 0) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
714 struct squat_uidlist_file_header hdr; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
715 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
716 memset(&hdr, 0, sizeof(hdr)); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
717 o_stream_send(ctx->output, &hdr, sizeof(hdr)); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
718 } |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
719 o_stream_cork(ctx->output); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
720 i_array_init(&ctx->lists, 10240); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
721 i_array_init(&ctx->block_offsets, 128); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
722 i_array_init(&ctx->block_end_indexes, 128); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
723 ctx->list_start_idx = uidlist->hdr.count; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
724 ctx->build_hdr = uidlist->hdr; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
725 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
726 uidlist->building = TRUE; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
727 *ctx_r = ctx; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
728 return 0; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
729 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
730 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
731 static void |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
732 uidlist_write_block_list_and_header(struct squat_uidlist_build_context *ctx, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
733 struct ostream *output, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
734 ARRAY_TYPE(uint32_t) *block_offsets, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
735 ARRAY_TYPE(uint32_t) *block_end_indexes, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
736 bool write_old_blocks) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
737 { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
738 struct squat_uidlist *uidlist = ctx->uidlist; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
739 unsigned int align, old_block_count, new_block_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
740 uint32_t block_offset_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
741 uoff_t block_list_offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
742 |
7218 | 743 i_assert(uidlist->trie->hdr.indexid != 0); |
744 ctx->build_hdr.indexid = uidlist->trie->hdr.indexid; | |
745 | |
746 if (array_count(block_end_indexes) == 0) { | |
747 ctx->build_hdr.used_file_size = output->offset; | |
7220 | 748 ctx->build_hdr.block_list_offset = 0; |
7218 | 749 uidlist->hdr = ctx->build_hdr; |
750 return; | |
751 } | |
752 | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
753 align = output->offset % sizeof(uint32_t); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
754 if (align != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
755 static char null[sizeof(uint32_t)-1] = { 0, }; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
756 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
757 o_stream_send(output, null, sizeof(uint32_t) - align); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
758 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
759 block_list_offset = output->offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
760 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
761 new_block_count = array_count(block_offsets); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
762 old_block_count = write_old_blocks ? uidlist->cur_block_count : 0; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
764 block_offset_count = new_block_count + old_block_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
765 o_stream_send(output, &block_offset_count, sizeof(block_offset_count)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
766 /* write end indexes */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
767 o_stream_send(output, uidlist->cur_block_end_indexes, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
768 old_block_count * sizeof(uint32_t)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
769 o_stream_send(output, array_idx(block_end_indexes, 0), |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
770 new_block_count * sizeof(uint32_t)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
771 /* write offsets */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
772 o_stream_send(output, uidlist->cur_block_offsets, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
773 old_block_count * sizeof(uint32_t)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
774 o_stream_send(output, array_idx(block_offsets, 0), |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
775 new_block_count * sizeof(uint32_t)); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
776 o_stream_flush(output); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
778 /* update header - it's written later when trie is locked */ |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
779 ctx->build_hdr.block_list_offset = block_list_offset; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
780 ctx->build_hdr.used_file_size = output->offset; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
781 uidlist->hdr = ctx->build_hdr; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
782 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
783 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
784 void squat_uidlist_build_flush(struct squat_uidlist_build_context *ctx) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
785 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
786 struct uidlist_list *lists; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
787 uint8_t buf[SQUAT_PACK_MAX_SIZE], *bufp; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
788 unsigned int i, j, count, max; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
789 uint32_t block_offset, block_end_idx, start_offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
790 uint32_t list_sizes[UIDLIST_BLOCK_LIST_COUNT]; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
791 size_t mem_size; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
792 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
793 if (ctx->uidlist->corrupted) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
794 return; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
795 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
796 lists = array_get_modifiable(&ctx->lists, &count); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
797 if (count == 0) |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
798 return; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
799 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
800 /* write the lists and save the written sizes to uid_list[0] */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
801 for (i = 0; i < count; i += UIDLIST_BLOCK_LIST_COUNT) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
802 start_offset = ctx->output->offset; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
803 max = I_MIN(count - i, UIDLIST_BLOCK_LIST_COUNT); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
804 for (j = 0; j < max; j++) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
805 if (uidlist_write(ctx->output, &lists[i+j], |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
806 FALSE, &list_sizes[j]) < 0) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
807 squat_uidlist_set_corrupted(ctx->uidlist, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
808 "Broken uidlists"); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
809 return; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
810 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
811 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
812 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
813 block_offset = ctx->output->offset; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
814 block_end_idx = ctx->list_start_idx + i + max; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
815 array_append(&ctx->block_offsets, &block_offset, 1); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
816 array_append(&ctx->block_end_indexes, &block_end_idx, 1); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
817 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
818 /* write the full size of the uidlists */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
819 bufp = buf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
820 squat_pack_num(&bufp, block_offset - start_offset); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
821 o_stream_send(ctx->output, buf, bufp - buf); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
822 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
823 /* write the sizes/flags */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
824 for (j = 0; j < max; j++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
825 bufp = buf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
826 squat_pack_num(&bufp, list_sizes[j]); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
827 o_stream_send(ctx->output, buf, bufp - buf); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
831 mem_size = ctx->lists.arr.buffer->used + |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
832 ctx->block_offsets.arr.buffer->used + |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
833 ctx->block_end_indexes.arr.buffer->used; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
834 if (ctx->uidlist->max_size < mem_size) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
835 ctx->uidlist->max_size = mem_size; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
836 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
837 ctx->list_start_idx += count; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
838 array_clear(&ctx->lists); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
839 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
840 uidlist_write_block_list_and_header(ctx, ctx->output, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
841 &ctx->block_offsets, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
842 &ctx->block_end_indexes, TRUE); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
843 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
844 (void)squat_uidlist_map(ctx->uidlist); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
845 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
846 array_clear(&ctx->block_offsets); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
847 array_clear(&ctx->block_end_indexes); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
848 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
849 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
850 int squat_uidlist_build_finish(struct squat_uidlist_build_context *ctx) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
851 { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
852 if (ctx->uidlist->corrupted) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
853 return -1; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
854 |
7369
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
855 if (!ctx->output->closed) { |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
856 o_stream_seek(ctx->output, 0); |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
857 o_stream_send(ctx->output, |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
858 &ctx->build_hdr, sizeof(ctx->build_hdr)); |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
859 o_stream_seek(ctx->output, ctx->build_hdr.used_file_size); |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
860 o_stream_flush(ctx->output); |
fc296dfcfd29
If uidlist writing fails, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
861 } |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
862 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
863 if (ctx->output->last_failed_errno != 0) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
864 errno = ctx->output->last_failed_errno; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
865 i_error("write() to %s failed: %m", ctx->uidlist->path); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
866 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
867 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
868 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
869 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
870 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
871 void squat_uidlist_build_deinit(struct squat_uidlist_build_context **_ctx) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
872 { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
873 struct squat_uidlist_build_context *ctx = *_ctx; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
874 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
875 *_ctx = NULL; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
876 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
877 i_assert(array_count(&ctx->lists) == 0 || ctx->uidlist->corrupted); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
878 i_assert(ctx->uidlist->building); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
879 ctx->uidlist->building = FALSE; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
880 |
7371 | 881 if (ctx->uidlist->file_lock != NULL) |
882 file_unlock(&ctx->uidlist->file_lock); | |
883 else | |
884 file_dotlock_delete(&ctx->uidlist->dotlock); | |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
885 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
886 if (ctx->need_reopen) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
887 (void)squat_uidlist_open(ctx->uidlist); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
888 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
889 array_free(&ctx->block_offsets); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
890 array_free(&ctx->block_end_indexes); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
891 array_free(&ctx->lists); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
892 o_stream_unref(&ctx->output); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
893 i_free(ctx); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
894 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
895 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
896 int squat_uidlist_rebuild_init(struct squat_uidlist_build_context *build_ctx, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
897 bool compress, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
898 struct squat_uidlist_rebuild_context **ctx_r) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
899 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
900 struct squat_uidlist_rebuild_context *ctx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
901 struct squat_uidlist_file_header hdr; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
902 const char *temp_path; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
903 int fd; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
904 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
905 if (build_ctx->build_hdr.link_count == 0) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
906 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
907 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
908 if (!compress) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
909 if (build_ctx->build_hdr.link_count < |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
910 build_ctx->build_hdr.count*2/3) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
911 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
912 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
913 |
7373
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
914 /* make sure the entire uidlist is in memory before beginning, |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
915 otherwise the pages are faulted to memory in random order which |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
916 takes forever. */ |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
917 if (squat_uidlist_read_to_memory(build_ctx->uidlist) < 0) |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
918 return -1; |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
919 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
920 temp_path = t_strconcat(build_ctx->uidlist->path, ".tmp", NULL); |
8205
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
921 fd = squat_trie_create_fd(build_ctx->uidlist->trie, temp_path, O_TRUNC); |
b62042ddb79e
Squat: Create files with the correct mode and group.
Timo Sirainen <tss@iki.fi>
parents:
7390
diff
changeset
|
922 if (fd == -1) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
923 return -1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
924 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
925 ctx = i_new(struct squat_uidlist_rebuild_context, 1); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
926 ctx->uidlist = build_ctx->uidlist; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
927 ctx->build_ctx = build_ctx; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
928 ctx->fd = fd; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
929 ctx->output = o_stream_create_fd(ctx->fd, 0, FALSE); |
7210
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
930 ctx->next_uid_list_idx = 0x100; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
931 o_stream_cork(ctx->output); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
932 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
933 memset(&hdr, 0, sizeof(hdr)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
934 o_stream_send(ctx->output, &hdr, sizeof(hdr)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
935 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
936 ctx->cur_block_start_offset = ctx->output->offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
937 i_array_init(&ctx->new_block_offsets, |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
938 build_ctx->build_hdr.count / UIDLIST_BLOCK_LIST_COUNT); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
939 i_array_init(&ctx->new_block_end_indexes, |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
940 build_ctx->build_hdr.count / UIDLIST_BLOCK_LIST_COUNT); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
941 *ctx_r = ctx; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
942 return 1; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
943 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
944 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
945 static void |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
946 uidlist_rebuild_flush_block(struct squat_uidlist_rebuild_context *ctx) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
947 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
948 uint8_t buf[SQUAT_PACK_MAX_SIZE], *bufp; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
949 uint32_t block_offset, block_end_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
950 unsigned int i; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
951 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
952 ctx->new_count += ctx->list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
953 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
954 block_offset = ctx->output->offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
955 block_end_idx = ctx->new_count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
956 array_append(&ctx->new_block_offsets, &block_offset, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
957 array_append(&ctx->new_block_end_indexes, &block_end_idx, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
958 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
959 /* this block's contents started from cur_block_start_offset and |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
960 ended to current offset. write the size of this area. */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
961 bufp = buf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
962 squat_pack_num(&bufp, block_offset - ctx->cur_block_start_offset); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
963 o_stream_send(ctx->output, buf, bufp - buf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
964 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
965 /* write the sizes/flags */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
966 for (i = 0; i < ctx->list_idx; i++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
967 bufp = buf; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
968 squat_pack_num(&bufp, ctx->list_sizes[i]); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
969 o_stream_send(ctx->output, buf, bufp - buf); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
970 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
971 ctx->cur_block_start_offset = ctx->output->offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
972 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
973 |
7210
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
974 uint32_t squat_uidlist_rebuild_next(struct squat_uidlist_rebuild_context *ctx, |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
975 const ARRAY_TYPE(uint32_t) *uids) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
976 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
977 int ret; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
978 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7220
diff
changeset
|
979 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
980 ret = uidlist_write_array(ctx->output, array_idx(uids, 0), |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
981 array_count(uids), 0, 0, FALSE, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
982 &ctx->list_sizes[ctx->list_idx]); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7220
diff
changeset
|
983 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6931
diff
changeset
|
984 if (ret < 0) |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
985 squat_uidlist_set_corrupted(ctx->uidlist, "Broken uidlists"); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
986 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
987 if (++ctx->list_idx == UIDLIST_BLOCK_LIST_COUNT) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
988 uidlist_rebuild_flush_block(ctx); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
989 ctx->list_idx = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
990 } |
7210
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
991 return ctx->next_uid_list_idx++ << 1; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
992 } |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
993 |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
994 uint32_t squat_uidlist_rebuild_nextu(struct squat_uidlist_rebuild_context *ctx, |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
995 const ARRAY_TYPE(seq_range) *uids) |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
996 { |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
997 const struct seq_range *range; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
998 ARRAY_TYPE(uint32_t) tmp_uids; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
999 uint32_t seq, uid1, ret; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1000 unsigned int i, count; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1001 |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1002 range = array_get(uids, &count); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1003 if (count == 0) |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1004 return 0; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1005 |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1006 if (range[count-1].seq2 < 8) { |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1007 /* we can use a singleton bitmask */ |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1008 ret = 0; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1009 for (i = 0; i < count; i++) { |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1010 for (seq = range[i].seq1; seq <= range[i].seq2; seq++) |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1011 ret |= 1 << (seq+1); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1012 } |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1013 return ret; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1014 } |
7220 | 1015 if (count == 1 && range[0].seq1 == range[0].seq2) { |
1016 /* single UID */ | |
1017 return (range[0].seq1 << 1) | 1; | |
1018 } | |
7210
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1019 |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1020 /* convert seq range to our internal representation and use the |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1021 normal _rebuild_next() to write it */ |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1022 i_array_init(&tmp_uids, 128); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1023 for (i = 0; i < count; i++) { |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1024 if (range[i].seq1 == range[i].seq2) |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1025 array_append(&tmp_uids, &range[i].seq1, 1); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1026 else { |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1027 uid1 = range[i].seq1 | UID_LIST_MASK_RANGE; |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1028 array_append(&tmp_uids, &uid1, 1); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1029 array_append(&tmp_uids, &range[i].seq2, 1); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1030 } |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1031 } |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1032 ret = squat_uidlist_rebuild_next(ctx, &tmp_uids); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1033 array_free(&tmp_uids); |
f5f77a3ae203
Initial code to support expunging from squat indexes, probably still buggy.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1034 return ret; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1035 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1036 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1037 int squat_uidlist_rebuild_finish(struct squat_uidlist_rebuild_context *ctx, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1038 bool cancel) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1039 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1040 const char *temp_path; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1041 int ret = 1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1042 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1043 if (ctx->list_idx != 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1044 uidlist_rebuild_flush_block(ctx); |
7218 | 1045 if (cancel || ctx->uidlist->corrupted) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1046 ret = 0; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1047 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1048 temp_path = t_strconcat(ctx->uidlist->path, ".tmp", NULL); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1049 if (ret > 0) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1050 ctx->build_ctx->build_hdr.indexid = |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1051 ctx->uidlist->trie->hdr.indexid; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1052 ctx->build_ctx->build_hdr.count = ctx->new_count; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1053 ctx->build_ctx->build_hdr.link_count = 0; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1054 uidlist_write_block_list_and_header(ctx->build_ctx, ctx->output, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1055 &ctx->new_block_offsets, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1056 &ctx->new_block_end_indexes, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1057 FALSE); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1058 o_stream_seek(ctx->output, 0); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1059 o_stream_send(ctx->output, &ctx->build_ctx->build_hdr, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1060 sizeof(ctx->build_ctx->build_hdr)); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1061 o_stream_seek(ctx->output, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1062 ctx->build_ctx->build_hdr.used_file_size); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1063 o_stream_flush(ctx->output); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1064 |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1065 if (ctx->uidlist->corrupted) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1066 ret = -1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1067 else if (ctx->output->last_failed_errno != 0) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1068 errno = ctx->output->last_failed_errno; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1069 i_error("write() to %s failed: %m", temp_path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1070 ret = -1; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1071 } else if (rename(temp_path, ctx->uidlist->path) < 0) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1072 i_error("rename(%s, %s) failed: %m", |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1073 temp_path, ctx->uidlist->path); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1074 ret = -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1075 } |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1076 ctx->build_ctx->need_reopen = TRUE; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1077 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1078 |
7373
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
1079 /* we no longer require the entire uidlist to be in memory, |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
1080 let it be used for something more useful. */ |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
1081 squat_uidlist_free_from_memory(ctx->uidlist); |
4445415da4ff
When rebuilding uidlist, read the existing one entirely into memory at the
Timo Sirainen <tss@iki.fi>
parents:
7371
diff
changeset
|
1082 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1083 o_stream_unref(&ctx->output); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1084 if (close(ctx->fd) < 0) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1085 i_error("close(%s) failed: %m", temp_path); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1086 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1087 if (ret <= 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1088 if (unlink(temp_path) < 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1089 i_error("unlink(%s) failed: %m", temp_path); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1090 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1091 array_free(&ctx->new_block_offsets); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1092 array_free(&ctx->new_block_end_indexes); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1093 i_free(ctx); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1094 return ret < 0 ? -1 : 0; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1095 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1096 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1097 static void |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1098 uidlist_flush(struct squat_uidlist_build_context *ctx, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1099 struct uidlist_list *list, uint32_t uid) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1100 { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1101 uint32_t size, offset = ctx->output->offset; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1102 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1103 ctx->build_hdr.link_count++; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1104 if (uidlist_write(ctx->output, list, TRUE, &size) < 0) |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1105 squat_uidlist_set_corrupted(ctx->uidlist, "Broken uidlists"); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1106 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1107 list->uid_count = 2; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1108 list->uid_begins_with_pointer = TRUE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1109 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1110 list->uid_list[0] = offset; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1111 list->uid_list[1] = uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1112 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1113 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1114 static struct uidlist_list * |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1115 uidlist_add_new(struct squat_uidlist_build_context *ctx, unsigned int count, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1116 uint32_t *uid_list_idx_r) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1117 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1118 struct uidlist_list *list; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1119 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1120 i_assert(array_count(&ctx->lists) + |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1121 ctx->list_start_idx == ctx->build_hdr.count); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1122 *uid_list_idx_r = (ctx->build_hdr.count + 0x100) << 1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1123 list = array_append_space(&ctx->lists); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1124 ctx->build_hdr.count++; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1125 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1126 list->uid_count = count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1127 return list; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1128 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1129 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1130 uint32_t squat_uidlist_build_add_uid(struct squat_uidlist_build_context *ctx, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1131 uint32_t uid_list_idx, uint32_t uid) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1132 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1133 struct uidlist_list *list; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1134 unsigned int idx, mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1135 uint32_t *p; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1136 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1137 if ((uid_list_idx & 1) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1138 /* adding second UID */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1139 uint32_t prev_uid = uid_list_idx >> 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1140 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1141 i_assert(prev_uid != uid); |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1142 list = uidlist_add_new(ctx, 2, &uid_list_idx); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1143 list->uid_list[0] = prev_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1144 if (prev_uid + 1 == uid) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1145 list->uid_list[0] |= UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1146 list->uid_list[1] = uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1147 return uid_list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1148 } else if (uid_list_idx < (0x100 << 1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1149 uint32_t old_list_idx; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1150 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1151 if (uid < 8) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1152 /* UID lists containing only UIDs 0-7 are saved as |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1153 uidlist values 2..511. think of it as a bitmask. */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1154 uid_list_idx |= 1 << (uid + 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1155 i_assert((uid_list_idx & 1) == 0); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1156 return uid_list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1157 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1158 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1159 if (uid_list_idx == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1160 /* first UID */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1161 return (uid << 1) | 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1162 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1163 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1164 /* create a new list */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1165 old_list_idx = uid_list_idx >> 1; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1166 list = uidlist_add_new(ctx, 1, &uid_list_idx); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1167 /* add the first UID ourself */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1168 idx = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1169 i_assert((old_list_idx & 0xff) != 0); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1170 for (mask = 1; mask <= 128; mask <<= 1, idx++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1171 if ((old_list_idx & mask) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1172 list->uid_list[0] = idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1173 idx++; mask <<= 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1174 break; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1175 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1176 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1177 for (; mask <= 128; mask <<= 1, idx++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1178 if ((old_list_idx & mask) != 0) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1179 squat_uidlist_build_add_uid(ctx, |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1180 uid_list_idx, idx); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1181 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1182 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1183 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1184 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1185 /* add to existing list */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1186 idx = (uid_list_idx >> 1) - 0x100; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1187 if (idx < ctx->list_start_idx) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1188 list = uidlist_add_new(ctx, 2, &uid_list_idx); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1189 list->uid_list[0] = UID_LIST_POINTER_MASK_LIST_IDX | idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1190 list->uid_list[1] = uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1191 list->uid_begins_with_pointer = TRUE; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1192 ctx->build_hdr.link_count++; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1193 return uid_list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1194 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1195 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1196 idx -= ctx->list_start_idx; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1197 if (idx >= array_count(&ctx->lists)) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1198 squat_uidlist_set_corrupted(ctx->uidlist, |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1199 "missing/broken uidlist"); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1200 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1201 } |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1202 list = array_idx_modifiable(&ctx->lists, idx); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1203 i_assert(list->uid_count > 0); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1204 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1205 p = &list->uid_list[list->uid_count-1]; |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1206 i_assert(uid != *p || ctx->uidlist->corrupted || |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1207 (list->uid_count == 1 && list->uid_begins_with_pointer)); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1208 if (uid == *p + 1 && |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1209 (list->uid_count > 1 || !list->uid_begins_with_pointer)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1210 /* use a range */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1211 if (list->uid_count > 1 && (p[-1] & UID_LIST_MASK_RANGE) != 0 && |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1212 (list->uid_count > 2 || !list->uid_begins_with_pointer)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1213 /* increase the existing range */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1214 *p += 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1215 return uid_list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1216 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1217 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1218 if (list->uid_count == UIDLIST_LIST_SIZE) { |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1219 uidlist_flush(ctx, list, uid); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1220 return uid_list_idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1221 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1222 /* create a new range */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1223 *p |= UID_LIST_MASK_RANGE; |
7370
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
1224 } else { |
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
1225 if (list->uid_count == UIDLIST_LIST_SIZE) { |
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
1226 uidlist_flush(ctx, list, uid); |
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
1227 return uid_list_idx; |
d51565e31ceb
Minor optimization and possible compile fix.
Timo Sirainen <tss@iki.fi>
parents:
7369
diff
changeset
|
1228 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1229 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1230 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1231 p++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1232 list->uid_count++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1233 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1234 *p = uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1235 return uid_list_idx; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1236 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1237 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1238 static void uidlist_array_append(ARRAY_TYPE(uint32_t) *uids, uint32_t uid) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1239 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1240 uint32_t *uidlist; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1241 unsigned int count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1242 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1243 uidlist = array_get_modifiable(uids, &count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1244 if (count == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1245 array_append(uids, &uid, 1); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1246 return; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1247 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1248 if (uidlist[count-1] + 1 == uid) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1249 if (count > 1 && (uidlist[count-2] & |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1250 UID_LIST_MASK_RANGE) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1251 uidlist[count-1]++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1252 return; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1253 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1254 uidlist[count-1] |= UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1255 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1256 array_append(uids, &uid, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1257 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1258 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1259 static void uidlist_array_append_range(ARRAY_TYPE(uint32_t) *uids, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1260 uint32_t uid1, uint32_t uid2) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1261 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1262 uint32_t *uidlist; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1263 unsigned int count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1264 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1265 i_assert(uid1 < uid2); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1266 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1267 uidlist = array_get_modifiable(uids, &count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1268 if (count == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1269 uid1 |= UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1270 array_append(uids, &uid1, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1271 array_append(uids, &uid2, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1272 return; |
4933
44a0e7606f7a
Use seq_range_array_remove_range() instead of slowly iterating ourself.
Timo Sirainen <tss@iki.fi>
parents:
4931
diff
changeset
|
1273 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1274 if (uidlist[count-1] + 1 == uid1) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1275 if (count > 1 && (uidlist[count-2] & |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1276 UID_LIST_MASK_RANGE) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1277 uidlist[count-1] = uid2; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1278 return; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1279 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1280 uidlist[count-1] |= UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1281 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1282 uid1 |= UID_LIST_MASK_RANGE; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1283 array_append(uids, &uid1, 1); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1284 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1285 array_append(uids, &uid2, 1); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1286 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1287 |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1288 static int |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1289 squat_uidlist_get_at_offset(struct squat_uidlist *uidlist, uoff_t offset, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1290 uint32_t num, ARRAY_TYPE(uint32_t) *uids) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1291 { |
7218 | 1292 const uint32_t *uid_list; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1293 const uint8_t *p, *end; |
7218 | 1294 uint32_t size, base_uid, next_uid, flags, prev; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1295 uoff_t uidlist_data_offset; |
7218 | 1296 unsigned int i, j, count; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1297 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1298 if (num != 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1299 uidlist_data_offset = offset; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1300 else { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1301 /* not given, read it */ |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1302 if (uidlist_file_cache_read(uidlist, offset, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1303 SQUAT_PACK_MAX_SIZE) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1304 return -1; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1305 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1306 p = CONST_PTR_OFFSET(uidlist->data, offset); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1307 end = CONST_PTR_OFFSET(uidlist->data, uidlist->data_size); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1308 num = squat_unpack_num(&p, end); |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1309 uidlist_data_offset = p - (const uint8_t *)uidlist->data; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1310 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1311 size = num >> 2; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1312 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1313 if (uidlist_file_cache_read(uidlist, uidlist_data_offset, size) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1314 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1315 if (uidlist_data_offset + size > uidlist->data_size) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1316 squat_uidlist_set_corrupted(uidlist, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1317 "size points outside file"); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1318 return -1; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1319 } |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1320 |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1321 p = CONST_PTR_OFFSET(uidlist->data, uidlist_data_offset); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1322 end = p + size; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1323 |
7218 | 1324 flags = num; |
1325 if ((flags & UIDLIST_PACKED_FLAG_BEGINS_WITH_POINTER) != 0) { | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1326 /* link to the file */ |
7218 | 1327 prev = squat_unpack_num(&p, end); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1328 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1329 if ((prev & 1) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1330 /* pointer to uidlist */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1331 prev = ((prev >> 1) + 0x100) << 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1332 if (squat_uidlist_get(uidlist, prev, uids) < 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1333 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1334 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1335 prev = offset - (prev >> 1); |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1336 if (squat_uidlist_get_at_offset(uidlist, prev, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1337 0, uids) < 0) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1338 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1339 } |
7218 | 1340 uid_list = array_get(uids, &count); |
1341 next_uid = count == 0 ? 0 : uid_list[count-1] + 1; | |
1342 } else { | |
1343 next_uid = 0; | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1344 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1345 |
7218 | 1346 num = base_uid = squat_unpack_num(&p, end); |
1347 if ((flags & UIDLIST_PACKED_FLAG_BITMASK) == 0) | |
1348 base_uid >>= 1; | |
1349 if (base_uid < next_uid) { | |
1350 squat_uidlist_set_corrupted(uidlist, | |
1351 "broken continued uidlist"); | |
1352 return -1; | |
1353 } | |
1354 | |
1355 if ((flags & UIDLIST_PACKED_FLAG_BITMASK) != 0) { | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1356 /* bitmask */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1357 size = end - p; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1358 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1359 uidlist_array_append(uids, base_uid++); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1360 for (i = 0; i < size; i++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1361 for (j = 0; j < 8; j++, base_uid++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1362 if ((p[i] & (1 << j)) != 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1363 uidlist_array_append(uids, base_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1364 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1365 } |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1366 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1367 /* range */ |
7218 | 1368 for (;;) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1369 if ((num & 1) == 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1370 uidlist_array_append(uids, base_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1371 } else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1372 /* range */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1373 uint32_t seq1 = base_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1374 base_uid += squat_unpack_num(&p, end) + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1375 uidlist_array_append_range(uids, seq1, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1376 base_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1377 } |
7218 | 1378 if (p == end) |
1379 break; | |
1380 | |
1381 num = squat_unpack_num(&p, end); | |
1382 base_uid += (num >> 1) + 1; | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1383 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1384 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1385 return 0; |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1386 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1387 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1388 static int uint32_cmp(const void *key, const void *data) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1389 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1390 const uint32_t *i1 = key, *i2 = data; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1391 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1392 return (int)*i1 - (int)*i2; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1393 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1394 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1395 static int |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1396 squat_uidlist_get_offset(struct squat_uidlist *uidlist, uint32_t uid_list_idx, |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1397 uint32_t *offset_r, uint32_t *num_r) |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1398 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1399 const uint8_t *p, *end; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1400 unsigned int idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1401 uint32_t num, skip_bytes, uidlists_offset; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1402 size_t max_map_size; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1403 |
6931
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1404 if (uidlist->fd == -1) { |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1405 squat_uidlist_set_corrupted(uidlist, "no uidlists"); |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1406 return -1; |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1407 } |
97702c9c4111
Locking and error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
6917
diff
changeset
|
1408 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1409 if (bsearch_insert_pos(&uid_list_idx, uidlist->cur_block_end_indexes, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1410 uidlist->cur_block_count, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1411 sizeof(uint32_t), uint32_cmp, &idx)) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1412 idx++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1413 if (unlikely(idx == uidlist->cur_block_count)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1414 squat_uidlist_set_corrupted(uidlist, "uidlist not found"); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1415 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1416 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1417 if (unlikely(idx > 0 && |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1418 uidlist->cur_block_end_indexes[idx-1] > uid_list_idx)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1419 squat_uidlist_set_corrupted(uidlist, "broken block list"); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1420 return -1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1421 } |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1422 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1423 /* make sure everything is mapped */ |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1424 uid_list_idx -= idx == 0 ? 0 : uidlist->cur_block_end_indexes[idx-1]; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1425 max_map_size = SQUAT_PACK_MAX_SIZE * (1+uid_list_idx); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1426 if (uidlist_file_cache_read(uidlist, uidlist->cur_block_offsets[idx], |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1427 max_map_size) < 0) |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1428 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1429 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1430 /* find the uidlist inside the block */ |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1431 p = CONST_PTR_OFFSET(uidlist->data, uidlist->cur_block_offsets[idx]); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1432 end = CONST_PTR_OFFSET(uidlist->data, uidlist->data_size); |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1433 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1434 uidlists_offset = uidlist->cur_block_offsets[idx] - |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1435 squat_unpack_num(&p, end); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1436 for (skip_bytes = 0; uid_list_idx > 0; uid_list_idx--) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1437 num = squat_unpack_num(&p, end); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1438 skip_bytes += num >> 2; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1439 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1440 *offset_r = uidlists_offset + skip_bytes; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1441 *num_r = squat_unpack_num(&p, end); |
4931
59ce1d6c0b8c
Actually the code wasn't unneeded, put it back and actually execute it now.
Timo Sirainen <tss@iki.fi>
parents:
4930
diff
changeset
|
1442 |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1443 if (unlikely(p == end)) { |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1444 squat_uidlist_set_corrupted(uidlist, "broken file"); |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1445 return -1; |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1446 } |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1447 if (unlikely(*offset_r > uidlist->mmap_size && |
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1448 uidlist->mmap_base != NULL)) { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1449 squat_uidlist_set_corrupted(uidlist, "broken offset"); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1450 return -1; |
4931
59ce1d6c0b8c
Actually the code wasn't unneeded, put it back and actually execute it now.
Timo Sirainen <tss@iki.fi>
parents:
4930
diff
changeset
|
1451 } |
59ce1d6c0b8c
Actually the code wasn't unneeded, put it back and actually execute it now.
Timo Sirainen <tss@iki.fi>
parents:
4930
diff
changeset
|
1452 return 0; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1453 } |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1454 |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1455 int squat_uidlist_get(struct squat_uidlist *uidlist, uint32_t uid_list_idx, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1456 ARRAY_TYPE(uint32_t) *uids) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1457 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1458 unsigned int mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1459 uint32_t uid, offset, num; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1460 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1461 if ((uid_list_idx & 1) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1462 /* single UID */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1463 uid = uid_list_idx >> 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1464 uidlist_array_append(uids, uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1465 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1466 } else if (uid_list_idx < (0x100 << 1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1467 /* bitmask */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1468 for (uid = 0, mask = 2; mask <= 256; mask <<= 1, uid++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1469 if ((uid_list_idx & mask) != 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1470 uidlist_array_append(uids, uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1471 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1472 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1473 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1474 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1475 uid_list_idx = (uid_list_idx >> 1) - 0x100; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1476 if (squat_uidlist_get_offset(uidlist, uid_list_idx, &offset, &num) < 0) |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1477 return -1; |
6944
66b3e894041b
Support mmap_disable=yes and some error handling improvements.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1478 return squat_uidlist_get_at_offset(uidlist, offset, num, uids); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1479 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1480 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1481 uint32_t squat_uidlist_singleton_last_uid(uint32_t uid_list_idx) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1482 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1483 unsigned int idx, mask; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1484 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1485 if ((uid_list_idx & 1) != 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1486 /* single UID */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1487 return uid_list_idx >> 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1488 } else if (uid_list_idx < (0x100 << 1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1489 /* bitmask */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1490 if (uid_list_idx == 2) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1491 /* just a quick optimization */ |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1492 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1493 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1494 for (idx = 7, mask = 256; mask > 2; mask >>= 1, idx--) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1495 if ((uid_list_idx & mask) != 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1496 return idx; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1497 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1498 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1499 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1500 i_unreached(); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1501 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1502 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1503 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1504 int squat_uidlist_get_seqrange(struct squat_uidlist *uidlist, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1505 uint32_t uid_list_idx, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1506 ARRAY_TYPE(seq_range) *seq_range_arr) |
4886
ae2114f11a0e
Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents:
4883
diff
changeset
|
1507 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1508 ARRAY_TYPE(uint32_t) tmp_uid_arr; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1509 struct seq_range range; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1510 const uint32_t *tmp_uids; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1511 unsigned int i, count; |
6945
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1512 int ret; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1513 |
6945
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1514 i_array_init(&tmp_uid_arr, 128); |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1515 ret = squat_uidlist_get(uidlist, uid_list_idx, &tmp_uid_arr); |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1516 if (ret == 0) { |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1517 tmp_uids = array_get(&tmp_uid_arr, &count); |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1518 for (i = 0; i < count; i++) { |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1519 if ((tmp_uids[i] & UID_LIST_MASK_RANGE) == 0) |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1520 range.seq1 = range.seq2 = tmp_uids[i]; |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1521 else { |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1522 range.seq1 = tmp_uids[i] & ~UID_LIST_MASK_RANGE; |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1523 range.seq2 = tmp_uids[++i]; |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1524 } |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1525 array_append(seq_range_arr, &range, 1); |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1526 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1527 } |
6945
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1528 array_free(&tmp_uid_arr); |
5915aea5f070
UID ranges can be large, don't allocate them from data stack.
Timo Sirainen <tss@iki.fi>
parents:
6944
diff
changeset
|
1529 return ret; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1530 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1531 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1532 int squat_uidlist_filter(struct squat_uidlist *uidlist, uint32_t uid_list_idx, |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1533 ARRAY_TYPE(seq_range) *uids) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1534 { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1535 const struct seq_range *parent_range; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1536 ARRAY_TYPE(seq_range) dest_uids; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1537 ARRAY_TYPE(uint32_t) relative_uids; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1538 const uint32_t *rel_range; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1539 unsigned int i, rel_count, parent_idx, parent_count, diff, parent_uid; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1540 uint32_t prev_seq, seq1, seq2; |
7218 | 1541 int ret = 0; |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1542 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1543 parent_range = array_get(uids, &parent_count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1544 if (parent_count == 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1545 return 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1546 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1547 i_array_init(&relative_uids, 128); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1548 i_array_init(&dest_uids, 128); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1549 squat_uidlist_get(uidlist, uid_list_idx, &relative_uids); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1550 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1551 parent_idx = 0; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1552 rel_range = array_get(&relative_uids, &rel_count); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1553 prev_seq = 0; parent_uid = parent_range[0].seq1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1554 for (i = 0; i < rel_count; i++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1555 if (unlikely(parent_uid == (uint32_t)-1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1556 i_error("broken UID ranges"); |
7218 | 1557 ret = -1; |
1558 break; | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1559 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1560 if ((rel_range[i] & UID_LIST_MASK_RANGE) == 0) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1561 seq1 = seq2 = rel_range[i]; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1562 else { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1563 seq1 = (rel_range[i] & ~UID_LIST_MASK_RANGE); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1564 seq2 = rel_range[++i]; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1565 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1566 i_assert(seq1 >= prev_seq); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1567 diff = seq1 - prev_seq; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1568 while (diff > 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1569 if (unlikely(parent_uid == (uint32_t)-1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1570 i_error("broken UID ranges"); |
7218 | 1571 ret = -1; |
1572 break; | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1573 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1574 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1575 for (; parent_idx < parent_count; parent_idx++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1576 if (parent_range[parent_idx].seq2 <= parent_uid) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1577 continue; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1578 if (parent_uid < parent_range[parent_idx].seq1) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1579 parent_uid = parent_range[parent_idx].seq1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1580 else |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1581 parent_uid++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1582 break; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1583 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1584 diff--; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1585 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1586 diff = seq2 - seq1 + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1587 while (diff > 0) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1588 if (unlikely(parent_uid == (uint32_t)-1)) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1589 i_error("broken UID ranges"); |
7218 | 1590 ret = -1; |
1591 break; | |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1592 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1593 seq_range_array_add(&dest_uids, 0, parent_uid); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1594 for (; parent_idx < parent_count; parent_idx++) { |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1595 if (parent_range[parent_idx].seq2 <= parent_uid) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1596 continue; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1597 if (parent_uid < parent_range[parent_idx].seq1) |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1598 parent_uid = parent_range[parent_idx].seq1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1599 else |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1600 parent_uid++; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1601 break; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1602 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1603 diff--; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1604 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1605 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1606 prev_seq = seq2 + 1; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1607 } |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1608 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1609 buffer_set_used_size(uids->arr.buffer, 0); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1610 array_append_array(uids, &dest_uids); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1611 |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1612 array_free(&relative_uids); |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1613 array_free(&dest_uids); |
8850 | 1614 return ret; |
4886
ae2114f11a0e
Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents:
4883
diff
changeset
|
1615 } |
ae2114f11a0e
Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents:
4883
diff
changeset
|
1616 |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1617 size_t squat_uidlist_mem_used(struct squat_uidlist *uidlist, |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1618 unsigned int *count_r) |
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1619 { |
6898
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1620 *count_r = uidlist->hdr.count; |
e739cffd05ef
FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
1621 return uidlist->max_size; |
4855
5bc593f1a8f6
Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1622 } |