summaryrefslogtreecommitdiffstats
path: root/lib/libc/db/recno/rec_utils.c
diff options
context:
space:
mode:
authorpst <pst@FreeBSD.org>1996-02-27 01:59:15 +0000
committerpst <pst@FreeBSD.org>1996-02-27 01:59:15 +0000
commitc2306789fe98946429af7462a2fd453454034a79 (patch)
treee6563df097216e3af35d87ac698b2ea9eb3f5f75 /lib/libc/db/recno/rec_utils.c
parent5476eae499a3e1c3530620c0ebc3a69ffb2f25ba (diff)
downloadFreeBSD-src-c2306789fe98946429af7462a2fd453454034a79.zip
FreeBSD-src-c2306789fe98946429af7462a2fd453454034a79.tar.gz
Import updated Berkeley DB into CSRG branch
Diffstat (limited to 'lib/libc/db/recno/rec_utils.c')
-rw-r--r--lib/libc/db/recno/rec_utils.c76
1 files changed, 42 insertions, 34 deletions
diff --git a/lib/libc/db/recno/rec_utils.c b/lib/libc/db/recno/rec_utils.c
index f7fb145..baea3fa 100644
--- a/lib/libc/db/recno/rec_utils.c
+++ b/lib/libc/db/recno/rec_utils.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1990, 1993
+ * Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_utils.c 8.3 (Berkeley) 2/21/94";
+static char sccsid[] = "@(#)rec_utils.c 8.6 (Berkeley) 7/16/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@@ -45,11 +45,14 @@ static char sccsid[] = "@(#)rec_utils.c 8.3 (Berkeley) 2/21/94";
#include "recno.h"
/*
- * __REC_RET -- Build return data as a result of search or scan.
+ * __rec_ret --
+ * Build return data.
*
* Parameters:
* t: tree
- * d: LEAF to be returned to the user.
+ * e: key/data pair to be returned
+ * nrec: record number
+ * key: user's key structure
* data: user's data structure
*
* Returns:
@@ -62,53 +65,58 @@ __rec_ret(t, e, nrec, key, data)
recno_t nrec;
DBT *key, *data;
{
- register RLEAF *rl;
- register void *p;
+ RLEAF *rl;
+ void *p;
- if (data == NULL)
- goto retkey;
+ if (key == NULL)
+ goto dataonly;
- rl = GETRLEAF(e->page, e->index);
+ /* We have to copy the key, it's not on the page. */
+ if (sizeof(recno_t) > t->bt_rkey.size) {
+ p = (void *)(t->bt_rkey.data == NULL ?
+ malloc(sizeof(recno_t)) :
+ realloc(t->bt_rkey.data, sizeof(recno_t)));
+ if (p == NULL)
+ return (RET_ERROR);
+ t->bt_rkey.data = p;
+ t->bt_rkey.size = sizeof(recno_t);
+ }
+ memmove(t->bt_rkey.data, &nrec, sizeof(recno_t));
+ key->size = sizeof(recno_t);
+ key->data = t->bt_rkey.data;
+
+dataonly:
+ if (data == NULL)
+ return (RET_SUCCESS);
/*
- * We always copy big data to make it contigous. Otherwise, we
+ * We must copy big keys/data to make them contigous. Otherwise,
* leave the page pinned and don't copy unless the user specified
* concurrent access.
*/
+ rl = GETRLEAF(e->page, e->index);
if (rl->flags & P_BIGDATA) {
if (__ovfl_get(t, rl->bytes,
- &data->size, &t->bt_dbuf, &t->bt_dbufsz))
+ &data->size, &t->bt_rdata.data, &t->bt_rdata.size))
return (RET_ERROR);
- data->data = t->bt_dbuf;
- } else if (ISSET(t, B_DB_LOCK)) {
+ data->data = t->bt_rdata.data;
+ } else if (F_ISSET(t, B_DB_LOCK)) {
/* Use +1 in case the first record retrieved is 0 length. */
- if (rl->dsize + 1 > t->bt_dbufsz) {
- if ((p =
- (void *)realloc(t->bt_dbuf, rl->dsize + 1)) == NULL)
+ if (rl->dsize + 1 > t->bt_rdata.size) {
+ p = (void *)(t->bt_rdata.data == NULL ?
+ malloc(rl->dsize + 1) :
+ realloc(t->bt_rdata.data, rl->dsize + 1));
+ if (p == NULL)
return (RET_ERROR);
- t->bt_dbuf = p;
- t->bt_dbufsz = rl->dsize + 1;
+ t->bt_rdata.data = p;
+ t->bt_rdata.size = rl->dsize + 1;
}
- memmove(t->bt_dbuf, rl->bytes, rl->dsize);
+ memmove(t->bt_rdata.data, rl->bytes, rl->dsize);
data->size = rl->dsize;
- data->data = t->bt_dbuf;
+ data->data = t->bt_rdata.data;
} else {
data->size = rl->dsize;
data->data = rl->bytes;
}
-
-retkey: if (key == NULL)
- return (RET_SUCCESS);
-
- /* We have to copy the key, it's not on the page. */
- if (sizeof(recno_t) > t->bt_kbufsz) {
- if ((p = (void *)realloc(t->bt_kbuf, sizeof(recno_t))) == NULL)
- return (RET_ERROR);
- t->bt_kbuf = p;
- t->bt_kbufsz = sizeof(recno_t);
- }
- memmove(t->bt_kbuf, &nrec, sizeof(recno_t));
- key->size = sizeof(recno_t);
- key->data = t->bt_kbuf;
return (RET_SUCCESS);
}
OpenPOWER on IntegriCloud