mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
194 lines
4 KiB
C
194 lines
4 KiB
C
/*-
|
|
* See the file LICENSE for redistribution information.
|
|
*
|
|
* Copyright (c) 2002, 2011 Oracle and/or its affiliates. All rights reserved.
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "db_185.h"
|
|
|
|
void err(char *);
|
|
int mycmp(const DBT *, const DBT *);
|
|
void ops(DB *, int);
|
|
|
|
int
|
|
main()
|
|
{
|
|
DB *dbp;
|
|
HASHINFO h_info;
|
|
BTREEINFO b_info;
|
|
RECNOINFO r_info;
|
|
|
|
printf("\tBtree...\n");
|
|
memset(&b_info, 0, sizeof(b_info));
|
|
b_info.flags = R_DUP;
|
|
b_info.cachesize = 100 * 1024;
|
|
b_info.psize = 512;
|
|
b_info.lorder = 4321;
|
|
b_info.compare = mycmp;
|
|
(void)remove("a.db");
|
|
if ((dbp =
|
|
dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_BTREE, &b_info)) == NULL)
|
|
err("dbopen: btree");
|
|
ops(dbp, DB_BTREE);
|
|
|
|
printf("\tHash...\n");
|
|
memset(&h_info, 0, sizeof(h_info));
|
|
h_info.bsize = 512;
|
|
h_info.ffactor = 6;
|
|
h_info.nelem = 1000;
|
|
h_info.cachesize = 100 * 1024;
|
|
h_info.lorder = 1234;
|
|
(void)remove("a.db");
|
|
if ((dbp =
|
|
dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_HASH, &h_info)) == NULL)
|
|
err("dbopen: hash");
|
|
ops(dbp, DB_HASH);
|
|
|
|
printf("\tRecno...\n");
|
|
memset(&r_info, 0, sizeof(r_info));
|
|
r_info.flags = R_FIXEDLEN;
|
|
r_info.cachesize = 100 * 1024;
|
|
r_info.psize = 1024;
|
|
r_info.reclen = 37;
|
|
(void)remove("a.db");
|
|
if ((dbp =
|
|
dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_RECNO, &r_info)) == NULL)
|
|
err("dbopen: recno");
|
|
ops(dbp, DB_RECNO);
|
|
|
|
return (0);
|
|
}
|
|
|
|
int
|
|
mycmp(a, b)
|
|
const DBT *a, *b;
|
|
{
|
|
size_t len;
|
|
u_int8_t *p1, *p2;
|
|
|
|
len = a->size > b->size ? b->size : a->size;
|
|
for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2)
|
|
if (*p1 != *p2)
|
|
return ((long)*p1 - (long)*p2);
|
|
return ((long)a->size - (long)b->size);
|
|
}
|
|
|
|
void
|
|
ops(dbp, type)
|
|
DB *dbp;
|
|
int type;
|
|
{
|
|
FILE *outfp;
|
|
DBT key, data;
|
|
recno_t recno;
|
|
int i, ret;
|
|
char buf[64];
|
|
|
|
memset(&key, 0, sizeof(key));
|
|
memset(&data, 0, sizeof(data));
|
|
|
|
for (i = 1; i < 100; ++i) { /* Test DB->put. */
|
|
sprintf(buf, "abc_%d_efg", i);
|
|
if (type == DB_RECNO) {
|
|
recno = i;
|
|
key.data = &recno;
|
|
key.size = sizeof(recno);
|
|
} else {
|
|
key.data = data.data = buf;
|
|
key.size = data.size = strlen(buf);
|
|
}
|
|
|
|
data.data = buf;
|
|
data.size = strlen(buf);
|
|
if (dbp->put(dbp, &key, &data, 0))
|
|
err("DB->put");
|
|
}
|
|
|
|
if (type == DB_RECNO) { /* Test DB->get. */
|
|
recno = 97;
|
|
key.data = &recno;
|
|
key.size = sizeof(recno);
|
|
} else {
|
|
key.data = buf;
|
|
key.size = strlen(buf);
|
|
}
|
|
sprintf(buf, "abc_%d_efg", 97);
|
|
if (dbp->get(dbp, &key, &data, 0) != 0)
|
|
err("DB->get");
|
|
if (memcmp(data.data, buf, strlen(buf)))
|
|
err("DB->get: wrong data returned");
|
|
|
|
if (type == DB_RECNO) { /* Test DB->put no-overwrite. */
|
|
recno = 42;
|
|
key.data = &recno;
|
|
key.size = sizeof(recno);
|
|
} else {
|
|
key.data = buf;
|
|
key.size = strlen(buf);
|
|
}
|
|
sprintf(buf, "abc_%d_efg", 42);
|
|
if (dbp->put(dbp, &key, &data, R_NOOVERWRITE) == 0)
|
|
err("DB->put: no-overwrite succeeded");
|
|
|
|
if (type == DB_RECNO) { /* Test DB->del. */
|
|
recno = 35;
|
|
key.data = &recno;
|
|
key.size = sizeof(recno);
|
|
} else {
|
|
sprintf(buf, "abc_%d_efg", 35);
|
|
key.data = buf;
|
|
key.size = strlen(buf);
|
|
}
|
|
if (dbp->del(dbp, &key, 0))
|
|
err("DB->del");
|
|
|
|
/* Test DB->seq. */
|
|
if ((outfp = fopen("output", "w")) == NULL)
|
|
err("fopen: output");
|
|
while ((ret = dbp->seq(dbp, &key, &data, R_NEXT)) == 0) {
|
|
if (type == DB_RECNO)
|
|
fprintf(outfp, "%d\n", *(int *)key.data);
|
|
else
|
|
fprintf(outfp,
|
|
"%.*s\n", (int)key.size, (char *)key.data);
|
|
fprintf(outfp, "%.*s\n", (int)data.size, (char *)data.data);
|
|
}
|
|
if (ret != 1)
|
|
err("DB->seq");
|
|
fclose(outfp);
|
|
switch (type) {
|
|
case DB_BTREE:
|
|
ret = system("cmp output test_db185/O.BH");
|
|
break;
|
|
case DB_HASH:
|
|
ret = system("sort output | cmp - test_db185/O.BH");
|
|
break;
|
|
case DB_RECNO:
|
|
ret = system("cmp output test_db185/O.R");
|
|
break;
|
|
}
|
|
if (ret != 0)
|
|
err("output comparison failed");
|
|
|
|
if (dbp->sync(dbp, 0)) /* Test DB->sync. */
|
|
err("DB->sync");
|
|
|
|
if (dbp->close(dbp)) /* Test DB->close. */
|
|
err("DB->close");
|
|
}
|
|
|
|
void
|
|
err(s)
|
|
char *s;
|
|
{
|
|
fprintf(stderr, "\t%s: %s\n", s, strerror(errno));
|
|
exit(EXIT_FAILURE);
|
|
}
|