t.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
- #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, "%dn", *(int *)key.data);
- else
- fprintf(outfp,
- "%.*sn", (int)key.size, (char *)key.data);
- fprintf(outfp, "%.*sn", (int)data.size, (char *)data.data);
- }
- if (ret != 1)
- err("DB->seq");
- fclose(outfp);
- switch (type) {
- case DB_BTREE:
- ret = system("cmp output O.BH");
- break;
- case DB_HASH:
- ret = system("sort output | cmp - O.BH");
- break;
- case DB_RECNO:
- ret = system("cmp output 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: %sn", s, strerror(errno));
- exit (1);
- }