summaryrefslogtreecommitdiff
path: root/ctdb/common/db_hash.h
blob: 67e2b85796198a6f918ccca2584c8f7dd7a19e43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
   Using tdb as a hash table

   Copyright (C) Amitay Isaacs  2015

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __CTDB_DB_HASH_H__
#define __CTDB_DB_HASH_H__

#include <talloc.h>
#include <tdb.h>

/**
 * @file db_hash.h
 *
 * @brief Use tdb database as a hash table
 *
 * This uses in-memory tdb databases to create a fixed sized hash table.
 */

/**
 * @brief Hash type to indicate the hashing function to use.
 *
 * DB_HASH_SIMPLE uses default hashing function
 * DB_HASH_COMPLEX uses jenkins hashing function
 */
enum db_hash_type {
	DB_HASH_SIMPLE,
	DB_HASH_COMPLEX,
};

/**
 * @brief Parser callback function called when fetching a record
 *
 * This function is called when fetching a record. This function should
 * not modify key and data arguments.
 *
 * The function should return 0 on success and errno on error.
 */
typedef int (*db_hash_record_parser_fn)(uint8_t *keybuf, size_t keylen,
					uint8_t *databuf, size_t datalen,
					void *private_data);

/**
 * @brief Abstract structure representing tdb hash table
 */
struct db_hash_context;

/**
 * @brief Initialize tdb hash table
 *
 * This returns a new tdb hash table context which is a talloc context.  Freeing
 * this context will free all the memory associated with the hash table.
 *
 * @param[in] mem_ctx Talloc memory context
 * @param[in] name The name for the hash table
 * @param[in] hash_size The size of the hash table
 * @param[in] type The type of hashing function to use
 * @param[out] result The new db_hash_context structure
 * @return 0 on success, errno on failure
 */
int db_hash_init(TALLOC_CTX *mem_ctx, const char *name, int hash_size,
		 enum db_hash_type type, struct db_hash_context **result);

/**
 * @brief Insert a record into the hash table
 *
 * The key and data can be any binary data.  Insert only if the record does not
 * exist.  If the record already exists, return error.
 *
 * @param[in] dh The tdb hash table context
 * @param[in] keybuf The key buffer
 * @param[in] keylen The key length
 * @param[in] databuf The data buffer
 * @param[in] datalen The data length
 * @return 0 on success, errno on failure
 */
int db_hash_insert(struct db_hash_context *dh, uint8_t *keybuf, size_t keylen,
		   uint8_t *databuf, size_t datalen);

/**
 * @brief Add a record into the hash table
 *
 * The key and data can be any binary data.  If the record does not exist,
 * insert the record.  If the record already exists, replace the record.
 *
 * @param[in] dh The tdb hash table context
 * @param[in] keybuf The key buffer
 * @param[in] keylen The key length
 * @param[in] databuf The data buffer
 * @param[in] datalen The data length
 * @return 0 on success, errno on failure
 */
int db_hash_add(struct db_hash_context *dh, uint8_t *keybuf, size_t keylen,
		uint8_t *databuf, size_t datalen); 
/**
 * @brief Delete a record from the hash table
 *
 * @param[in] dh The tdb hash table context
 * @param[in] keybuf The key buffer
 * @param[in] keylen The key length
 * @return 0 on success, errno on failure
 */
int db_hash_delete(struct db_hash_context *dh, uint8_t *keybuf, size_t keylen);

/**
 * @brief Fetch a record from the hash table
 *
 * The key and data can be any binary data.
 *
 * @param[in] dh The tdb hash table context
 * @param[in] keybuf The key buffer
 * @param[in] keylen The key length
 * @param[in] parser Function called when the matching record is found
 * @param[in] private_data Private data to parser function
 * @return 0 on success, errno on failure
 */
int db_hash_fetch(struct db_hash_context *dh, uint8_t *keybuf, size_t keylen,
		  db_hash_record_parser_fn parser, void *private_data);

/**
 * @brief Check if a record exists in the hash table
 *
 * @param[in] dh The tdb hash table context
 * @param[in] keybuf The key buffer
 * @param[in] keylen The key length
 * @return 0 if the record exists, errno on failure
 */
int db_hash_exists(struct db_hash_context *dh, uint8_t *keybuf, size_t keylen);

/**
 * @brief Traverse the database without modification
 *
 * The parser function should return non-zero value to stop traverse.
 *
 * @param[in] dh The tdb hash table context
 * @param[in] parser Function called for each record
 * @param[in] private_data Private data to parser function
 * @param[out] count Number of records traversed
 * @return 0 on success, errno on failure
 */
int db_hash_traverse(struct db_hash_context *dh,
		     db_hash_record_parser_fn parser, void *private_data,
		     int *count);

/**
 * @brief Traverse the database for modifications
 *
 * The parser function should return non-zero value to stop traverse.
 *
 * @param[in] dh The tdb hash table context
 * @param[in] parser Function called for each record
 * @param[in] private_data Private data to parser function
 * @param[out] count Number of records traversed
 * @return 0 on success, errno on failure
 */
int db_hash_traverse_update(struct db_hash_context *dh,
			    db_hash_record_parser_fn parser,
			    void *private_data, int *count);

#endif /* __CTDB_DB_HASH_H__ */