---
name: "tdb_firstkey"
section: "3"
platform: "linux"
package: "libtdb-dev"
version: "2:1.4.13+samba4.22.11+dfsg-0+deb13u1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/tdb_firstkey"
---

# tdb\_firstkey(3)

return the key of the first record in a tdb database tdb\_nextkey - return the key of next record in the tdb database

## NAME

tdb\_firstkey - return the key of the first record in a tdb database tdb\_nextkey - return the key of next record in the tdb database

## SYNOPSIS

```
#include <tdb.h>

TDB_DATA tdb_firstkey(TDB_CONTEXT *tdb);
TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA prev_key);

```

## DESCRIPTION

*tdb\_firstkey* fetches the key of the first entry in the *tdb* database. *tdb\_nextkey* fetches the key of the entry immediately after *prev\_key* in the database.

The TDB\_DATA structure returned by both these functions is defined as:

```
typedef struct {
	char *dptr;
	size_t dsize;
} TDB_DATA;
```

The order in which this traverses the database is its own internal hash order. Do not expect the keys to be in any recognizably sorted order.

These functions are reliable even if other writers are accessing the database (or you are replacing or deleting elements as you traverse), except in the case of nested *tdb\_firstkey* or *tdb\_nextkey* calls.  For example, the following outer traversal may fail to traverse all the elements, or may even traverse elements twice if other processes are manipulating the database:

```
	TDB_DATA i, j;
	for (i = tdb_firstkey(tdb); i.dptr; i = tdb_nextkey(tdb, i)) {
		for (j = tdb_firstkey(tdb); j.dptr; j = tdb_nextkey(tdb, j)) {
		...
		}
	}
```

If such behaviour is desired, use *tdb\_traverse* instead.

## RETURN VALUE

If the call succeeds, then a TDB\_DATA structure is returned with the *dptr* structure filled in. If the call fails or you have reached the end of the database then *dptr* will be set to NULL.

**NOTE:** The caller is responsible for freeing the data pointed to by *dptr*

## AUTHORS

Software: Andrew Tridgell \<tridge@linuxcare.com\> and Luke Kenneth Casson Leighton Man page: Ben Woodard \<ben@valinux.com\>

## SEE ALSO

[**gdbm**(3)](/gdbm/3.md), **[tdb(3)](/tdb/3.md)**
