xref: /freebsd/lib/libc/db/man/dbopen.3 (revision 1669d8afc64812c8d2d1d147ae1fd42ff441e1b1)
1.\" Copyright (c) 1990, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 4. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.\"	@(#)dbopen.3	8.5 (Berkeley) 1/2/94
29.\" $FreeBSD$
30.\"
31.Dd January 2, 1994
32.Dt DBOPEN 3
33.Os
34.Sh NAME
35.Nm dbopen
36.Nd "database access methods"
37.Sh SYNOPSIS
38.In sys/types.h
39.In db.h
40.In fcntl.h
41.In limits.h
42.Ft DB *
43.Fn dbopen "const char *file" "int flags" "int mode" "DBTYPE type" "const void *openinfo"
44.Sh DESCRIPTION
45The
46.Fn dbopen
47function
48is the library interface to database files.
49The supported file formats are btree, hashed and UNIX file oriented.
50The btree format is a representation of a sorted, balanced tree structure.
51The hashed format is an extensible, dynamic hashing scheme.
52The flat-file format is a byte stream file with fixed or variable length
53records.
54The formats and file format specific information are described in detail
55in their respective manual pages
56.Xr btree 3 ,
57.Xr hash 3
58and
59.Xr recno 3 .
60.Pp
61The
62.Fn dbopen
63function
64opens
65.Fa file
66for reading and/or writing.
67Files never intended to be preserved on disk may be created by setting
68the
69.Fa file
70argument to
71.Dv NULL .
72.Pp
73The
74.Fa flags
75and
76.Fa mode
77arguments
78are as specified to the
79.Xr open 2
80routine, however, only the
81.Dv O_CREAT , O_EXCL , O_EXLOCK , O_NONBLOCK ,
82.Dv O_RDONLY , O_RDWR , O_SHLOCK
83and
84.Dv O_TRUNC
85flags are meaningful.
86(Note, opening a database file
87.Dv O_WRONLY
88is not possible.)
89.\"Three additional options may be specified by
90.\".Em or Ns 'ing
91.\"them into the
92.\".Fa flags
93.\"argument.
94.\".Bl -tag -width indent
95.\".It Dv DB_LOCK
96.\"Do the necessary locking in the database to support concurrent access.
97.\"If concurrent access is not needed or the database is read-only this
98.\"flag should not be set, as it tends to have an associated performance
99.\"penalty.
100.\".It Dv DB_SHMEM
101.\"Place the underlying memory pool used by the database in shared
102.\"memory.
103.\"Necessary for concurrent access.
104.\".It Dv DB_TXN
105.\"Support transactions in the database.
106.\"The
107.\".Dv DB_LOCK
108.\"and
109.\".Dv DB_SHMEM
110.\"flags must be set as well.
111.\".El
112.Pp
113The
114.Fa type
115argument is of type
116.Ft DBTYPE
117(as defined in the
118.In db.h
119include file) and
120may be set to
121.Dv DB_BTREE , DB_HASH
122or
123.Dv DB_RECNO .
124.Pp
125The
126.Fa openinfo
127argument is a pointer to an access method specific structure described
128in the access method's manual page.
129If
130.Fa openinfo
131is
132.Dv NULL ,
133each access method will use defaults appropriate for the system
134and the access method.
135.Pp
136The
137.Fn dbopen
138function
139returns a pointer to a
140.Ft DB
141structure on success and
142.Dv NULL
143on error.
144The
145.Ft DB
146structure is defined in the
147.In db.h
148include file, and contains at
149least the following fields:
150.Bd -literal
151typedef struct {
152	DBTYPE type;
153	int (*close)(DB *db);
154	int (*del)(const DB *db, const DBT *key, u_int flags);
155	int (*fd)(const DB *db);
156	int (*get)(const DB *db, const DBT *key, DBT *data, u_int flags);
157	int (*put)(const DB *db, DBT *key, const DBT *data,
158	     u_int flags);
159	int (*sync)(const DB *db, u_int flags);
160	int (*seq)(const DB *db, DBT *key, DBT *data, u_int flags);
161} DB;
162.Ed
163.Pp
164These elements describe a database type and a set of functions performing
165various actions.
166These functions take a pointer to a structure as returned by
167.Fn dbopen ,
168and sometimes one or more pointers to key/data structures and a flag value.
169.Bl -tag -width indent
170.It Va type
171The type of the underlying access method (and file format).
172.It Va close
173A pointer to a routine to flush any cached information to disk, free any
174allocated resources, and close the underlying file(s).
175Since key/data pairs may be cached in memory, failing to sync the file
176with a
177.Va close
178or
179.Va sync
180function may result in inconsistent or lost information.
181.Va close
182routines return -1 on error (setting
183.Va errno )
184and 0 on success.
185.It Va del
186A pointer to a routine to remove key/data pairs from the database.
187.Pp
188The
189.Fa flags
190argument
191may be set to the following value:
192.Bl -tag -width indent
193.It Dv R_CURSOR
194Delete the record referenced by the cursor.
195The cursor must have previously been initialized.
196.El
197.Pp
198.Va delete
199routines return -1 on error (setting
200.Va errno ) ,
2010 on success, and 1 if the specified
202.Fa key
203was not in the file.
204.It Va fd
205A pointer to a routine which returns a file descriptor representative
206of the underlying database.
207A file descriptor referencing the same file will be returned to all
208processes which call
209.Fn dbopen
210with the same
211.Fa file
212name.
213This file descriptor may be safely used as an argument to the
214.Xr fcntl 2
215and
216.Xr flock 2
217locking functions.
218The file descriptor is not necessarily associated with any of the
219underlying files used by the access method.
220No file descriptor is available for in memory databases.
221.Va \&Fd
222routines return -1 on error (setting
223.Va errno ) ,
224and the file descriptor on success.
225.It Va get
226A pointer to a routine which is the interface for keyed retrieval from
227the database.
228The address and length of the data associated with the specified
229.Fa key
230are returned in the structure referenced by
231.Fa data .
232.Va get
233routines return -1 on error (setting
234.Va errno ) ,
2350 on success, and 1 if the
236.Fa key
237was not in the file.
238.It Va put
239A pointer to a routine to store key/data pairs in the database.
240.Pp
241The
242.Fa flags
243argument
244may be set to one of the following values:
245.Bl -tag -width indent
246.It Dv R_CURSOR
247Replace the key/data pair referenced by the cursor.
248The cursor must have previously been initialized.
249.It Dv R_IAFTER
250Append the data immediately after the data referenced by
251.Fa key ,
252creating a new key/data pair.
253The record number of the appended key/data pair is returned in the
254.Fa key
255structure.
256(Applicable only to the
257.Dv DB_RECNO
258access method.)
259.It Dv R_IBEFORE
260Insert the data immediately before the data referenced by
261.Fa key ,
262creating a new key/data pair.
263The record number of the inserted key/data pair is returned in the
264.Fa key
265structure.
266(Applicable only to the
267.Dv DB_RECNO
268access method.)
269.It Dv R_NOOVERWRITE
270Enter the new key/data pair only if the key does not previously exist.
271.It Dv R_SETCURSOR
272Store the key/data pair, setting or initializing the position of the
273cursor to reference it.
274(Applicable only to the
275.Dv DB_BTREE
276and
277.Dv DB_RECNO
278access methods.)
279.El
280.Pp
281.Dv R_SETCURSOR
282is available only for the
283.Dv DB_BTREE
284and
285.Dv DB_RECNO
286access
287methods because it implies that the keys have an inherent order
288which does not change.
289.Pp
290.Dv R_IAFTER
291and
292.Dv R_IBEFORE
293are available only for the
294.Dv DB_RECNO
295access method because they each imply that the access method is able to
296create new keys.
297This is only true if the keys are ordered and independent, record numbers
298for example.
299.Pp
300The default behavior of the
301.Va put
302routines is to enter the new key/data pair, replacing any previously
303existing key.
304.Pp
305.Va put
306routines return -1 on error (setting
307.Va errno ) ,
3080 on success, and 1 if the
309.Dv R_NOOVERWRITE
310flag
311was set and the key already exists in the file.
312.It Va seq
313A pointer to a routine which is the interface for sequential
314retrieval from the database.
315The address and length of the key are returned in the structure
316referenced by
317.Fa key ,
318and the address and length of the data are returned in the
319structure referenced
320by
321.Fa data .
322.Pp
323Sequential key/data pair retrieval may begin at any time, and the
324position of the
325.Dq cursor
326is not affected by calls to the
327.Va del ,
328.Va get ,
329.Va put ,
330or
331.Va sync
332routines.
333Modifications to the database during a sequential scan will be reflected
334in the scan, i.e., records inserted behind the cursor will not be returned
335while records inserted in front of the cursor will be returned.
336.Pp
337The
338.Fa flags
339argument
340.Em must
341be set to one of the following values:
342.Bl -tag -width indent
343.It Dv R_CURSOR
344The data associated with the specified key is returned.
345This differs from the
346.Va get
347routines in that it sets or initializes the cursor to the location of
348the key as well.
349(Note, for the
350.Dv DB_BTREE
351access method, the returned key is not necessarily an
352exact match for the specified key.
353The returned key is the smallest key greater than or equal to the specified
354key, permitting partial key matches and range searches.)
355.It Dv R_FIRST
356The first key/data pair of the database is returned, and the cursor
357is set or initialized to reference it.
358.It Dv R_LAST
359The last key/data pair of the database is returned, and the cursor
360is set or initialized to reference it.
361(Applicable only to the
362.Dv DB_BTREE
363and
364.Dv DB_RECNO
365access methods.)
366.It Dv R_NEXT
367Retrieve the key/data pair immediately after the cursor.
368If the cursor is not yet set, this is the same as the
369.Dv R_FIRST
370flag.
371.It Dv R_PREV
372Retrieve the key/data pair immediately before the cursor.
373If the cursor is not yet set, this is the same as the
374.Dv R_LAST
375flag.
376(Applicable only to the
377.Dv DB_BTREE
378and
379.Dv DB_RECNO
380access methods.)
381.El
382.Pp
383.Dv R_LAST
384and
385.Dv R_PREV
386are available only for the
387.Dv DB_BTREE
388and
389.Dv DB_RECNO
390access methods because they each imply that the keys have an inherent
391order which does not change.
392.Pp
393.Va seq
394routines return -1 on error (setting
395.Va errno ) ,
3960 on success and 1 if there are no key/data pairs less than or greater
397than the specified or current key.
398If the
399.Dv DB_RECNO
400access method is being used, and if the database file
401is a character special file and no complete key/data pairs are currently
402available, the
403.Va seq
404routines return 2.
405.It Va sync
406A pointer to a routine to flush any cached information to disk.
407If the database is in memory only, the
408.Va sync
409routine has no effect and will always succeed.
410.Pp
411The
412.Fa flags
413argument may be set to the following value:
414.Bl -tag -width indent
415.It Dv R_RECNOSYNC
416If the
417.Dv DB_RECNO
418access method is being used, this flag causes
419the
420.Va sync
421routine to apply to the btree file which underlies the
422recno file, not the recno file itself.
423(See the
424.Va bfname
425field of the
426.Xr recno 3
427manual page for more information.)
428.El
429.Pp
430.Va sync
431routines return -1 on error (setting
432.Va errno )
433and 0 on success.
434.El
435.Sh "KEY/DATA PAIRS"
436Access to all file types is based on key/data pairs.
437Both keys and data are represented by the following data structure:
438.Bd -literal
439typedef struct {
440	void *data;
441	size_t size;
442} DBT;
443.Ed
444.Pp
445The elements of the
446.Ft DBT
447structure are defined as follows:
448.Bl -tag -width "data"
449.It Va data
450A pointer to a byte string.
451.It Va size
452The length of the byte string.
453.El
454.Pp
455Key and data byte strings may reference strings of essentially unlimited
456length although any two of them must fit into available memory at the same
457time.
458It should be noted that the access methods provide no guarantees about
459byte string alignment.
460.Sh ERRORS
461The
462.Fn dbopen
463routine may fail and set
464.Va errno
465for any of the errors specified for the library routines
466.Xr open 2
467and
468.Xr malloc 3
469or the following:
470.Bl -tag -width Er
471.It Bq Er EFTYPE
472A file is incorrectly formatted.
473.It Bq Er EINVAL
474An argument has been specified (hash function, pad byte etc.) that is
475incompatible with the current file specification or which is not
476meaningful for the function (for example, use of the cursor without
477prior initialization) or there is a mismatch between the version
478number of file and the software.
479.El
480.Pp
481The
482.Va close
483routines may fail and set
484.Va errno
485for any of the errors specified for the library routines
486.Xr close 2 ,
487.Xr read 2 ,
488.Xr write 2 ,
489.Xr free 3 ,
490or
491.Xr fsync 2 .
492.Pp
493The
494.Va del ,
495.Va get ,
496.Va put
497and
498.Va seq
499routines may fail and set
500.Va errno
501for any of the errors specified for the library routines
502.Xr read 2 ,
503.Xr write 2 ,
504.Xr free 3
505or
506.Xr malloc 3 .
507.Pp
508The
509.Va fd
510routines will fail and set
511.Va errno
512to
513.Er ENOENT
514for in memory databases.
515.Pp
516The
517.Va sync
518routines may fail and set
519.Va errno
520for any of the errors specified for the library routine
521.Xr fsync 2 .
522.Sh SEE ALSO
523.Xr btree 3 ,
524.Xr hash 3 ,
525.Xr mpool 3 ,
526.Xr recno 3
527.Rs
528.%T "LIBTP: Portable, Modular Transactions for UNIX"
529.%A Margo Seltzer
530.%A Michael Olson
531.%R "USENIX proceedings"
532.%D Winter 1992
533.Re
534.Sh BUGS
535The typedef
536.Ft DBT
537is a mnemonic for
538.Dq "data base thang" ,
539and was used
540because noone could think of a reasonable name that was not already used.
541.Pp
542The file descriptor interface is a kluge and will be deleted in a
543future version of the interface.
544.Pp
545None of the access methods provide any form of concurrent access,
546locking, or transactions.
547