/*
 *  Berkeley DB stress test probe
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <db.h>

#define die(e) { fprintf(stderr, "ERROR file %s line %d pid=%d: %s (%d)\n", \
                 __FILE__, __LINE__, (int)getpid(), db_strerror(e), e); \
                 exit(e); }

void insert(DB *db, int o, int i)
{
    int rv;
    DBT dbkey, dbval;
    char key[256], val[256];

    /* Zero out the DBTs before using them. */
    memset(&dbkey, 0, sizeof(DBT));
    memset(&dbval, 0, sizeof(DBT));

    sprintf(key, "key-%05d-%05d-%05d", (int)getpid(), o, i); dbkey.data = &key; dbkey.size = strlen(key);
    sprintf(val, "val-%05d-%05d-%05d", (int)getpid(), o, i); dbval.data = &val; dbval.size = strlen(val);

#if 0
    printf("key=%s, val=%s\n", key, val);
#else
    rv = db->put(db, NULL, &dbkey, &dbval, DB_NOOVERWRITE);
    if (rv != 0) die(rv);
#endif
}

int main(void)
{
    DB_ENV *dbenv;   /* DB environment handle */
    DB *db;          /* DB structure handle */
    u_int32_t flags; /* database open flags */
    int rv;          /* function return value */
    int o, i;

    for (o=0; o<10; o++) {

        /* Initialize and open the database environment */
        dbenv = NULL;
        rv = db_env_create(&dbenv, 0);
        if (rv != 0) die(rv);

        dbenv->set_errfile(dbenv, stderr);
        flags = 0;
        flags |= DB_CREATE;
        flags |= DB_INIT_TXN;
        flags |= DB_REGISTER;
        flags |= DB_RECOVER;
        if ((rv = dbenv->open(dbenv,   /* DB environment pointer */
                          "/tmp/my.d", /* Homedir */
                          flags, 0)    /* Open flags, File mode (using defaults) */
            ) != 0) die(rv);

        /* Initialize and open the database */
        db = NULL;
        rv = db_create(&db, NULL, 0);
        if (rv != 0) die(rv);

        db->set_errfile(db, stderr);
        flags = 0;
        flags |= DB_CREATE;
        if ((rv = db->open(db,       /* DB structure pointer */
                       NULL,         /* Transaction pointer */
                       "/tmp/my.db", /* On-disk file that holds the database.  */
                       "foo",        /* Optional logical database name */
                       DB_BTREE,     /* Database access method */
                       flags, 0)     /* Open flags, File mode (using defaults) */
            ) != 0) die(rv);

        /* Put content into database */
        for (i=0; i<100; i++) insert(db, o, i);
       
        /* Flush, cleanup and close database and environment */
        if (db != NULL) db->close(db, 0); 
        if (dbenv != NULL) dbenv->close(dbenv, 0); 
    }
    return(0);
}

