Silence a gcc warning.
[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.
218  *
219  * \sa osl_storage_flags
220  */
221 int osl_get_row(const struct osl_table *t, unsigned col_num,
222         const struct osl_object *obj, struct osl_row **result);
223
224 /**
225  * Retrieve an object identified by row and column.
226  *
227  * \param t Pointer to an open osl table.
228  * \param row Pointer to the row.
229  * \param col_num The column number.
230  * \param object The result pointer.
231  *
232  * The column determined by \a col_num must be of type \p OSL_MAPPED_STORAGE
233  * or \p OSL_NO_STORAGE, i.e. no disk storage objects may be retrieved by this
234  * function.
235  *
236  * \return Standard.
237  *
238  * \sa osl_storage_type, osl_open_disk_object().
239  */
240 int osl_get_object(const struct osl_table *t, const struct osl_row *row,
241         unsigned col_num, struct osl_object *object);
242
243 /**
244  * Retrieve an object of type \p OSL_DISK_STORAGE by row and column.
245  *
246  * \param t Pointer to an open osl table.
247  * \param r Pointer to the row containing the object.
248  * \param col_num The column number.
249  * \param obj Points to the result upon successful return.
250  *
251  * For columns of type \p OSL_DISK_STORAGE, this function must be used to
252  * retrieve one of its containing objects. Afterwards, osl_close_disk_object()
253  * must be called in order to deallocate the resources.
254  *
255  * \return Standard.
256  *
257  * \sa osl_get_object(), osl_storage_type, osl_close_disk_object().
258  */
259 int osl_open_disk_object(const struct osl_table *t,
260         const struct osl_row *r, unsigned col_num, struct osl_object *obj);
261
262 /**
263  * Free resources that were allocated during osl_open_disk_object().
264  *
265  * \param obj Pointer to the object previously returned by open_disk_object().
266  *
267  * \return The return value of the underlying call to munmap().
268  *
269  * \sa munmap(2).
270  */
271 int osl_close_disk_object(struct osl_object *obj);
272
273 /**
274  * Add a new row to an osl table and retrieve this row.
275  *
276  * \param t Pointer to an open osl table.
277  * \param objects Array of objects to be added.
278  * \param row Result pointer.
279  *
280  * The \a objects parameter must point to an array containing one object per
281  * column.  The order of the objects in the array is given by the table
282  * description of \a table. Several sanity checks are performed during object
283  * insertion and the function returns without modifying the table if any of
284  * these tests fail.  In fact, it is atomic in the sense that it either
285  * succeeds or leaves the table unchanged (i.e. either all or none of the
286  * objects are added to the table).
287  *
288  * It is considered an error if an object is added to a column with associated
289  * rbtree if this object is equal to an object already contained in that column
290  * (i.e. the compare function for the column's rbtree returns zero).
291  *
292  * \return Standard.
293  *
294  * \sa struct osl_table_description, osl_compare_func, osl_add_row().
295  */
296 int osl_add_and_get_row(struct osl_table *t, struct osl_object *objects,
297         struct osl_row **row);
298
299
300 /**
301  * Add a new row to an osl table.
302  *
303  * \param t Same meaning as osl_add_and_get_row().
304  * \param objects Same meaning as osl_add_and_get_row().
305  *
306  * \return The return value of the underlying call to osl_add_and_get_row().
307  *
308  * This is equivalent to osl_add_and_get_row(t, objects, NULL).
309  */
310 int osl_add_row(struct osl_table *t, struct osl_object *objects);
311
312 /**
313  * Delete a row from an osl table.
314  *
315  * \param t Pointer to an open osl table.
316  * \param row Pointer to the row to delete.
317  *
318  * This removes all disk storage objects, removes all rbtree nodes,  and frees
319  * all volatile objects belonging to the given row. For mapped columns, the
320  * data is merely marked invalid and may be pruned from time to time by
321  * osl_fsck.
322  *
323  * \return Standard.
324  */
325 int osl_del_row(struct osl_table *t, struct osl_row *row);
326
327 /**
328  * Loop over all nodes in an rbtree.
329  *
330  * \param t Pointer to an open osl table.
331  * \param col_num The column to use for iterating over the elements.
332  * \param private_data Pointer that gets passed to \a func.
333  * \param func The function to be called for each node in the rbtree.
334  *
335  * This function does an in-order walk of the rbtree associated with \a
336  * col_num. It is an error if the \p OSL_RBTREE flag is not set for this
337  * column. For each node in the rbtree, the given function \a func is called
338  * with two pointers as arguments: The first osl_row* argument points to the
339  * row that contains the object corresponding to the rbtree node currently
340  * traversed, and the \a private_data pointer is passed verbatim to \a func as the
341  * second argument. The loop terminates either if \a func returns a negative
342  * value, or if all nodes of the tree have been visited.
343  *
344  *
345  * \return Standard. If the termination of the loop was caused by \a func
346  * returning a negative value, \p -E_OSL_LOOP is returned.
347  *
348  * \sa osl_storage_flags, osl_rbtree_loop_reverse(), osl_compare_func.
349  */
350 int osl_rbtree_loop(const struct osl_table *t, unsigned col_num,
351         void *private_data, osl_rbtree_loop_func *func);
352
353 /**
354  * Loop over all nodes in an rbtree in reverse order.
355  *
356  * \param t Identical meaning as in \p osl_rbtree_loop().
357  * \param col_num Identical meaning as in \p osl_rbtree_loop().
358  * \param private_data Identical meaning as in \p osl_rbtree_loop().
359  * \param func Identical meaning as in \p osl_rbtree_loop().
360  *
361  * This function is identical to \p osl_rbtree_loop(), the only difference
362  * is that the tree is walked in reverse order.
363  *
364  * \return The same return value as \p osl_rbtree_loop().
365  *
366  * \sa osl_rbtree_loop().
367  */
368 int osl_rbtree_loop_reverse(const struct osl_table *t, unsigned col_num,
369         void *private_data, osl_rbtree_loop_func *func);
370
371 /**
372  * Change an object in an osl table.
373  *
374  * \param t Pointer to an open osl table.
375  * \param r Pointer to the row containing the object to be updated.
376  * \param col_num Number of the column containing the object to be updated.
377  * \param obj Pointer to the replacement object.
378  *
379  * This function  gets rid of all references to the old object. This includes
380  * removal of the rbtree node in case there is an rbtree associated with \a
381  * col_num. It then inserts \a obj into the table and the rbtree if necessary.
382  *
383  * If the \p OSL_RBTREE flag is set for \a col_num, you \b MUST call this
384  * function in order to change the contents of an object, even for volatile or
385  * mapped columns of constant size (which may be updated directly if \p
386  * OSL_RBTREE is not set). Otherwise the rbtree might become corrupt.
387  *
388  * \return Standard
389  */
390 int osl_update_object(struct osl_table *t, const struct osl_row *r,
391         unsigned col_num, struct osl_object *obj);
392
393 /**
394  * Get the number of rows of the given table.
395  *
396  * \param t Pointer to an open osl table.
397  * \param num_rows Result is returned here.
398  *
399  * The number of rows returned via \a num_rows excluding any invalid rows.
400  *
401  * \return Positive on success, \p -E_OSL_BAD_TABLE if \a t is \p NULL.
402  */
403 int osl_get_num_rows(const struct osl_table *t, unsigned *num_rows);
404
405
406 /**
407  * Get the row corresponding to the smallest rbtree node of a column.
408  *
409  * \param t An open rbtree table.
410  * \param col_num The number of the rbtree column.
411  * \param result A pointer to the first row is returned here.
412  *
413  * The rbtree node of the smallest object (with respect to the corresponding
414  * compare function) is selected and the row containing this object is
415  * returned. It is an error if \a col_num refers to a column without an
416  * associated rbtree.
417  *
418  * \return Standard.
419  *
420  * \sa osl_get_nth_row(), osl_rbtree_last_row().
421  */
422 int osl_rbtree_first_row(const struct osl_table *t, unsigned col_num,
423         struct osl_row **result);
424
425 /**
426  * Get the row corresponding to the greatest rbtree node of a column.
427  *
428  * \param t The same meaning as in \p osl_rbtree_first_row().
429  * \param col_num The same meaning as in \p osl_rbtree_first_row().
430  * \param result The same meaning as in \p osl_rbtree_first_row().
431  *
432  * This function works just like osl_rbtree_first_row(), the only difference
433  * is that the row containing the greatest rather than the smallest object is
434  * returned.
435  *
436  * \return Standard.
437  *
438  * \sa osl_get_nth_row(), osl_rbtree_first_row().
439  */
440 int osl_rbtree_last_row(const struct osl_table *t, unsigned col_num,
441         struct osl_row **result);
442
443 /**
444  * Get the row with n-th greatest value.
445  *
446  * \param t Pointer to an open osl table.
447  * \param col_num The column number.
448  * \param n The rank of the desired row.
449  * \param result Row is returned here.
450  *
451  * Retrieve the n-th order statistic with respect to the compare function
452  * of the rbtree column \a col_num. In other words, get the row with
453  * \a n th greatest value in column \a col_num. It is an error if
454  * \a col_num is not a rbtree column, or if \a n is larger than the
455  * number of rows in the table.
456  *
457  * \return Standard.
458  *
459  * \sa osl_storage_flags, osl_compare_func, osl_get_row(),
460  * osl_rbtree_last_row(), osl_rbtree_first_row(), osl_get_rank().
461  */
462 int osl_get_nth_row(const struct osl_table *t, unsigned col_num,
463         unsigned n, struct osl_row **result);
464
465 /**
466  * Get the rank of a row.
467  *
468  * \param t An open osl table.
469  * \param r The row to get the rank of.
470  * \param col_num The number of an rbtree column.
471  * \param rank Result pointer.
472  *
473  * The rank is, by definition, the position of the row in the linear order
474  * determined by an in-order tree walk of the rbtree associated with column
475  * number \a col_num of \a table.
476  *
477  * \return Standard.
478  *
479  * \sa osl_get_nth_row().
480  */
481 int osl_get_rank(const struct osl_table *t, struct osl_row *r,
482         unsigned col_num, unsigned *rank);
483
484 /**
485  * Get a string describing the error code passed in the argument.
486  *
487  * \param num The error code.
488  *
489  * This works just like strerror(3). The given number must be an osl error
490  * code. The result must not be freed by the caller.
491  *
492  * \return The error text corresponding to an osl error code.
493  */
494 const char *osl_strerror(int num);
495
496 #pragma GCC visibility pop