c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef SQUAT_TRIE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define SQUAT_TRIE_H
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
80c1d98d3638b71e57a39cafa88b9122bf8169c6Timo Sirainen#include "file-lock.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#include "seq-range-array.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainenenum squat_index_flags {
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen SQUAT_INDEX_FLAG_MMAP_DISABLE = 0x01,
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen SQUAT_INDEX_FLAG_NFS_FLUSH = 0x02,
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen SQUAT_INDEX_FLAG_DOTLOCK_USE_EXCL = 0x04
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen};
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenenum squat_index_type {
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen SQUAT_INDEX_TYPE_HEADER = 0x01,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen SQUAT_INDEX_TYPE_BODY = 0x02
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen};
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenstruct squat_trie_build_context;
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenstruct squat_trie *
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainensquat_trie_init(const char *path, uint32_t uidvalidity,
1759b25adaa2dd3b138f1fd90726669f2613785aTimo Sirainen enum file_lock_method lock_method,
45114a7f9600d04c294f8f1051c0289c092febceTimo Sirainen enum squat_index_flags flags, mode_t mode, gid_t gid);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenvoid squat_trie_deinit(struct squat_trie **trie);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenvoid squat_trie_set_partial_len(struct squat_trie *trie, unsigned int len);
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenvoid squat_trie_set_full_len(struct squat_trie *trie, unsigned int len);
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen
d5db0fd38f7babf6b12c8bcc83dc8b5f32b71cc9nikwrtint squat_trie_open(struct squat_trie *trie);
de11cf486e0d0448537b1b5d546496ab85e7cda8Timo Sirainenint squat_trie_refresh(struct squat_trie *trie);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenint squat_trie_build_init(struct squat_trie *trie,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen struct squat_trie_build_context **ctx_r);
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen/* bodies must be added before headers */
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenint squat_trie_build_more(struct squat_trie_build_context *ctx,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen uint32_t uid, enum squat_index_type type,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen const unsigned char *data, unsigned int size);
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen/* if expunged_uids is non-NULL, they may be removed from the index if they
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen still exist. */
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainenint squat_trie_build_deinit(struct squat_trie_build_context **ctx,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const ARRAY_TYPE(seq_range) *expunged_uids)
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen ATTR_NULL(2);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenint squat_trie_get_last_uid(struct squat_trie *trie, uint32_t *last_uid_r);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen/* type specifies if we're looking at header, body or both */
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenint squat_trie_lookup(struct squat_trie *trie, const char *str,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen enum squat_index_type type,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen ARRAY_TYPE(seq_range) *definite_uids,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen ARRAY_TYPE(seq_range) *maybe_uids);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
00395881d1dbbf37178d1efc193a7e9804aaff3bTimo Sirainenstruct squat_uidlist *squat_trie_get_uidlist(struct squat_trie *trie);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainensize_t squat_trie_mem_used(struct squat_trie *trie, unsigned int *count_r);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#endif