summaryrefslogtreecommitdiffstats
path: root/lib/libc/db/recno
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
commit2fd01690e924737239e87aee0c117e3369de6c3e (patch)
tree223a02ae7b36628c291a44ca56e521009362cc01 /lib/libc/db/recno
parent584fea2f92d8bdbedf4d4b45cff7acd9602ae1ad (diff)
parentc2306789fe98946429af7462a2fd453454034a79 (diff)
downloadFreeBSD-src-2fd01690e924737239e87aee0c117e3369de6c3e.zip
FreeBSD-src-2fd01690e924737239e87aee0c117e3369de6c3e.tar.gz
This commit was generated by cvs2svn to compensate for changes in r14272,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'lib/libc/db/recno')
-rw-r--r--lib/libc/db/recno/extern.h4
-rw-r--r--lib/libc/db/recno/rec_close.c59
-rw-r--r--lib/libc/db/recno/rec_delete.c20
-rw-r--r--lib/libc/db/recno/rec_get.c103
-rw-r--r--lib/libc/db/recno/rec_open.c43
-rw-r--r--lib/libc/db/recno/rec_utils.c76
6 files changed, 178 insertions, 127 deletions
diff --git a/lib/libc/db/recno/extern.h b/lib/libc/db/recno/extern.h
index 2188131..feed434 100644
--- a/lib/libc/db/recno/extern.h
+++ b/lib/libc/db/recno/extern.h
@@ -30,14 +30,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)extern.h 8.2 (Berkeley) 2/21/94
+ * @(#)extern.h 8.3 (Berkeley) 6/4/94
*/
#include "../btree/extern.h"
int __rec_close __P((DB *));
int __rec_delete __P((const DB *, const DBT *, u_int));
-int __rec_dleaf __P((BTREE *, PAGE *, indx_t));
+int __rec_dleaf __P((BTREE *, PAGE *, u_int32_t));
int __rec_fd __P((const DB *));
int __rec_fmap __P((BTREE *, recno_t));
int __rec_fout __P((BTREE *));
diff --git a/lib/libc/db/recno/rec_close.c b/lib/libc/db/recno/rec_close.c
index a96d4f1..16fb0b4 100644
--- a/lib/libc/db/recno/rec_close.c
+++ b/lib/libc/db/recno/rec_close.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_close.c 8.3 (Berkeley) 2/21/94";
+static char sccsid[] = "@(#)rec_close.c 8.6 (Berkeley) 8/18/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -76,11 +76,11 @@ __rec_close(dbp)
/* Committed to closing. */
status = RET_SUCCESS;
- if (ISSET(t, R_MEMMAPPED) && munmap(t->bt_smap, t->bt_msize))
+ if (F_ISSET(t, R_MEMMAPPED) && munmap(t->bt_smap, t->bt_msize))
status = RET_ERROR;
- if (!ISSET(t, R_INMEM))
- if (ISSET(t, R_CLOSEFP)) {
+ if (!F_ISSET(t, R_INMEM))
+ if (F_ISSET(t, R_CLOSEFP)) {
if (fclose(t->bt_rfp))
status = RET_ERROR;
} else
@@ -125,39 +125,58 @@ __rec_sync(dbp, flags)
if (flags == R_RECNOSYNC)
return (__bt_sync(dbp, 0));
- if (ISSET(t, R_RDONLY | R_INMEM) || !ISSET(t, R_MODIFIED))
+ if (F_ISSET(t, R_RDONLY | R_INMEM) || !F_ISSET(t, R_MODIFIED))
return (RET_SUCCESS);
/* Read any remaining records into the tree. */
- if (!ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
+ if (!F_ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
return (RET_ERROR);
/* Rewind the file descriptor. */
if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
return (RET_ERROR);
- iov[1].iov_base = "\n";
- iov[1].iov_len = 1;
- scursor = t->bt_rcursor;
+ /* Save the cursor. */
+ scursor = t->bt_cursor.rcursor;
key.size = sizeof(recno_t);
key.data = &trec;
- status = (dbp->seq)(dbp, &key, &data, R_FIRST);
- while (status == RET_SUCCESS) {
- iov[0].iov_base = data.data;
- iov[0].iov_len = data.size;
- if (writev(t->bt_rfd, iov, 2) != data.size + 1)
- return (RET_ERROR);
- status = (dbp->seq)(dbp, &key, &data, R_NEXT);
- }
- t->bt_rcursor = scursor;
+ if (F_ISSET(t, R_FIXLEN)) {
+ /*
+ * We assume that fixed length records are all fixed length.
+ * Any that aren't are either EINVAL'd or corrected by the
+ * record put code.
+ */
+ status = (dbp->seq)(dbp, &key, &data, R_FIRST);
+ while (status == RET_SUCCESS) {
+ if (write(t->bt_rfd, data.data, data.size) != data.size)
+ return (RET_ERROR);
+ status = (dbp->seq)(dbp, &key, &data, R_NEXT);
+ }
+ } else {
+ iov[1].iov_base = &t->bt_bval;
+ iov[1].iov_len = 1;
+
+ status = (dbp->seq)(dbp, &key, &data, R_FIRST);
+ while (status == RET_SUCCESS) {
+ iov[0].iov_base = data.data;
+ iov[0].iov_len = data.size;
+ if (writev(t->bt_rfd, iov, 2) != data.size + 1)
+ return (RET_ERROR);
+ status = (dbp->seq)(dbp, &key, &data, R_NEXT);
+ }
+ }
+
+ /* Restore the cursor. */
+ t->bt_cursor.rcursor = scursor;
+
if (status == RET_ERROR)
return (RET_ERROR);
if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
return (RET_ERROR);
if (ftruncate(t->bt_rfd, off))
return (RET_ERROR);
- CLR(t, R_MODIFIED);
+ F_CLR(t, R_MODIFIED);
return (RET_SUCCESS);
}
diff --git a/lib/libc/db/recno/rec_delete.c b/lib/libc/db/recno/rec_delete.c
index 35f56b9..a16593d 100644
--- a/lib/libc/db/recno/rec_delete.c
+++ b/lib/libc/db/recno/rec_delete.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1990, 1993
+ * Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
@@ -35,7 +35,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_delete.c 8.4 (Berkeley) 2/21/94";
+static char sccsid[] = "@(#)rec_delete.c 8.7 (Berkeley) 7/14/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -88,13 +88,13 @@ __rec_delete(dbp, key, flags)
status = rec_rdelete(t, nrec);
break;
case R_CURSOR:
- if (!ISSET(t, B_SEQINIT))
+ if (!F_ISSET(&t->bt_cursor, CURS_INIT))
goto einval;
if (t->bt_nrecs == 0)
return (RET_SPECIAL);
- status = rec_rdelete(t, t->bt_rcursor - 1);
+ status = rec_rdelete(t, t->bt_cursor.rcursor - 1);
if (status == RET_SUCCESS)
- --t->bt_rcursor;
+ --t->bt_cursor.rcursor;
break;
default:
einval: errno = EINVAL;
@@ -102,7 +102,7 @@ einval: errno = EINVAL;
}
if (status == RET_SUCCESS)
- SET(t, B_MODIFIED | R_MODIFIED);
+ F_SET(t, B_MODIFIED | R_MODIFIED);
return (status);
}
@@ -154,11 +154,11 @@ int
__rec_dleaf(t, h, index)
BTREE *t;
PAGE *h;
- indx_t index;
+ u_int32_t index;
{
- register RLEAF *rl;
- register indx_t *ip, cnt, offset;
- register size_t nbytes;
+ RLEAF *rl;
+ indx_t *ip, cnt, offset;
+ u_int32_t nbytes;
char *from;
void *to;
diff --git a/lib/libc/db/recno/rec_get.c b/lib/libc/db/recno/rec_get.c
index 3555575..47dd773 100644
--- a/lib/libc/db/recno/rec_get.c
+++ b/lib/libc/db/recno/rec_get.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_get.c 8.4 (Berkeley) 3/1/94";
+static char sccsid[] = "@(#)rec_get.c 8.9 (Berkeley) 8/18/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -90,7 +90,7 @@ __rec_get(dbp, key, data, flags)
* original file.
*/
if (nrec > t->bt_nrecs) {
- if (ISSET(t, R_EOF | R_INMEM))
+ if (F_ISSET(t, R_EOF | R_INMEM))
return (RET_SPECIAL);
if ((status = t->bt_irec(t, nrec)) != RET_SUCCESS)
return (status);
@@ -101,7 +101,7 @@ __rec_get(dbp, key, data, flags)
return (RET_ERROR);
status = __rec_ret(t, e, 0, NULL, data);
- if (ISSET(t, B_DB_LOCK))
+ if (F_ISSET(t, B_DB_LOCK))
mpool_put(t->bt_mp, e->page, 0);
else
t->bt_pinned = e->page;
@@ -127,31 +127,38 @@ __rec_fpipe(t, top)
recno_t nrec;
size_t len;
int ch;
- char *p;
+ u_char *p;
- if (t->bt_dbufsz < t->bt_reclen) {
- if ((t->bt_dbuf =
- (char *)realloc(t->bt_dbuf, t->bt_reclen)) == NULL)
+ if (t->bt_rdata.size < t->bt_reclen) {
+ t->bt_rdata.data = t->bt_rdata.data == NULL ?
+ malloc(t->bt_reclen) :
+ realloc(t->bt_rdata.data, t->bt_reclen);
+ if (t->bt_rdata.data == NULL)
return (RET_ERROR);
- t->bt_dbufsz = t->bt_reclen;
+ t->bt_rdata.size = t->bt_reclen;
}
- data.data = t->bt_dbuf;
+ data.data = t->bt_rdata.data;
data.size = t->bt_reclen;
- for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
+ for (nrec = t->bt_nrecs; nrec < top;) {
len = t->bt_reclen;
- for (p = t->bt_dbuf;; *p++ = ch)
- if ((ch = getc(t->bt_rfp)) == EOF || !len--) {
- if (__rec_iput(t, nrec, &data, 0)
- != RET_SUCCESS)
+ for (p = t->bt_rdata.data;; *p++ = ch)
+ if ((ch = getc(t->bt_rfp)) == EOF || !--len) {
+ if (ch != EOF)
+ *p = ch;
+ if (len != 0)
+ memset(p, t->bt_bval, len);
+ if (__rec_iput(t,
+ nrec, &data, 0) != RET_SUCCESS)
return (RET_ERROR);
+ ++nrec;
break;
}
if (ch == EOF)
break;
}
if (nrec < top) {
- SET(t, R_EOF);
+ F_SET(t, R_EOF);
return (RET_SPECIAL);
}
return (RET_SUCCESS);
@@ -177,14 +184,15 @@ __rec_vpipe(t, top)
indx_t len;
size_t sz;
int bval, ch;
- char *p;
+ u_char *p;
bval = t->bt_bval;
for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
- for (p = t->bt_dbuf, sz = t->bt_dbufsz;; *p++ = ch, --sz) {
+ for (p = t->bt_rdata.data,
+ sz = t->bt_rdata.size;; *p++ = ch, --sz) {
if ((ch = getc(t->bt_rfp)) == EOF || ch == bval) {
- data.data = t->bt_dbuf;
- data.size = p - t->bt_dbuf;
+ data.data = t->bt_rdata.data;
+ data.size = p - (u_char *)t->bt_rdata.data;
if (ch == EOF && data.size == 0)
break;
if (__rec_iput(t, nrec, &data, 0)
@@ -193,19 +201,21 @@ __rec_vpipe(t, top)
break;
}
if (sz == 0) {
- len = p - t->bt_dbuf;
- t->bt_dbufsz += (sz = 256);
- if ((t->bt_dbuf = (char *)realloc(t->bt_dbuf,
- t->bt_dbufsz)) == NULL)
+ len = p - (u_char *)t->bt_rdata.data;
+ t->bt_rdata.size += (sz = 256);
+ t->bt_rdata.data = t->bt_rdata.data == NULL ?
+ malloc(t->bt_rdata.size) :
+ realloc(t->bt_rdata.data, t->bt_rdata.size);
+ if (t->bt_rdata.data == NULL)
return (RET_ERROR);
- p = t->bt_dbuf + len;
+ p = (u_char *)t->bt_rdata.data + len;
}
}
if (ch == EOF)
break;
}
if (nrec < top) {
- SET(t, R_EOF);
+ F_SET(t, R_EOF);
return (RET_SPECIAL);
}
return (RET_SUCCESS);
@@ -228,33 +238,36 @@ __rec_fmap(t, top)
{
DBT data;
recno_t nrec;
- caddr_t sp, ep;
+ u_char *sp, *ep, *p;
size_t len;
- char *p;
- if (t->bt_dbufsz < t->bt_reclen) {
- if ((t->bt_dbuf =
- (char *)realloc(t->bt_dbuf, t->bt_reclen)) == NULL)
+ if (t->bt_rdata.size < t->bt_reclen) {
+ t->bt_rdata.data = t->bt_rdata.data == NULL ?
+ malloc(t->bt_reclen) :
+ realloc(t->bt_rdata.data, t->bt_reclen);
+ if (t->bt_rdata.data == NULL)
return (RET_ERROR);
- t->bt_dbufsz = t->bt_reclen;
+ t->bt_rdata.size = t->bt_reclen;
}
- data.data = t->bt_dbuf;
+ data.data = t->bt_rdata.data;
data.size = t->bt_reclen;
- sp = t->bt_cmap;
- ep = t->bt_emap;
+ sp = (u_char *)t->bt_cmap;
+ ep = (u_char *)t->bt_emap;
for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
if (sp >= ep) {
- SET(t, R_EOF);
+ F_SET(t, R_EOF);
return (RET_SPECIAL);
}
len = t->bt_reclen;
- for (p = t->bt_dbuf; sp < ep && len--; *p++ = *sp++);
- memset(p, t->bt_bval, len);
+ for (p = t->bt_rdata.data;
+ sp < ep && len > 0; *p++ = *sp++, --len);
+ if (len != 0)
+ memset(p, t->bt_bval, len);
if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
return (RET_ERROR);
}
- t->bt_cmap = sp;
+ t->bt_cmap = (caddr_t)sp;
return (RET_SUCCESS);
}
@@ -274,25 +287,25 @@ __rec_vmap(t, top)
recno_t top;
{
DBT data;
- caddr_t sp, ep;
+ u_char *sp, *ep;
recno_t nrec;
int bval;
- sp = t->bt_cmap;
- ep = t->bt_emap;
+ sp = (u_char *)t->bt_cmap;
+ ep = (u_char *)t->bt_emap;
bval = t->bt_bval;
for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
if (sp >= ep) {
- SET(t, R_EOF);
+ F_SET(t, R_EOF);
return (RET_SPECIAL);
}
for (data.data = sp; sp < ep && *sp != bval; ++sp);
- data.size = sp - (caddr_t)data.data;
+ data.size = sp - (u_char *)data.data;
if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
return (RET_ERROR);
++sp;
}
- t->bt_cmap = sp;
+ t->bt_cmap = (caddr_t)sp;
return (RET_SUCCESS);
}
diff --git a/lib/libc/db/recno/rec_open.c b/lib/libc/db/recno/rec_open.c
index 2a0f354..51d8a3c 100644
--- a/lib/libc/db/recno/rec_open.c
+++ b/lib/libc/db/recno/rec_open.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1990, 1993
+ * Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
@@ -35,7 +35,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_open.c 8.6 (Berkeley) 2/22/94";
+static char sccsid[] = "@(#)rec_open.c 8.10 (Berkeley) 9/1/94";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -98,7 +98,7 @@ __rec_open(fname, flags, mode, openinfo, dflags)
t = dbp->internal;
if (openinfo) {
if (openinfo->flags & R_FIXEDLEN) {
- SET(t, R_FIXLEN);
+ F_SET(t, R_FIXLEN);
t->bt_reclen = openinfo->reclen;
if (t->bt_reclen == 0)
goto einval;
@@ -107,12 +107,11 @@ __rec_open(fname, flags, mode, openinfo, dflags)
} else
t->bt_bval = '\n';
- SET(t, R_RECNO);
+ F_SET(t, R_RECNO);
if (fname == NULL)
- SET(t, R_EOF | R_INMEM);
+ F_SET(t, R_EOF | R_INMEM);
else
t->bt_rfd = rfd;
- t->bt_rcursor = 0;
if (fname != NULL) {
/*
@@ -124,20 +123,20 @@ __rec_open(fname, flags, mode, openinfo, dflags)
if (lseek(rfd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) {
switch (flags & O_ACCMODE) {
case O_RDONLY:
- SET(t, R_RDONLY);
+ F_SET(t, R_RDONLY);
break;
default:
goto einval;
}
slow: if ((t->bt_rfp = fdopen(rfd, "r")) == NULL)
goto err;
- SET(t, R_CLOSEFP);
+ F_SET(t, R_CLOSEFP);
t->bt_irec =
- ISSET(t, R_FIXLEN) ? __rec_fpipe : __rec_vpipe;
+ F_ISSET(t, R_FIXLEN) ? __rec_fpipe : __rec_vpipe;
} else {
switch (flags & O_ACCMODE) {
case O_RDONLY:
- SET(t, R_RDONLY);
+ F_SET(t, R_RDONLY);
break;
case O_RDWR:
break;
@@ -157,8 +156,16 @@ slow: if ((t->bt_rfp = fdopen(rfd, "r")) == NULL)
* fails if the file is too large.
*/
if (sb.st_size == 0)
- SET(t, R_EOF);
+ F_SET(t, R_EOF);
else {
+#ifdef MMAP_NOT_AVAILABLE
+ /*
+ * XXX
+ * Mmap doesn't work correctly on many current
+ * systems. In particular, it can fail subtly,
+ * with cache coherency problems. Don't use it
+ * for now.
+ */
t->bt_msize = sb.st_size;
if ((t->bt_smap = mmap(NULL, t->bt_msize,
PROT_READ, MAP_PRIVATE, rfd,
@@ -166,9 +173,12 @@ slow: if ((t->bt_rfp = fdopen(rfd, "r")) == NULL)
goto slow;
t->bt_cmap = t->bt_smap;
t->bt_emap = t->bt_smap + sb.st_size;
- t->bt_irec = ISSET(t, R_FIXLEN) ?
+ t->bt_irec = F_ISSET(t, R_FIXLEN) ?
__rec_fmap : __rec_vmap;
- SET(t, R_MEMMAPPED);
+ F_SET(t, R_MEMMAPPED);
+#else
+ goto slow;
+#endif
}
}
}
@@ -186,13 +196,14 @@ slow: if ((t->bt_rfp = fdopen(rfd, "r")) == NULL)
if ((h = mpool_get(t->bt_mp, P_ROOT, 0)) == NULL)
goto err;
if ((h->flags & P_TYPE) == P_BLEAF) {
- h->flags = h->flags & ~P_TYPE | P_RLEAF;
+ F_CLR(h, P_TYPE);
+ F_SET(h, P_RLEAF);
mpool_put(t->bt_mp, h, MPOOL_DIRTY);
} else
mpool_put(t->bt_mp, h, 0);
if (openinfo && openinfo->flags & R_SNAPSHOT &&
- !ISSET(t, R_EOF | R_INMEM) &&
+ !F_ISSET(t, R_EOF | R_INMEM) &&
t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
goto err;
return (dbp);
@@ -222,7 +233,7 @@ __rec_fd(dbp)
}
/* In-memory database can't have a file descriptor. */
- if (ISSET(t, R_INMEM)) {
+ if (F_ISSET(t, R_INMEM)) {
errno = ENOENT;
return (-1);
}
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