root/crypto/krb5/src/plugins/kdb/db2/libdb2/test/hash2.tests/passtest.c
#include "db-int.h"
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

extern int hash_expansions;

int
main(void)
{
    FILE *keys, *vals;
    DB *db;
    DBT key, val;
    char *key_line, *val_line, *get_key, *get_val, *old, *key2;
    HASHINFO passwd;
    int n = 0, i = 0, expected;

    key_line = (char *)malloc(100);
    val_line = (char *)malloc(300);
    old = (char *)malloc(300);

    keys = fopen("yp.keys", "rt");
    vals = fopen("yp.total", "rt");

    passwd.bsize =  1024;
    passwd.cachesize = 1024 * 1024;
    passwd.ffactor = 10;
    passwd.hash = NULL;
    passwd.nelem = 0;
    passwd.lorder = 4321;


    db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0664, DB_HASH,
                &passwd);
    if (!db) {
        fprintf(stderr, "create_db: couldn't create database file\n");
        exit(1);
    }

    while ((key_line = fgets(key_line, 100, keys)) != NULL) {
        if (n % 1000 == 0)
          fprintf(stderr, "Putting #%d.\n", n);
        n++;
        fgets(val_line, 300, vals);
        key.size = strlen(key_line);
        key.data = (void *)key_line;
        val.size = strlen(val_line);
        val.data = (void *)val_line;
        if (db->put(db, &key, &val, 0) != 0)
          fprintf(stderr, "Put error, n = %d\n", n);
        if (db->get(db, &key, &val, 0) != 0)
          fprintf(stderr, "Immediate get error, n = %d\n", n);
    }
    fprintf(stderr, "Done with put!\n");
    free(key_line);
    free(val_line);
    fclose(keys);
    fclose(vals);
    db->close(db);




    keys = fopen("yp.keys", "rt");
    vals = fopen("yp.total", "rt");
    get_key = (char *)malloc(100);
    get_val = (char *)malloc(300);

    db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
    if (!db)
      fprintf(stderr, "Could not open db!\n");
    n = 0;
    while ((get_key = fgets(get_key, 100, keys)) != NULL) {
        n++;
        if (n % 1000 == 0)
          fprintf(stderr, "Getting #%d.\n", n);
        key.size = strlen(get_key);
        key.data = (void *)get_key;
        if (db->get(db, &key, &val, 0) != 0)
          fprintf(stderr, "Retrieval error on %s\n", get_key);
        fgets(get_val, 300, vals);
        if (memcmp(val.data, (void *)get_val, val.size)) {
            fprintf(stderr, "Unmatched get on %s.\n", get_key);
            fprintf(stderr, "Input = %s\nOutput = %s\n", get_val,
                    (char *)val.data);
        }
    }
    expected = n;
    fclose(vals);
    fclose(keys);
    free(get_key);
    free(get_val);
    db->close(db);




    get_key = (char *)malloc(100);
    get_val = (char *)malloc(300);

    db = dbopen("/usr/tmp/passwd.db", O_RDWR, 0664, DB_HASH, &passwd);
    if (!db)
      fprintf(stderr, "Could not open db!\n");
    n = 0;
    for (;;) {
        n++;
        if (n % 1000 == 0)
          fprintf(stderr, "Sequence getting #%d.\n", n);
        if (db->seq(db, &key, &val, 0) != 0) {
            fprintf(stderr,
                    "Exiting sequence retrieve; n = %d, expected = %d\n",
                    n - 1 , expected);
            break;
        }
    }
    free(get_key);
    free(get_val);
    db->close(db);

    get_key = (char *)malloc(100);
    key2 = (char *)malloc(100);

    keys = fopen("yp.keys", "rt");
    vals = fopen("yp.total", "rt");

    db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
    n = 0;
    while ((get_key = fgets(get_key, 100, keys)) != NULL) {
        if (n % 1000 == 0)
          fprintf(stderr, "Deleting #%d.\n", n);
        n+=2;
        key2 = fgets(get_key, 100, keys);
        if (!key2)
          break;
        key.data = (void *)key2;
        key.size = strlen(key2);
        if (db->del(db, &key, 0) != 0)
          fprintf(stderr, "Delete error on %d", n);
    }

    db->close(db);
    free(get_key);
    free(key2);
    fclose(keys);
    fclose(vals);

    get_key = (char *)malloc(100);
    key2 = (char *)malloc(100);
    get_val = (char *)malloc(300);

    keys = fopen("yp.keys", "rt");
    vals = fopen("yp.total", "rt");

    db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
    n = 0;
    while ((get_key = fgets(get_key, 100, keys)) != NULL) {
        n += 2;
        if (n % 1000 == 0)
          fprintf(stderr, "Re-retrieving #%d.\n", n);
        key2 = fgets(key2, 100, keys);
        if (!key2)
          break;
        key.data = (void *)get_key;
        key.size = strlen(get_key);
        if (db->get(db, &key, &val, 0) != 0)
          fprintf(stderr, "Retrieval after delete error on %d\n", n);
        fgets(get_val, 300, vals);
        if (memcmp(val.data, (void *)get_val, val.size)) {
            fprintf(stderr, "Unmatched get after delete on %s.\n", get_key);
            fprintf(stderr, "Input = %s\nOutput = %s\n", get_val,
                    (char *)val.data);
        }
        fgets(get_val, 300, vals);
    }

    db->close(db);
    free(get_key);
    free(key2);
    free(get_val);
    fclose(keys);
    fclose(vals);

    exit(0);
}