/*-1* SPDX-License-Identifier: BSD-3-Clause2*3* Copyright (c) 1990, 1993, 19944* The Regents of the University of California. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14* 3. Neither the name of the University nor the names of its contributors15* may be used to endorse or promote products derived from this software16* without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND19* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE21* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE22* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL23* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS24* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT26* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY27* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGE.29*/3031#include <sys/param.h>3233#include <stdio.h>34#include <stdlib.h>35#include <string.h>3637#include <db.h>38#include "recno.h"3940/*41* __rec_ret --42* Build return data.43*44* Parameters:45* t: tree46* e: key/data pair to be returned47* nrec: record number48* key: user's key structure49* data: user's data structure50*51* Returns:52* RET_SUCCESS, RET_ERROR.53*/54int55__rec_ret(BTREE *t, EPG *e, recno_t nrec, DBT *key, DBT *data)56{57RLEAF *rl;58void *p;5960if (key == NULL)61goto dataonly;6263/* We have to copy the key, it's not on the page. */64if (sizeof(recno_t) > t->bt_rkey.size) {65p = realloc(t->bt_rkey.data, sizeof(recno_t));66if (p == NULL)67return (RET_ERROR);68t->bt_rkey.data = p;69t->bt_rkey.size = sizeof(recno_t);70}71memmove(t->bt_rkey.data, &nrec, sizeof(recno_t));72key->size = sizeof(recno_t);73key->data = t->bt_rkey.data;7475dataonly:76if (data == NULL)77return (RET_SUCCESS);7879/*80* We must copy big keys/data to make them contigous. Otherwise,81* leave the page pinned and don't copy unless the user specified82* concurrent access.83*/84rl = GETRLEAF(e->page, e->index);85if (rl->flags & P_BIGDATA) {86if (__ovfl_get(t, rl->bytes,87&data->size, &t->bt_rdata.data, &t->bt_rdata.size))88return (RET_ERROR);89data->data = t->bt_rdata.data;90} else if (F_ISSET(t, B_DB_LOCK)) {91/* Use +1 in case the first record retrieved is 0 length. */92if (rl->dsize + 1 > t->bt_rdata.size) {93p = realloc(t->bt_rdata.data, rl->dsize + 1);94if (p == NULL)95return (RET_ERROR);96t->bt_rdata.data = p;97t->bt_rdata.size = rl->dsize + 1;98}99memmove(t->bt_rdata.data, rl->bytes, rl->dsize);100data->size = rl->dsize;101data->data = t->bt_rdata.data;102} else {103data->size = rl->dsize;104data->data = rl->bytes;105}106return (RET_SUCCESS);107}108109110