Comprehensive C Archive Network

Upload Code Download Code About

Browse Source Download (without any required ccan dependencies)

Module:

tdb

Summary:

The trivial (transactional) database

Maintainer:

Rusty Russell <rusty@rustcorp.com.au>

Author:

Andrew Tridgell, Jeremy Allison, Rusty Russell

Dependencies:

 ccan/compiler  

Description:

The tdb module provides an efficient keyword data mapping (usually within a file). It supports transactions, so the contents of the database is reliable even across crashes.

Example:

#include <ccan/tdb/tdb.h>
#include <ccan/str/str.h>
#include <err.h>
#include <stdio.h>

static void usage(const char *argv0)
{
        errx(1, "Usage: %s fetch <dbfile> <key>\n"
             "OR %s store <dbfile> <key> <data>", argv0, argv0);
}

int main(int argc, char *argv[])
{
        struct tdb_context *tdb;
        TDB_DATA key, value;

        if (argc < 4)
                usage(argv[0]);

        tdb = tdb_open(argv[2], 1024, TDB_DEFAULT, O_CREAT|O_RDWR,
                        0600);
        if (!tdb)
                err(1, "Opening %s", argv[2]);

        key.dptr = (void *)argv[3];
        key.dsize = strlen(argv[3]);

        if (streq(argv[1], "fetch")) {
                if (argc != 4)
                        usage(argv[0]);
                value = tdb_fetch(tdb, key);
                if (!value.dptr)
                        errx(1, "fetch %s: %s",
                             argv[3], tdb_errorstr(tdb));
                printf("%.*s\n", value.dsize, (char *)value.dptr);
                free(value.dptr);
        } else if (streq(argv[1], "store")) {
                if (argc != 5)
                        usage(argv[0]);
                value.dptr = (void *)argv[4];
                value.dsize = strlen(argv[4]);
                if (tdb_store(tdb, key, value, 0) != 0)
                        errx(1, "store %s: %s",
                             argv[3], tdb_errorstr(tdb));
        } else
                usage(argv[0]);

        return 0;
}

License:

LGPL (v3 or any later version)