Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Oct 2002 13:33:32 -0500 (EST)
From:      Mike Wade <mwade@cdc.net>
To:        <freebsd-questions@freebsd.org>
Subject:   FreeBSD db problems
Message-ID:  <20021029133305.F19661-100000@bluehighway.net>

next in thread | raw e-mail | index | archive | help
Any ideas why this db code chews the data while doing a DB walk with "seq"
and replacing data with "put"?

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

int main()
{
	DB *db_p;
	DBT db_key, db_val;
	char buf[16];
	int i, r, flags;

	db_p = dbopen("test.db", O_RDWR|O_CREAT|O_TRUNC, 0644, DB_HASH, NULL);
	if (!db_p)
	{
		printf("fatal: dbopen() failed\n");
		exit(0);
	}

	for (i=0; i<100; i++)
	{
		snprintf(buf, 16, "%d", i);
		db_key.data = &buf;
		db_key.size = strlen(buf);
		db_val.data = NULL;
		db_val.size = 0;

		r = (db_p->put)(db_p, &db_key, &db_val, 0);

		printf("put(%d) %.*s -> ", r, (int)db_key.size, (char *)db_key.data);
		printf("%.*s\n", (int)db_val.size, (char *)db_val.data);
	}

	for (flags = R_FIRST;; flags = R_NEXT)
	{
		r = (db_p->seq)(db_p, &db_key, &db_val, flags);

		printf("seq(%d) %.*s -> ", r, (int)db_key.size, (char *)db_key.data);
		printf("%.*s\n", (int)db_val.size, (char *)db_val.data);

		if (r == -1)
		{
			printf("fatal: error issuing db seq command\n");
			exit(0);
		}
		if (r == 1)
			break;

		db_val.data = "abc";
		db_val.size = 3;

		printf("1 put( ) %.*s -> ", (int)db_key.size, (char *)db_key.data);
		printf("%.*s\n", (int)db_val.size, (char *)db_val.data);

		r = (db_p->put)(db_p, &db_key, &db_val, 0);

		printf("2 put(%d) %.*s -> ", r, (int)db_key.size, (char *)db_key.data);
		printf("%.*s\n", (int)db_val.size, (char *)db_val.data);
	}

	db_p->close(db_p);

	return(0);
}

---
Mike Wade (mwade@cdc.net)


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021029133305.F19661-100000>