web: Create man page with groff rather than man2html.
[osl.git] / osl.h.in
1 /*
2 * Copyright (C) 2007-2009 Andre Noll <maan@tuebingen.mpg.de>
3 *
4 * Licensed under the GPL v2. For licencing details see COPYING.
5 */
6
7 /** \file osl.h User interface for the object storage layer. */
8
9 #include <sys/mman.h>
10 #include <inttypes.h>
11
12 /** Export all declarations in this file. */
13 #pragma GCC visibility push(default)
14
15 /** Describes an object of the object storage layer (osl) */
16 struct osl_object {
17 /** Pointer to the data of the object. */
18 void *data;
19 /** The object's size. */
20 size_t size;
21 };
22
23 /** Flags that change the internal handling of osl tables. */
24 enum osl_table_flags {
25 /** This table will have many rows. */
26 OSL_LARGE_TABLE = 1
27 };
28
29 /** The three different types of storage for an osl column */
30 enum osl_storage_type {
31 /**
32 * All data for this column is stored in one file which gets mmapped by
33 * osl_open_table(). This is suitable for columns that do not hold much
34 * data.
35 */
36 OSL_MAPPED_STORAGE,
37 /**
38 * Each entry is stored on disk and is loaded on demand by
39 * open_disk_object(). This is the preferable storage type for large
40 * objects that need not be in memory all the time.
41 */
42 OSL_DISK_STORAGE,
43 /**
44 * Objects for columns of this type are volatile: They are only stored
45 * in memory and are discarded when the table is closed.
46 */
47 OSL_NO_STORAGE
48 };
49
50 /**
51 * Additional per-column flags
52 */
53 enum osl_storage_flags {
54 /**
55 * Build an rbtree for this column. This is only possible if the
56 * storage type of the column is either \a OSL_MAPPED_STORAGE or \a
57 * OSL_NO_STORAGE. In order to lookup objects in the table by using \a
58 * osl_get_row(), the lookup column must have an associated rbtree.
59 *
60 * \sa osl_storage_type, osl_get_row()
61 */
62 OSL_RBTREE = 1,
63 /** The data for this column will have constant size. */
64 OSL_FIXED_SIZE = 2,
65 /** All values are different. Must be set if \p OSL_RBTREE is set. */
66 OSL_UNIQUE = 4,
67 /** Do not free the data for this column (\p OSL_NO_STORAGE). */
68 OSL_DONT_FREE = 8
69 };
70
71 /** Opaque osl table structure. */
72 struct osl_table;
73 /** Opaque osl row structure. */
74 struct osl_row;
75
76 /**
77 * In order to build up an rbtree a compare function for the objects must be
78 * provided. This function takes pointers to the two objects to be compared. It
79 * must return -1, zero, or 1, if the first argument is considered to be
80 * respectively less than, equal to, or greater than the second. If two members
81 * compare as equal, their order in the rbtree is undefined.
82 */
83 typedef int osl_compare_func(const struct osl_object *obj1,
84 const struct osl_object *obj2);
85
86 /**
87 * The osl_rbreee_loop functions take a function pointer of this type. For each
88 * node in the rbtree, the given function is called.
89 *
90 * \sa osl_rbtree_loop(), osl_rbtree_loop_reverse().
91 */
92 typedef int osl_rbtree_loop_func(struct osl_row *row, void *data);
93
94 /**
95 * Describes one column of a osl table.
96 */
97 struct osl_column_description {
98 /** One of the three possible types of storage, \sa osl_storage_type. */
99 uint16_t storage_type;
100 /** Specifies further properties of the column, \sa osl_storage_flags. */
101 uint16_t storage_flags;
102 /**
103 * The column name determines the name of the directory where all data
104 * for this column will be stored. Its hash is stored in the table
105 * header. This field is ignored if the storage type is \a NO_STORAGE.
106 */
107 char *name;
108 /**
109 * For columns with an associated rbtree, this must point to a function
110 * that compares the values of two objects, either a built-in function
111 * or a function defined by the application may be supplied. This
112 * field is ignored if the column does not have an associated rbtree.
113 *
114 * \sa osl_storage_flags, osl_compare_func
115 */
116 osl_compare_func *compare_function;
117 /**
118 * If the \a OSL_FIXED_SIZE flag is set for this column, this value
119 * describes the number of bytes of each object of this column. It is
120 * ignored, if \a OSL_FIXED_SIZE is not set.
121 */
122 uint32_t data_size;
123 };
124
125 /**
126 * Describes one osl table.
127 */
128 struct osl_table_description {
129 /**
130 * The directory which contains all files of this table. This may be
131 * either relative to the cwd or an absolute path.
132 */
133 const char *dir;
134 /**
135 * The table name. A subdirectory of \a dir called \a name is created
136 * at table creation time. It must be a valid name for a subdirectory.
137 * In particular, no slashes are allowed for \a name.
138 */
139 const char *name;
140 /** The number of columns of this table. */
141 uint16_t num_columns;
142 /** Further table-wide information, \sa osl_table_flags. */
143 uint8_t flags;
144 /** The array describing the individual columns of the table. */
145 struct osl_column_description *column_descriptions;
146 };
147
148 /** Flags to be passed to \a osl_close_table(). */
149 enum osl_close_flags {
150 /**
151 * The table header contains a "dirty" flag which indicates whether the
152 * table is currently held open by another process. The \a
153 * OSL_MARK_CLEAN flag instructs libosl to clear the dirty flag when
154 * the table is closed.
155 */
156 OSL_MARK_CLEAN = 1,
157 /**
158 * If the table contains columns of type \a OSL_NO_STORAGE and this
159 * flag is passed to osl_close_table(), free(3) is called for each
160 * object of each column of type \a OSL_NO_STORAGE.
161 */
162 OSL_FREE_VOLATILE = 2
163 };
164
165 /**
166 * Create a new osl table.
167 *
168 * \param desc Pointer to the table description.
169 *
170 * \return Standard.
171 */
172 int osl_create_table(const struct osl_table_description *desc);
173
174 /**
175 * Open an osl table.
176 *
177 * Each osl table must be opened before its data can be accessed.
178 *
179 * \param desc Describes the table to be opened.
180 * \param result Contains a pointer to the open table on success.
181 *
182 * The table description given by \a desc should coincide with the
183 * description used at creation time.
184 *
185 * \return Standard.
186 */
187 int osl_open_table(const struct osl_table_description *desc,
188 struct osl_table **result);
189
190 /**
191 * Close an osl table.
192 *
193 * \param t Pointer to the table to be closed.
194 * \param flags Options for what should be cleaned up.
195 *
196 * If osl_open_table() succeeds, the resulting table pointer must later be
197 * passed to this function in order to flush all changes to the file system and
198 * to free the resources that were allocated by osl_open_table().
199 *
200 * \return Standard.
201 *
202 * \sa osl_open_table(), unmap_table().
203 */
204 int osl_close_table(struct osl_table *t, enum osl_close_flags flags);
205
206 /**
207 * Get the row that contains the given object.
208 *
209 * \param t Pointer to an open osl table.
210 * \param col_num The number of the column to be searched.
211 * \param obj The object to be looked up.
212 * \param result Points to the row containing \a obj.
213 *
214 * Lookup \a obj in \a t and return the row containing \a obj. The column
215 * specified by \a col_num must have an associated rbtree.
216 *
217 * \return Standard. \a result is set to \p NULL if and only if the function
218 * returns negative.
219 *
220 * \sa osl_storage_flags
221 */
222 int osl_get_row(const struct osl_table *t, unsigned col_num,
223 const struct osl_object *obj, struct osl_row **result);
224
225 /**
226 * Retrieve an object identified by row and column.
227 *
228 * \param t Pointer to an open osl table.
229 * \param row Pointer to the row.
230 * \param col_num The column number.
231 * \param object The result pointer.
232 *
233 * The column determined by \a col_num must be of type \p OSL_MAPPED_STORAGE
234 * or \p OSL_NO_STORAGE, i.e. no disk storage objects may be retrieved by this
235 * function.
236 *
237 * \return Standard.
238 *
239 * \sa osl_storage_type, osl_open_disk_object().
240 */
241 int osl_get_object(const struct osl_table *t, const struct osl_row *row,
242 unsigned col_num, struct osl_object *object);
243
244 /**
245 * Retrieve an object of type \p OSL_DISK_STORAGE by row and column.
246 *
247 * \param t Pointer to an open osl table.
248 * \param r Pointer to the row containing the object.
249 * \param col_num The column number.
250 * \param obj Points to the result upon successful return.
251 *
252 * For columns of type \p OSL_DISK_STORAGE, this function must be used to
253 * retrieve one of its containing objects. Afterwards, osl_close_disk_object()
254 * must be called in order to deallocate the resources.
255 *
256 * \return Standard.
257 *
258 * \sa osl_get_object(), osl_storage_type, osl_close_disk_object().
259 */
260 int osl_open_disk_object(const struct osl_table *t,
261 const struct osl_row *r, unsigned col_num, struct osl_object *obj);
262
263 /**
264 * Free resources that were allocated during osl_open_disk_object().
265 *
266 * \param obj Pointer to the object previously returned by open_disk_object().
267 *
268 * \return The return value of the underlying call to munmap().
269 *
270 * \sa munmap(2).
271 */
272 int osl_close_disk_object(struct osl_object *obj);
273
274 /**
275 * Add a new row to an osl table and retrieve this row.
276 *
277 * \param t Pointer to an open osl table.
278 * \param objects Array of objects to be added.
279 * \param row Result pointer.
280 *
281 * The \a objects parameter must point to an array containing one object per
282 * column. The order of the objects in the array is given by the table
283 * description of \a table. Several sanity checks are performed during object
284 * insertion and the function returns without modifying the table if any of
285 * these tests fail. In fact, it is atomic in the sense that it either
286 * succeeds or leaves the table unchanged (i.e. either all or none of the
287 * objects are added to the table).
288 *
289 * It is considered an error if an object is added to a column with associated
290 * rbtree if this object is equal to an object already contained in that column
291 * (i.e. the compare function for the column's rbtree returns zero).
292 *
293 * \return Standard.
294 *
295 * \sa struct osl_table_description, osl_compare_func, osl_add_row().
296 */
297 int osl_add_and_get_row(struct osl_table *t, struct osl_object *objects,
298 struct osl_row **row);
299
300
301 /**
302 * Add a new row to an osl table.
303 *
304 * \param t Same meaning as osl_add_and_get_row().
305 * \param objects Same meaning as osl_add_and_get_row().
306 *
307 * \return The return value of the underlying call to osl_add_and_get_row().
308 *
309 * This is equivalent to osl_add_and_get_row(t, objects, NULL).
310 */
311 int osl_add_row(struct osl_table *t, struct osl_object *objects);
312
313 /**
314 * Delete a row from an osl table.
315 *
316 * \param t Pointer to an open osl table.
317 * \param row Pointer to the row to delete.
318 *
319 * This removes all disk storage objects, removes all rbtree nodes, and frees
320 * all volatile objects belonging to the given row. For mapped columns, the
321 * data is merely marked invalid and may be pruned from time to time by
322 * osl_fsck.
323 *
324 * \return Standard.
325 */
326 int osl_del_row(struct osl_table *t, struct osl_row *row);
327
328 /**
329 * Loop over all nodes in an rbtree.
330 *
331 * \param t Pointer to an open osl table.
332 * \param col_num The column to use for iterating over the elements.
333 * \param private_data Pointer that gets passed to \a func.
334 * \param func The function to be called for each node in the rbtree.
335 *
336 * This function does an in-order walk of the rbtree associated with \a
337 * col_num. It is an error if the \p OSL_RBTREE flag is not set for this
338 * column. For each node in the rbtree, the given function \a func is called
339 * with two pointers as arguments: The first osl_row* argument points to the
340 * row that contains the object corresponding to the rbtree node currently
341 * traversed, and the \a private_data pointer is passed verbatim to \a func as the
342 * second argument. The loop terminates either if \a func returns a negative
343 * value, or if all nodes of the tree have been visited.
344 *
345 *
346 * \return Standard. If the termination of the loop was caused by \a func
347 * returning a negative value, \p -E_OSL_LOOP is returned.
348 *
349 * \sa osl_storage_flags, osl_rbtree_loop_reverse(), osl_compare_func.
350 */
351 int osl_rbtree_loop(const struct osl_table *t, unsigned col_num,
352 void *private_data, osl_rbtree_loop_func *func);
353
354 /**
355 * Loop over all nodes in an rbtree in reverse order.
356 *
357 * \param t Identical meaning as in \p osl_rbtree_loop().
358 * \param col_num Identical meaning as in \p osl_rbtree_loop().
359 * \param private_data Identical meaning as in \p osl_rbtree_loop().
360 * \param func Identical meaning as in \p osl_rbtree_loop().
361 *
362 * This function is identical to \p osl_rbtree_loop(), the only difference
363 * is that the tree is walked in reverse order.
364 *
365 * \return The same return value as \p osl_rbtree_loop().
366 *
367 * \sa osl_rbtree_loop().
368 */
369 int osl_rbtree_loop_reverse(const struct osl_table *t, unsigned col_num,
370 void *private_data, osl_rbtree_loop_func *func);
371
372 /**
373 * Change an object in an osl table.
374 *
375 * \param t Pointer to an open osl table.
376 * \param r Pointer to the row containing the object to be updated.
377 * \param col_num Number of the column containing the object to be updated.
378 * \param obj Pointer to the replacement object.
379 *
380 * This function gets rid of all references to the old object. This includes
381 * removal of the rbtree node in case there is an rbtree associated with \a
382 * col_num. It then inserts \a obj into the table and the rbtree if necessary.
383 *
384 * If the \p OSL_RBTREE flag is set for \a col_num, you \b MUST call this
385 * function in order to change the contents of an object, even for volatile or
386 * mapped columns of constant size (which may be updated directly if \p
387 * OSL_RBTREE is not set). Otherwise the rbtree might become corrupt.
388 *
389 * \return Standard
390 */
391 int osl_update_object(struct osl_table *t, const struct osl_row *r,
392 unsigned col_num, struct osl_object *obj);
393
394 /**
395 * Get the number of rows of the given table.
396 *
397 * \param t Pointer to an open osl table.
398 * \param num_rows Result is returned here.
399 *
400 * The number of rows returned via \a num_rows excluding any invalid rows.
401 *
402 * \return Positive on success, \p -E_OSL_BAD_TABLE if \a t is \p NULL.
403 */
404 int osl_get_num_rows(const struct osl_table *t, unsigned *num_rows);
405
406
407 /**
408 * Get the row corresponding to the smallest rbtree node of a column.
409 *
410 * \param t An open rbtree table.
411 * \param col_num The number of the rbtree column.
412 * \param result A pointer to the first row is returned here.
413 *
414 * The rbtree node of the smallest object (with respect to the corresponding
415 * compare function) is selected and the row containing this object is
416 * returned. It is an error if \a col_num refers to a column without an
417 * associated rbtree.
418 *
419 * \return Standard.
420 *
421 * \sa osl_get_nth_row(), osl_rbtree_last_row().
422 */
423 int osl_rbtree_first_row(const struct osl_table *t, unsigned col_num,
424 struct osl_row **result);
425
426 /**
427 * Get the row corresponding to the greatest rbtree node of a column.
428 *
429 * \param t The same meaning as in \p osl_rbtree_first_row().
430 * \param col_num The same meaning as in \p osl_rbtree_first_row().
431 * \param result The same meaning as in \p osl_rbtree_first_row().
432 *
433 * This function works just like osl_rbtree_first_row(), the only difference
434 * is that the row containing the greatest rather than the smallest object is
435 * returned.
436 *
437 * \return Standard.
438 *
439 * \sa osl_get_nth_row(), osl_rbtree_first_row().
440 */
441 int osl_rbtree_last_row(const struct osl_table *t, unsigned col_num,
442 struct osl_row **result);
443
444 /**
445 * Get the row with n-th greatest value.
446 *
447 * \param t Pointer to an open osl table.
448 * \param col_num The column number.
449 * \param n The rank of the desired row.
450 * \param result Row is returned here.
451 *
452 * Retrieve the n-th order statistic with respect to the compare function
453 * of the rbtree column \a col_num. In other words, get the row with
454 * \a n th greatest value in column \a col_num. It is an error if
455 * \a col_num is not a rbtree column, or if \a n is larger than the
456 * number of rows in the table.
457 *
458 * \return Standard.
459 *
460 * \sa osl_storage_flags, osl_compare_func, osl_get_row(),
461 * osl_rbtree_last_row(), osl_rbtree_first_row(), osl_get_rank().
462 */
463 int osl_get_nth_row(const struct osl_table *t, unsigned col_num,
464 unsigned n, struct osl_row **result);
465
466 /**
467 * Get the rank of a row.
468 *
469 * \param t An open osl table.
470 * \param r The row to get the rank of.
471 * \param col_num The number of an rbtree column.
472 * \param rank Result pointer.
473 *
474 * The rank is, by definition, the position of the row in the linear order
475 * determined by an in-order tree walk of the rbtree associated with column
476 * number \a col_num of \a table.
477 *
478 * \return Standard.
479 *
480 * \sa osl_get_nth_row().
481 */
482 int osl_get_rank(const struct osl_table *t, struct osl_row *r,
483 unsigned col_num, unsigned *rank);
484
485 /**
486 * Get a string describing the error code passed in the argument.
487 *
488 * \param num The error code.
489 *
490 * This works just like strerror(3). The given number must be an osl error
491 * code. The result must not be freed by the caller.
492 *
493 * \return The error text corresponding to an osl error code.
494 */
495 const char *osl_strerror(int num);
496
497 #pragma GCC visibility pop