annotate src/plugins/fts-squat/squat-trie.c @ 6898:e739cffd05ef HEAD

FTS API changes and Squat rewrite. Squat is still missing expunge handling.
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Dec 2007 23:51:46 +0200
parents 65c69a53a7be
children cff5428c3c4d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1 /* Copyright (c) 2007 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 "str.h"
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
8 #include "seq-range-array.h"
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "squat-uidlist.h"
5068
65a4e1e61555 Some bugfixes. Moved header struct to a separate file.
Timo Sirainen <tss@iki.fi>
parents: 5010
diff changeset
10 #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
11
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdio.h>
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdlib.h>
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
15 #include <ctype.h>
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <fcntl.h>
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
17 #include <time.h>
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
18 #include <sys/mman.h>
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
20 #define MAX_FAST_LEVEL 3
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
21 #define MAX_PARTIAL_LEN 4
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
22 #define MAX_FULL_LEN 4
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
23
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
24 #define SEQUENTIAL_COUNT 46
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
25
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
26 struct squat_trie_build_context {
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
27 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
28 struct ostream *output;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
30 uint32_t first_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
31 unsigned int compress_nodes:1;
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
32 };
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
33
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
34 struct squat_trie_iterate_node {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
35 struct squat_node *node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
36 unsigned int idx;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 };
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
39 struct squat_trie_iterate_context {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
40 struct squat_trie *trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
41 struct squat_trie_iterate_node cur;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
42 ARRAY_DEFINE(parents, struct squat_trie_iterate_node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
43 bool failed;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 };
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
45
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
46 static int squat_trie_map(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
47
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
48 void squat_trie_delete(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
49 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
50 if (unlink(trie->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
51 i_error("unlink(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
52 squat_uidlist_delete(trie->uidlist);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
55 static void squat_trie_set_corrupted(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
56 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
57 trie->corrupted = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
58 i_error("Corrupted file %s", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
59 squat_trie_delete(trie);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
62 static void squat_trie_normalize_map_build(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
63 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
64 static unsigned char valid_chars[] =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
65 "EOTIRSACDNLMVUGPHBFWYXKJQZ0123456789@.-+#$%_&";
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
66 unsigned int i, j;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
68 memset(trie->normalize_map, 0, sizeof(trie->normalize_map));
4901
5e604d6f391e Only ASCII texts were actually indexed. Now UTF-8 input is properly
Timo Sirainen <tss@iki.fi>
parents: 4898
diff changeset
69
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
70 #if 1
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
71 for (i = 0, j = 1; i < sizeof(valid_chars)-1; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
72 unsigned char chr = valid_chars[i];
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
74 if (chr >= 'A' && chr <= 'Z')
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
75 trie->normalize_map[chr-'A'+'a'] = j;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
76 trie->normalize_map[chr] = j++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
77 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
78 i_assert(j <= SEQUENTIAL_COUNT);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
80 for (i = 128; i < 256; i++)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
81 trie->normalize_map[i] = j++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
82 #else
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
83 for (i = 0; i < sizeof(valid_chars)-1; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
84 unsigned char chr = valid_chars[i];
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
85
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
86 if (chr >= 'A' && chr <= 'Z')
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
87 trie->normalize_map[chr-'A'+'a'] = chr;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
88 trie->normalize_map[chr] = chr;
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
89 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
90 for (i = 128; i < 256; i++)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
91 trie->normalize_map[i] = i_toupper(i);
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
92 #endif
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
93 }
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
94
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
95 static void node_free(struct squat_trie *trie, struct squat_node *node)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
97 struct squat_node *children;
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
98 unsigned int i;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
100 if (NODE_IS_DYNAMIC_LEAF(node))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
101 i_free(node->children.leaf_string);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
102 else if (!node->children_not_mapped && node->child_count > 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
103 children = NODE_CHILDREN_NODES(node);
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
104
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
105 trie->node_alloc_size -=
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
106 NODE_CHILDREN_ALLOC_SIZE(node->child_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
107 for (i = 0; i < node->child_count; i++)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
108 node_free(trie, &children[i]);
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
109
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
110 i_free(node->children.data);
4898
07a038b57946 Optimization.
Timo Sirainen <tss@iki.fi>
parents: 4897
diff changeset
111 }
07a038b57946 Optimization.
Timo Sirainen <tss@iki.fi>
parents: 4897
diff changeset
112 }
07a038b57946 Optimization.
Timo Sirainen <tss@iki.fi>
parents: 4897
diff changeset
113
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
114 static void squat_trie_clear(struct squat_trie *trie)
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
115 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
116 node_free(trie, &trie->root);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
117 memset(&trie->root, 0, sizeof(trie->root));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
118 memset(&trie->hdr, 0, sizeof(trie->hdr));
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
119 }
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
120
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
121 struct squat_trie *
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
122 squat_trie_init(const char *path, uint32_t uidvalidity,
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
123 enum file_lock_method lock_method, bool mmap_disable)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 {
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 struct squat_trie *trie;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 trie = i_new(struct squat_trie, 1);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
128 trie->path = i_strdup(path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
129 trie->uidlist = squat_uidlist_init(trie);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 trie->fd = -1;
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
131 trie->lock_method = lock_method;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
132 trie->uidvalidity = uidvalidity;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
133 squat_trie_normalize_map_build(trie);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 return trie;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
137 void squat_trie_deinit(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
138 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
139 struct squat_trie *trie = *_trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
140
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
141 *_trie = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
142 squat_trie_clear(trie);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 squat_uidlist_deinit(trie->uidlist);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
144 i_free(trie->path);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 i_free(trie);
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
148 static void squat_trie_close(struct squat_trie *trie)
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
149 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
150 if (trie->mmap_size != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
151 if (munmap(trie->mmap_base, trie->mmap_size) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
152 i_error("munmap(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
153 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
154 if (trie->fd != -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
155 if (close(trie->fd) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
156 i_error("close(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
157 trie->fd = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
158 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
159 trie->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
160 squat_uidlist_close(trie->uidlist);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
161 }
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
162
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
163 static void squat_trie_header_init(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
164 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
165 memset(&trie->hdr, 0, sizeof(trie->hdr));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
166 trie->hdr.version = SQUAT_TRIE_VERSION;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
167 trie->hdr.indexid = ioloop_time;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
168 trie->hdr.uidvalidity = trie->uidvalidity;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
169 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
170
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
171 static int squat_trie_open_fd(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
172 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
173 trie->fd = open(trie->path, O_RDWR);
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
174 if (trie->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
175 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
176 squat_trie_header_init(trie);
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
177 return 0;
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
178 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
179 i_error("open(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
180 return -1;
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
181 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
182 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
183 }
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
184
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
185 static int squat_trie_open(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
186 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
187 squat_trie_close(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
188 squat_trie_clear(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
189
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
190 if (squat_trie_open_fd(trie) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
191 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
192 if (squat_trie_map(trie) < 0)
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
193 return -1;
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
194
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
195 return squat_uidlist_open(trie->uidlist);
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
196 }
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
197
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
198 static int squat_trie_is_file_stale(struct squat_trie *trie)
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
199 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
200 struct stat st, st2;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
201
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
202 if (stat(trie->path, &st) < 0) {
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
203 if (errno == ENOENT)
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
204 return 1;
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
205
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
206 i_error("stat(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
207 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
208 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
209 if (fstat(trie->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
210 i_error("fstat(%s) failed: %m", trie->path);
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
211 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
212 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
213 trie->locked_file_size = st2.st_size;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
214
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
215 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
216 CMP_DEV_T(st.st_dev, st2.st_dev) ? 0 : 1;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
217 }
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
218
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
219 void squat_trie_refresh(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
220 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
221 if (squat_trie_is_file_stale(trie) > 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
222 (void)squat_trie_open(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
223 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
224
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
225 static int squat_trie_lock(struct squat_trie *trie, int lock_type,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
226 struct file_lock **file_lock_r)
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
227 {
ae2114f11a0e Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents: 4883
diff changeset
228 int ret;
ae2114f11a0e Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents: 4883
diff changeset
229
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
230 while (trie->fd != -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
231 ret = file_wait_lock(trie->fd, trie->path, lock_type,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
232 trie->lock_method, SQUAT_TRIE_LOCK_TIMEOUT,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
233 file_lock_r);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
234 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
235 i_error("file_wait_lock(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
236 return 0;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
237 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
238 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
239 return -1;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
240
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
241 /* if the trie has been compressed, we need to reopen the
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
242 file and try to lock again */
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
243 ret = squat_trie_is_file_stale(trie);
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
244 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
245 return 1;
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
246
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
247 file_unlock(file_lock_r);
4879
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
248 if (ret < 0)
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
249 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4878
diff changeset
250
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
251 squat_trie_close(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
252 if (squat_trie_open_fd(trie) < 0)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 return -1;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 return 0;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
258 static void
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
259 node_make_squential(struct squat_trie *trie, struct squat_node *node, int level)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
261 const unsigned int alloc_size =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
262 NODE_CHILDREN_ALLOC_SIZE(SEQUENTIAL_COUNT);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
263 struct squat_node *children;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
264 unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
265 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
266
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
267 i_assert(node->child_count == 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
268
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
269 trie->node_alloc_size += alloc_size;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
271 node->want_sequential = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
272 node->have_sequential = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
273
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
274 node->child_count = SEQUENTIAL_COUNT;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
275 node->children.data = i_malloc(alloc_size);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
277 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
278 for (i = 0; i < SEQUENTIAL_COUNT; i++)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
279 chars[i] = i;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
280
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
281 if (level < MAX_FAST_LEVEL) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
282 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
283 for (i = 0; i < SEQUENTIAL_COUNT; i++)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
284 children[i].want_sequential = TRUE;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
288 static unsigned int
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
289 node_add_child(struct squat_trie *trie, struct squat_node *node,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
290 unsigned char chr, int level)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
291 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
292 unsigned int old_child_count = node->child_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
293 struct squat_node *children, *old_children;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
294 unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
295 size_t old_size, new_size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
296
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
297 i_assert(node->leaf_string_length == 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
298
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
299 if (node->want_sequential) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
300 node_make_squential(trie, node, level);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
301
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
302 if (chr < SEQUENTIAL_COUNT)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
303 return chr;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
304 old_child_count = SEQUENTIAL_COUNT;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
305 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
306
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
307 node->child_count++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
308 new_size = NODE_CHILDREN_ALLOC_SIZE(node->child_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
309
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
310 if (old_child_count == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
311 /* first child */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
312 node->children.data = i_malloc(new_size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
313 trie->node_alloc_size += new_size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
314 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
315 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
316 old_size = NODE_CHILDREN_ALLOC_SIZE(old_child_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
317 if (old_size != new_size) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
318 trie->node_alloc_size += new_size - old_size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
319 node->children.data = i_realloc(node->children.data,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
320 old_size, new_size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
321 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
322
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
323 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
324 old_children = (void *)(NODE_CHILDREN_CHARS(node) +
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
325 MEM_ALIGN(old_child_count));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
326 if (children != old_children) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
327 memmove(children, old_children,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
328 old_child_count * sizeof(struct squat_node));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
329 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
330 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
331
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
332 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
333 chars[node->child_count - 1] = chr;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
334 return node->child_count - 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
335 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
336
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 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
338 node_read_children(struct squat_trie *trie, struct squat_node *node, int level)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
340 const uint8_t *data, *end;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
341 const unsigned char *child_chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
342 struct squat_node *child, *children = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
343 uoff_t node_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
344 unsigned int i, child_idx, child_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
345 uoff_t base_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
346 uint32_t num;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
347
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
348 i_assert(node->children_not_mapped);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
349 i_assert(!node->have_sequential);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
350 i_assert(trie->unmapped_child_count > 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
351
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
352 trie->unmapped_child_count--;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
353 node_offset = node->children.offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
354 node->children_not_mapped = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
355 node->children.data = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
356
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
357 if (unlikely(node_offset >= trie->mmap_size)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
358 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
359 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
360 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
361
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
362 data = CONST_PTR_OFFSET(trie->mmap_base, node_offset);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
363 end = CONST_PTR_OFFSET(trie->mmap_base, trie->mmap_size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
364 child_count = *data++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
365 if (unlikely(node_offset + child_count >= trie->mmap_size)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
366 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
367 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
368 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
369
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
370 if (child_count == 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
371 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
372
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
373 child_chars = data;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
374 data += child_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
375
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
376 /* get child offsets */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
377 base_offset = node_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
378 for (i = 0; i < child_count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
379 /* we always start with !have_sequential, so at i=0 this
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
380 check always goes to add the first child */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
381 if (node->have_sequential && child_chars[i] < SEQUENTIAL_COUNT)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
382 child_idx = child_chars[i];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
383 else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
384 child_idx = node_add_child(trie, node, child_chars[i],
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
385 level);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
386 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
387 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
388 child = &children[child_idx];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
389
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
390 /* 1) child offset */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
391 num = squat_unpack_num(&data, end);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
392 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
393 /* no children */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
394 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
395 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
396 base_offset += num >> 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
397 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
398 base_offset -= num >> 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
399 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
400 if (base_offset >= trie->mmap_size) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
401 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
402 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
403 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
404 trie->unmapped_child_count++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
405 child->children_not_mapped = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
406 child->children.offset = base_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
407 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
408
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
409 /* 2) uidlist */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
410 child->uid_list_idx = squat_unpack_num(&data, end);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
411 if (child->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
412 /* we don't write nodes with empty uidlists */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
413 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
414 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
415 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
416 if (!UIDLIST_IS_SINGLETON(child->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
417 /* 3) next uid */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
418 child->next_uid = squat_unpack_num(&data, end) + 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
419 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
420 uint32_t idx = child->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
421
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
422 child->next_uid = 1 +
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
423 squat_uidlist_singleton_last_uid(idx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
424 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
425
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
426 /* 4) unused uids + leaf string flag */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
427 num = squat_unpack_num(&data, end);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
428 child->unused_uids = num >> 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
429 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
430 /* leaf string */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
431 unsigned int len;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
432 unsigned char *dest;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
433
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
434 /* 5) leaf string length */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
435 len = child->leaf_string_length =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
436 squat_unpack_num(&data, end) + 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
437 if (!NODE_IS_DYNAMIC_LEAF(child))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
438 dest = child->children.static_leaf_string;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
439 else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
440 dest = child->children.leaf_string =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
441 i_malloc(len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
442 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
443 if (end - data < len) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
444 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
445 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
446 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
447 memcpy(dest, data, len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
448 data += len;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
449 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
450 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
451 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
452 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
453
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
454 static void
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
455 node_write_children(struct squat_trie_build_context *ctx,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
456 struct squat_node *node, const uoff_t *node_offsets)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
457 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
458 struct squat_node *children;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
459 const unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
460 uint8_t child_count, buf[SQUAT_PACK_MAX_SIZE * 5], *bufp;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
461 uoff_t base_offset;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 unsigned int i;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
463
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
464 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
465 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
466
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
467 base_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
468 child_count = node->child_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
469 o_stream_send(ctx->output, &child_count, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
470 o_stream_send(ctx->output, chars, child_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
471
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
472 for (i = 0; i < child_count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
473 bufp = buf;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
474 /* 1) child offset */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
475 if (node_offsets[i] == 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
476 *bufp++ = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
477 else if (node_offsets[i] >= base_offset) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
478 squat_pack_num(&bufp,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
479 ((node_offsets[i] - base_offset) << 1) | 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
480 base_offset = node_offsets[i];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
481 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
482 squat_pack_num(&bufp,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
483 (base_offset - node_offsets[i]) << 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
484 base_offset = node_offsets[i];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
485 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
486
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
487 /* 2) uidlist */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
488 squat_pack_num(&bufp, children[i].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
489 if (!UIDLIST_IS_SINGLETON(children[i].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
490 /* 3) next uid */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
491 squat_pack_num(&bufp, children[i].next_uid - 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
492 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
493
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
494 if (children[i].leaf_string_length == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
495 /* 4a) unused uids */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
496 squat_pack_num(&bufp, children[i].unused_uids << 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
497 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
498 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
499 i_assert(node_offsets[i] == 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
500 /* 4b) unused uids + flag */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
501 squat_pack_num(&bufp, (children[i].unused_uids << 1) | 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
502 /* 5) leaf string length */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
503 squat_pack_num(&bufp, children[i].leaf_string_length - 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
504 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
505 o_stream_send(ctx->output,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
506 NODE_LEAF_STRING(&children[i]),
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
507 children[i].leaf_string_length);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
508 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
509 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
510 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
511
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
512 static inline void
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
513 node_add_uid(struct squat_trie *trie, uint32_t uid, struct squat_node *node)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
514 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
515 if (uid < node->next_uid) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
516 /* duplicate */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
517 return;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
518 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
519 node->unused_uids += uid - node->next_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
520 node->next_uid = uid + 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
521
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
522 node->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
523 squat_uidlist_build_add_uid(trie->uidlist,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
524 node->uid_list_idx, uid);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
525 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
526
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
527 static void node_split_string(struct squat_trie *trie, struct squat_node *node)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
528 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
529 struct squat_node *child;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
530 unsigned char *str;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
531 unsigned int uid, idx, str_len = node->leaf_string_length;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
532
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
533 i_assert(str_len > 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
534
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
535 t_push();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
536 /* make a copy of the leaf string and convert to normal node by
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
537 removing it. */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
538 str = t_malloc(str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
539 if (!NODE_IS_DYNAMIC_LEAF(node))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
540 memcpy(str, node->children.static_leaf_string, str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
541 else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
542 memcpy(str, node->children.leaf_string, str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
543 i_free(node->children.leaf_string);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
544 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
545 node->leaf_string_length = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
546
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
547 /* create a new child node for the rest of the string */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
548 idx = node_add_child(trie, node, str[0], MAX_FAST_LEVEL);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
549 child = NODE_CHILDREN_NODES(node) + idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
550
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
551 /* update uidlist to contain all of parent's UIDs */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
552 child->next_uid = node->next_uid - node->unused_uids;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
553 for (uid = 0; uid < child->next_uid; uid++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
554 child->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
555 squat_uidlist_build_add_uid(trie->uidlist,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
556 child->uid_list_idx, uid);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
557 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
558
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
559 i_assert(!child->have_sequential && child->children.data == NULL);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
560 if (str_len > 1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
561 /* make the child a leaf string */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
562 str_len--;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
563 child->leaf_string_length = str_len;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
564 if (!NODE_IS_DYNAMIC_LEAF(child)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
565 memcpy(child->children.static_leaf_string,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
566 str + 1, str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
567 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
568 child->children.leaf_string = i_malloc(str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
569 memcpy(child->children.leaf_string, str + 1, str_len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
570 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
571 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
572 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
573 }
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
575 static bool
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
576 node_leaf_string_add_or_split(struct squat_trie *trie, struct squat_node *node,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
577 const unsigned char *data, unsigned int data_len)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
578 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
579 const unsigned char *str = NODE_LEAF_STRING(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
580 const unsigned int str_len = node->leaf_string_length;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
581 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
582
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
583 if (data_len != str_len) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
584 /* different lengths, can't match */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
585 node_split_string(trie, node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
586 return FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
587 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
588
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
589 for (i = 0; i < data_len; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
590 if (data[i] != str[i]) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
591 /* non-match */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
592 node_split_string(trie, node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
593 return FALSE;
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 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
596 return TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
597 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
598
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
599 static int squat_build_add(struct squat_trie *trie, 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
600 const unsigned char *data, unsigned int size)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
601 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
602 struct squat_node *node = &trie->root;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
603 const unsigned char *end = data + size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
604 unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
605 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
606 int level = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
607
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
608 for (;;) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
609 if (node->children_not_mapped) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
610 if (unlikely(node_read_children(trie, node, level) < 0))
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 return -1;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
613
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
614 if (node->leaf_string_length != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
615 /* the whole string must match or we need to split
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
616 the node */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
617 if (node_leaf_string_add_or_split(trie, node, data,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
618 end - data)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
619 node_add_uid(trie, uid, node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
620 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
621 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
622 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
623
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
624 node_add_uid(trie, uid, node);
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 (unlikely(uid < node->unused_uids)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
627 squat_trie_set_corrupted(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
628 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
629 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
630 /* child node's UIDs are relative to ours. so for example if
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
631 we're adding UID 4 and this node now has [2,4] UIDs,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
632 unused_uids=3 and so the child node will be adding
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
633 UID 4-3 = 1. */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
634 uid -= node->unused_uids;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
635
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
636 if (data == end)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
637 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
638 level++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
639
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
640 if (node->have_sequential) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
641 if (*data < SEQUENTIAL_COUNT) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
642 idx = *data;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
643 goto found;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
644 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
645 idx = SEQUENTIAL_COUNT;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
646 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
647 idx = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
648 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
649 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
650 for (; idx < node->child_count; idx++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
651 if (chars[idx] == *data)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
652 goto found;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
653 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
654 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
655 found:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
656 data++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
657 node = NODE_CHILDREN_NODES(node) + idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
658 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
659
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
660 /* create new children */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
661 i_assert(node->leaf_string_length == 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
662
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
663 for (;;) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
664 idx = node_add_child(trie, node, *data,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
665 size - (end - data) + 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
666 node = NODE_CHILDREN_NODES(node) + idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
667
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
668 node_add_uid(trie, uid, node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
669 uid = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
670
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
671 if (++data == end)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
672 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
673
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
674 if (!node->have_sequential) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
675 /* convert the node into a leaf string */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
676 unsigned int len = end - data;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
677
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
678 i_assert(node->children.data == NULL);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
679 node->leaf_string_length = len;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
680 if (!NODE_IS_DYNAMIC_LEAF(node)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
681 memcpy(node->children.static_leaf_string,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
682 data, len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
683 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
684 node->children.leaf_string = i_malloc(len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
685 memcpy(node->children.leaf_string, data, len);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
686 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
687 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
688 }
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 return 0;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
693 static int
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
694 squat_build_word(struct squat_trie *trie, 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
695 const unsigned char *data, unsigned int size)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
697 #if MAX_PARTIAL_LEN > 0
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
698 unsigned int i;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
700 for (i = size - 1; i > 0; i--) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
701 if (squat_build_add(trie, uid, data + i,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
702 I_MIN(MAX_PARTIAL_LEN, size - i)) < 0)
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
703 return -1;
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
704 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
705 #endif
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
706 return squat_build_add(trie, uid, data, I_MIN(size, MAX_FULL_LEN));
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
709 static unsigned char *
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
710 squat_data_normalize(struct squat_trie *trie, const unsigned char *data,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
711 unsigned int size)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
713 unsigned char *dest;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
714 unsigned int i;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
716 dest = t_malloc(size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
717 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
718 dest[i] = trie->normalize_map[data[i]];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
719 return dest;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
722 int squat_trie_build_more(struct squat_trie_build_context *ctx,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
723 uint32_t uid, enum squat_index_type type,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
724 const unsigned char *data, unsigned int size)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 {
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
726 struct squat_trie *trie = ctx->trie;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
727 unsigned int i, start = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
728 int ret = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
729
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
730 uid = uid * 2 + (type == SQUAT_INDEX_TYPE_HEADER ? 0 : 1);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
732 t_push();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
733 data = squat_data_normalize(trie, data, size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
734 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
735 if (data[i] != '\0')
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
736 continue;
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
737
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
738 while (start < i && data[start] == '\0')
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
739 start++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
740 if (i != start) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
741 if (squat_build_word(trie, uid, data + start,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
742 i - start) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
743 ret = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
744 start = i;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
745 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
746 }
4883
d8adbe93c969 Added support for mmap_disable=yes and several other fixes.
Timo Sirainen <tss@iki.fi>
parents: 4879
diff changeset
747 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
748 start = i + 1;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
750 while (start < i && data[start] == '\0')
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
751 start++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
752 if (i != start) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
753 if (squat_build_word(trie, uid, data + start, i - start) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
754 ret = -1;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
756 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
757 return ret;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
760 static void node_drop_unused_children(struct squat_node *node)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
762 unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
763 struct squat_node *children_src, *children_dest;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
764 unsigned int i, j, orig_child_count = node->child_count;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
766 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
767 children_src = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
768
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
769 /* move chars */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
770 for (i = j = 0; i < orig_child_count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
771 if (children_src[i].next_uid != 0)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 chars[j++] = chars[i];
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
774 node->child_count = j;
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
775
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
776 /* move children. note that children_dest may point to different
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
777 location than children_src, although they both point to the
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
778 same node. */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
779 children_dest = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
780 for (i = j = 0; i < orig_child_count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
781 if (children_src[i].next_uid != 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
782 children_dest[j++] = children_src[i];
4890
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
783 }
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
784 }
cb3b4153136c 64bit and big endian fixes
Timo Sirainen <tss@iki.fi>
parents: 4887
diff changeset
785
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 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
787 squat_write_node(struct squat_trie_build_context *ctx, struct squat_node *node,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
788 uoff_t *node_offset_r, int level)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
790 struct squat_trie *trie = ctx->trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
791 struct squat_node *children;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
792 unsigned int i;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
793 uoff_t *node_offsets;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
794 uint8_t child_count;
4901
5e604d6f391e Only ASCII texts were actually indexed. Now UTF-8 input is properly
Timo Sirainen <tss@iki.fi>
parents: 4898
diff changeset
795
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
796 i_assert(node->next_uid != 0);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
798 if (node->children_not_mapped && ctx->compress_nodes) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
799 if (node_read_children(trie, node, MAX_FAST_LEVEL) < 0)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 return -1;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
802
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
803 node->have_sequential = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
804 node_drop_unused_children(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
805
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
806 child_count = node->child_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
807 if (child_count == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
808 i_assert(!node->children_not_mapped ||
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
809 node->leaf_string_length == 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
810 *node_offset_r = !node->children_not_mapped ? 0 :
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
811 node->children.offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
812 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
813 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
814 i_assert(!node->children_not_mapped);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
815
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
816 trie->hdr.node_count++;
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 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
819 node_offsets = t_new(uoff_t, child_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
820 for (i = 0; i < child_count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
821 t_push();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
822 if (squat_write_node(ctx, &children[i], &node_offsets[i],
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
823 level + 1) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
824 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
825 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
826 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
827 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
828 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
829
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
830 *node_offset_r = 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
831 node_write_children(ctx, node, node_offsets);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
832 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
833 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
834
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
835 static int squat_write_nodes(struct squat_trie_build_context *ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
836 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
837 struct squat_trie *trie = ctx->trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
838 uoff_t node_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
839 int ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
840
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
841 if (ctx->trie->root.next_uid == 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
842 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
843
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
844 t_push();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
845 ret = squat_write_node(ctx, &ctx->trie->root, &node_offset, 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
846 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
847 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
848 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
849
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
850 trie->hdr.root_offset = node_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
851 trie->hdr.root_unused_uids = trie->root.unused_uids;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
852 trie->hdr.root_next_uid = trie->root.next_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
853 trie->hdr.root_uidlist_idx = trie->root.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
854 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
855 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
856
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
857 static struct squat_trie_iterate_context *
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
858 squat_trie_iterate_uidlist_init(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
859 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
860 struct squat_trie_iterate_context *ctx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
861
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
862 ctx = i_new(struct squat_trie_iterate_context, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
863 ctx->trie = trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
864 ctx->cur.node = &trie->root;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
865 i_array_init(&ctx->parents, MAX_FULL_LEN*2);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
866 return ctx;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
869 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
870 squat_trie_iterate_uidlist_deinit(struct squat_trie_iterate_context *ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
871 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
872 int ret = ctx->failed ? -1 : 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
873
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
874 array_free(&ctx->parents);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
875 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
876 return ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
877 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
878
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
879 static struct squat_node *
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
880 squat_trie_iterate_uidlist_first(struct squat_trie_iterate_context *ctx)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
882 struct squat_node *node = ctx->cur.node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
883 int level;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
885 if (UIDLIST_IS_SINGLETON(node->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
886 /* no uidlists */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
887 i_assert(node == &ctx->trie->root);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
888 return NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
889 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
890
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
891 if (node->children_not_mapped) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
892 level = array_count(&ctx->parents);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
893
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
894 if (node_read_children(ctx->trie, node, level) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
895 ctx->failed = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
896 return NULL;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
899 return node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
900 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
901
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
902 static struct squat_node *
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
903 squat_trie_iterate_uidlist_next(struct squat_trie_iterate_context *ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
904 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
905 struct squat_trie_iterate_node *iter_nodes;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
906 struct squat_node *node = ctx->cur.node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
907 struct squat_node *children;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
908 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
909
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
910 /* return our children first */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
911 children = NODE_CHILDREN_NODES(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
912 for (; ctx->cur.idx < node->child_count; ctx->cur.idx++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
913 if (!UIDLIST_IS_SINGLETON(children[ctx->cur.idx].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
914 return &children[ctx->cur.idx++];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
915 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
916
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
917 ctx->cur.idx = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
918 for (;;) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
919 /* next start iterating our childrens' children */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
920 while (ctx->cur.idx < node->child_count) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
921 uint32_t list_idx =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
922 children[ctx->cur.idx++].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
923
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
924 if (UIDLIST_IS_SINGLETON(list_idx))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
925 continue;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
926
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
927 array_append(&ctx->parents, &ctx->cur, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
928 ctx->cur.node = &children[ctx->cur.idx-1];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
929 ctx->cur.idx = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
930 if (squat_trie_iterate_uidlist_first(ctx) == NULL)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
931 return NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
932 return squat_trie_iterate_uidlist_next(ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
933 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
934
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
935 /* no more children. go to next sibling's children */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
936 iter_nodes = array_get_modifiable(&ctx->parents, &count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
937 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
938 return NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
939
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
940 ctx->cur = iter_nodes[count-1];
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
941 array_delete(&ctx->parents, count-1, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
942
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
943 node = ctx->cur.node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
944 children = NODE_CHILDREN_NODES(node);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
946 }
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 static int squat_trie_renumber_uidlists(struct squat_trie *trie, bool finish)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
949 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
950 struct squat_trie_iterate_context *iter;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
951 struct squat_node *node;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
952 struct squat_uidlist *uidlist = trie->uidlist;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
953 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
954 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
955 uint32_t new_uid_list_idx, max_count=0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
956 int ret = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
957
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
958 if ((ret = squat_uidlist_rebuild_init(uidlist, finish, &ctx)) <= 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
959 return ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
960
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
961 i_array_init(&uids, 1024);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
962 iter = squat_trie_iterate_uidlist_init(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
963 node = squat_trie_iterate_uidlist_first(iter);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
964 new_uid_list_idx = 0x100;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
965 while (node != NULL) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
966 array_clear(&uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
967 if (squat_uidlist_get(uidlist, node->uid_list_idx, &uids) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
968 ret = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
969 break;
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 max_count = I_MAX(max_count, array_count(&uids));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
972 squat_uidlist_rebuild_next(ctx, &uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
973 node->uid_list_idx = new_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
974 new_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
975
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
976 node = squat_trie_iterate_uidlist_next(iter);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
977 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
978 squat_trie_iterate_uidlist_deinit(iter);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
979 array_free(&uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
980
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
981 return squat_uidlist_rebuild_finish(ctx, ret < 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
982 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
983
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
984 static int squat_trie_map_header(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
985 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
986 if (trie->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
987 /* newly created file */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
988 squat_trie_header_init(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
989 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
990 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
991 i_assert(trie->fd != -1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
992
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
993 if (trie->mmap_size != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
994 if (munmap(trie->mmap_base, trie->mmap_size) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
995 i_error("munmap(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
996 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
997
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
998 trie->mmap_size = trie->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
999 trie->mmap_base = mmap(NULL, trie->mmap_size, 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
1000 MAP_SHARED, trie->fd, 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1001 if (trie->mmap_base == MAP_FAILED) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1002 trie->mmap_base = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1003 trie->mmap_size = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1004 i_error("mmap(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1005 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1006 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1007 memcpy(&trie->hdr, trie->mmap_base, sizeof(trie->hdr));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1008
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1009 if (trie->hdr.root_offset == 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1010 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1011 if (trie->hdr.version != SQUAT_TRIE_VERSION ||
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1012 trie->hdr.uidvalidity != trie->uidvalidity) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1013 squat_trie_delete(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1014 squat_trie_close(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1015 squat_trie_header_init(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1016 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1017 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1018 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1019 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1020
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1021 static int squat_trie_map(struct squat_trie *trie)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1022 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1023 struct file_lock *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
1024 bool changed;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1025 int ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1026
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1027 if (trie->fd != -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1028 if (squat_trie_lock(trie, F_RDLCK, &file_lock) <= 0)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1029 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
1030 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1031
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1032 ret = squat_trie_map_header(trie);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1033 changed = trie->root.children.offset != trie->hdr.root_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1034
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1035 if (changed || trie->hdr.root_offset == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1036 memset(&trie->root, 0, sizeof(trie->root));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1037 trie->root.want_sequential = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1038 trie->root.unused_uids = trie->hdr.root_unused_uids;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1039 trie->root.next_uid = trie->hdr.root_next_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1040 trie->root.uid_list_idx = trie->hdr.root_uidlist_idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1041 trie->root.children.offset = trie->hdr.root_offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1042
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1043 if (trie->hdr.root_offset == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1044 trie->unmapped_child_count = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1045 trie->root.children_not_mapped = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1046 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1047 trie->unmapped_child_count = 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1048 trie->root.children_not_mapped = TRUE;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1049 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1050 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1051
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1052 if (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
1053 file_unlock(&file_lock);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1054 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
1055 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1056
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1057 return trie->hdr.root_offset == 0 || !changed ? 0 :
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1058 node_read_children(trie, &trie->root, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1059 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1060
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1061 int squat_trie_build_init(struct squat_trie *trie, uint32_t *last_uid_r,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1062 struct squat_trie_build_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
1063 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1064 struct squat_trie_build_context *ctx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1065
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1066 if (trie->fd == -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1067 trie->fd = open(trie->path, O_RDWR | O_CREAT, 0600);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1068 if (trie->fd == -1) {
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("creat(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1070 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1071 }
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1072 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1073
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1074 /* uidlist locks building */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1075 if (squat_uidlist_build_init(trie->uidlist) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1076 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1077
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1078 if (squat_trie_map(trie) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1079 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1080
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1081 ctx = i_new(struct squat_trie_build_context, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1082 ctx->trie = trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1083 ctx->first_uid = trie->root.next_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1084
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1085 *last_uid_r = I_MAX(trie->root.next_uid/2, 1) - 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1086 *ctx_r = ctx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1087 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1088 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1089
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1090 static int squat_trie_write(struct squat_trie_build_context *ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1091 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1092 struct squat_trie *trie = ctx->trie;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1093 struct file_lock *file_lock;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1094 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
1095 const char *path;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1096 int fd = -1, ret = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1097
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1098 if ((trie->hdr.used_file_size > sizeof(trie->hdr) &&
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1099 trie->unmapped_child_count < trie->hdr.node_count/4) || 1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1100 /* we might as well recreate the file */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1101 ctx->compress_nodes = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1102
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1103 path = t_strconcat(trie->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
1104 fd = open(path, O_RDWR | O_CREAT, 0600);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1105 if (fd == -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1106 i_error("creat(%s) failed: %m", path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1107 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1108 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1109 output = o_stream_create_fd(fd, 0, FALSE);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1110 o_stream_cork(output);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1111 o_stream_send(output, &trie->hdr, sizeof(trie->hdr));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1112 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
1113 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1114 /* we need to lock only the header update */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1115 if (squat_trie_lock(trie, F_WRLCK, &file_lock) <= 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1116 return -1;
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 path = trie->path;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1119 ctx->compress_nodes =
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1120 trie->hdr.used_file_size == sizeof(trie->hdr);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1121 output = o_stream_create_fd(trie->fd, 0, FALSE);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1122 o_stream_cork(output);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1123
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1124 if (trie->hdr.used_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
1125 o_stream_send(output, &trie->hdr, sizeof(trie->hdr));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1126 else
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1127 o_stream_seek(output, trie->hdr.used_file_size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1128 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1129
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1130 ctx->output = output;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1131 ret = squat_write_nodes(ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1132 ctx->output = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1133
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1134 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
1135 trie->hdr.used_file_size = output->offset;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1136 o_stream_seek(output, 0);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1137 o_stream_send(output, &trie->hdr, sizeof(trie->hdr));
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1138 o_stream_flush(output);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1139 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1140 if (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
1141 file_unlock(&file_lock);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1142
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1143 if (output->last_failed_errno != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1144 errno = 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
1145 i_error("write() to %s failed: %m", path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1146 ret = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1147 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1148 o_stream_unref(&output);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1149 if (fd != -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1150 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
1151 if (close(fd) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1152 i_error("close(%s) failed: %m", path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1153 } else if (rename(path, trie->path) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1154 i_error("rename(%s, %s) failed: %m", path, trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1155 ret = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1156 }
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 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
1159 if (unlink(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
1160 i_error("unlink(%s) failed: %m", path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1161 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1162 if (close(trie->fd) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1163 i_error("close(%s) failed: %m", trie->path);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1164 trie->fd = fd;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1165 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1166 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1167 return ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1168 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1169
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1170 int squat_trie_build_deinit(struct squat_trie_build_context **_ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1171 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1172 struct squat_trie_build_context *ctx = *_ctx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1173 bool compress;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1174 int ret;
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 *_ctx = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1177
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1178 compress = (ctx->trie->root.next_uid - ctx->first_uid) > 10;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1179
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1180 ret = squat_uidlist_build_deinit(ctx->trie->uidlist);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1181 if (squat_trie_renumber_uidlists(ctx->trie, compress) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1182 ret = -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1183 else
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1184 ret = squat_trie_write(ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1185
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1186 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
1187 return ret;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1188 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1189
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1190 int squat_trie_get_last_uid(struct squat_trie *trie, uint32_t *last_uid_r)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1191 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1192 if (trie->fd == -1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1193 if (squat_trie_open(trie) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1194 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1195 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1196
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1197 *last_uid_r = I_MAX(trie->root.next_uid/2, 1) - 1;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198 return 0;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1200
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1201 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
1202 squat_trie_lookup_data(struct squat_trie *trie, const unsigned char *data,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1203 unsigned int size, ARRAY_TYPE(seq_range) *uids)
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 struct squat_node *node = &trie->root;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1206 unsigned char *chars;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1207 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
1208 int level = 0;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1210 array_clear(uids);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1211
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1212 for (;;) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1213 if (node->children_not_mapped) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1214 if (node_read_children(trie, node, level) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1215 return -1;
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 if (node->leaf_string_length != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1218 unsigned int str_len = node->leaf_string_length;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1219 const unsigned char *str;
5414
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
1220
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1221 if (str_len > sizeof(node->children.static_leaf_string))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1222 str = node->children.leaf_string;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1223 else
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1224 str = node->children.static_leaf_string;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1226 if (size > str_len || memcmp(data, str, size) != 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1227 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1228
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1229 /* match */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1230 break;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1231 }
4898
07a038b57946 Optimization.
Timo Sirainen <tss@iki.fi>
parents: 4897
diff changeset
1232
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1233 if (size == 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1234 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1235 level++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1236
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1237 if (node->have_sequential) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1238 if (*data < SEQUENTIAL_COUNT) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1239 idx = *data;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1240 goto found;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1241 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1242 idx = SEQUENTIAL_COUNT;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1243 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1244 idx = 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1245 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1246 chars = NODE_CHILDREN_CHARS(node);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1247 for (; idx < node->child_count; idx++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1248 if (chars[idx] == *data)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1249 goto found;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1250 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1251 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1252 found:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1253 /* follow to children */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1254 if (level == 1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1255 /* root level, add all UIDs */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1256 if (squat_uidlist_get_seqrange(trie->uidlist,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1257 node->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
1258 uids) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1259 return -1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1260 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1261 if (squat_uidlist_filter(trie->uidlist,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1262 node->uid_list_idx, uids) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1263 return -1;
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 data++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1266 size--;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1267 node = NODE_CHILDREN_NODES(node) + idx;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1268 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1269
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1270 if (squat_uidlist_filter(trie->uidlist, node->uid_list_idx, uids) < 0)
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1271 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
1272 return 1;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1273 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1274
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1275 static void
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1276 squat_trie_filter_type(enum squat_index_type type,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1277 const ARRAY_TYPE(seq_range) *src,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1278 ARRAY_TYPE(seq_range) *dest)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1279 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1280 const struct seq_range *src_range;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1281 struct seq_range new_range;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1282 unsigned int i, count, mask;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1283 uint32_t next_seq, uid;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1284
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1285 array_clear(dest);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1286 src_range = array_get(src, &count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1287 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
1288 return;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1289
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1290 if ((type & SQUAT_INDEX_TYPE_HEADER) != 0 &&
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1291 (type & SQUAT_INDEX_TYPE_BODY) != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1292 /* everything is fine, just fix the UIDs */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1293 new_range.seq1 = src_range[0].seq1 / 2;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1294 new_range.seq2 = src_range[0].seq2 / 2;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1295 for (i = 1; i < count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1296 next_seq = src_range[i].seq1 / 2;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1297 if (next_seq == new_range.seq2 + 1) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1298 /* we can continue the previous range */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1299 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1300 array_append(dest, &new_range, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1301 new_range.seq1 = src_range[i].seq1 / 2;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1302 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1303 new_range.seq2 = src_range[i].seq2 / 2;
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1304 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1305 array_append(dest, &new_range, 1);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1306 return;
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
1307 }
ae2114f11a0e Memory leak fixes. Also when building a large mailbox flush once in a while
Timo Sirainen <tss@iki.fi>
parents: 4883
diff changeset
1308
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1309 /* we'll have to drop either header or body UIDs */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1310 mask = (type & SQUAT_INDEX_TYPE_HEADER) != 0 ? 0 : 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1311 for (i = 0; i < count; i++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1312 for (uid = src_range[i].seq1; uid <= src_range[i].seq2; uid++) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1313 if ((uid & 1) == mask)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1314 seq_range_array_add(dest, 0, uid/2);
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1315 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1316 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1317 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1318
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1319 int squat_trie_lookup(struct squat_trie *trie, const char *str,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1320 enum squat_index_type type,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1321 ARRAY_TYPE(seq_range) *definite_uids,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1322 ARRAY_TYPE(seq_range) *maybe_uids)
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1323 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1324 ARRAY_TYPE(seq_range) tmp_uids, tmp_uids2;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1325 unsigned char *data, *block;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1326 unsigned int size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1327 bool first;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1328 int ret = 0;
4855
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1329
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1330 t_push();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1331 size = strlen(str);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1332 data = t_malloc(size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1333 memcpy(data, str, size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1334 data = squat_data_normalize(trie, data, size);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1335 t_array_init(&tmp_uids, 128);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1336 t_array_init(&tmp_uids2, 128);
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1337
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1338 if (MAX_FULL_LEN > MAX_PARTIAL_LEN || size <= MAX_PARTIAL_LEN) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1339 ret = squat_trie_lookup_data(trie, data, size, &tmp_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1340 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
1341 squat_trie_filter_type(type, &tmp_uids, definite_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1342 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1343 array_clear(definite_uids);
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1344 }
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1345
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1346 if (size <= MAX_PARTIAL_LEN || MAX_PARTIAL_LEN == 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1347 /* we have the result */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1348 array_clear(maybe_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1349 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1350 first = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1351 do {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1352 block = data + size - MAX_PARTIAL_LEN;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1353 ret = squat_trie_lookup_data(trie, block,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1354 MAX_PARTIAL_LEN,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1355 &tmp_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1356 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
1357 array_clear(maybe_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1358 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1359 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1360 if (first) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1361 squat_trie_filter_type(type, &tmp_uids,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1362 maybe_uids);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1363 first = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1364 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1365 squat_trie_filter_type(type, &tmp_uids,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1366 &tmp_uids2);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1367 seq_range_array_remove_invert_range(maybe_uids,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1368 &tmp_uids2);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1369 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1370 } while (--size >= MAX_PARTIAL_LEN);
4878
88a91d9a867b Fixes. Should be pretty much working now.
Timo Sirainen <tss@iki.fi>
parents: 4855
diff changeset
1371 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1372 t_pop();
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1373 return ret < 0 ? -1 :
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1374 (array_count(maybe_uids) > 0 ||
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1375 array_count(definite_uids) > 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
1376 }
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1377
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6414
diff changeset
1378 struct squat_uidlist *squat_trie_get_uidlist(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
1379 {
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1380 return trie->uidlist;
5bc593f1a8f6 Added "squat" full text search indexer backend. Its name and basic ideas
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1381 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1382
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1383 size_t squat_trie_mem_used(struct squat_trie *trie, unsigned int *count_r)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1384 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1385 *count_r = trie->hdr.node_count;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1386 return trie->node_alloc_size;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1387 }