Asterisk - The Open Source Telephony Project
GIT-master-f36a736
utils
db1-ast
recno
rec_utils.c
Go to the documentation of this file.
1
/*-
2
* Copyright (c) 1990, 1993, 1994
3
* The Regents of the University of California. All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. All advertising materials mentioning features or use of this software
14
* must display the following acknowledgement:
15
* This product includes software developed by the University of
16
* California, Berkeley and its contributors.
17
* 4. Neither the name of the University nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*/
33
34
#if defined(LIBC_SCCS) && !defined(lint)
35
static
char
sccsid[] =
"@(#)rec_utils.c 8.6 (Berkeley) 7/16/94"
;
36
#endif
/* LIBC_SCCS and not lint */
37
38
#include <sys/param.h>
39
40
#include <stdio.h>
41
#include <stdlib.h>
42
#include <string.h>
43
44
#include "../include/db.h"
45
#include "
recno.h
"
46
47
/*
48
* __rec_ret --
49
* Build return data.
50
*
51
* Parameters:
52
* t: tree
53
* e: key/data pair to be returned
54
* nrec: record number
55
* key: user's key structure
56
* data: user's data structure
57
*
58
* Returns:
59
* RET_SUCCESS, RET_ERROR.
60
*/
61
int
62
__rec_ret
(t, e, nrec, key, data)
63
BTREE
*t;
64
EPG
*e;
65
recno_t
nrec;
66
DBT
*key, *data;
67
{
68
RLEAF
*rl;
69
void
*p;
70
71
if
(key ==
NULL
)
72
goto
dataonly;
73
74
/* We have to copy the key, it's not on the page. */
75
if
(
sizeof
(
recno_t
) > t->
bt_rkey
.
size
) {
76
p = (
void
*)(t->
bt_rkey
.
data
==
NULL
?
77
malloc
(
sizeof
(
recno_t
)) :
78
realloc
(t->
bt_rkey
.
data
,
sizeof
(
recno_t
)));
79
if
(p ==
NULL
)
80
return
(
RET_ERROR
);
81
t->
bt_rkey
.
data
= p;
82
t->
bt_rkey
.
size
=
sizeof
(
recno_t
);
83
}
84
memmove(t->
bt_rkey
.
data
, &nrec,
sizeof
(
recno_t
));
85
key->
size
=
sizeof
(
recno_t
);
86
key->
data
= t->
bt_rkey
.
data
;
87
88
dataonly:
89
if
(data ==
NULL
)
90
return
(
RET_SUCCESS
);
91
92
/*
93
* We must copy big keys/data to make them contiguous. Otherwise,
94
* leave the page pinned and don't copy unless the user specified
95
* concurrent access.
96
*/
97
rl =
GETRLEAF
(e->
page
, e->
index
);
98
if
(rl->
flags
&
P_BIGDATA
) {
99
if
(
__ovfl_get
(t, rl->
bytes
,
100
&data->
size
, &t->
bt_rdata
.
data
, &t->
bt_rdata
.
size
))
101
return
(
RET_ERROR
);
102
data->
data
= t->
bt_rdata
.
data
;
103
}
else
if
(
F_ISSET
(t,
B_DB_LOCK
)) {
104
/* Use +1 in case the first record retrieved is 0 length. */
105
if
(rl->
dsize
+ 1 > t->
bt_rdata
.
size
) {
106
p = (
void
*)(t->
bt_rdata
.
data
==
NULL
?
107
malloc
(rl->
dsize
+ 1) :
108
realloc
(t->
bt_rdata
.
data
, rl->
dsize
+ 1));
109
if
(p ==
NULL
)
110
return
(
RET_ERROR
);
111
t->
bt_rdata
.
data
= p;
112
t->
bt_rdata
.
size
= rl->
dsize
+ 1;
113
}
114
memmove(t->
bt_rdata
.
data
, rl->
bytes
, rl->
dsize
);
115
data->
size
= rl->
dsize
;
116
data->
data
= t->
bt_rdata
.
data
;
117
}
else
{
118
data->
size
= rl->
dsize
;
119
data->
data
= rl->
bytes
;
120
}
121
return
(
RET_SUCCESS
);
122
}
realloc
#define realloc(a, b)
Definition:
astmm.h:161
__ovfl_get
int __ovfl_get(BTREE *t, void *p, size_t *ssz, void **buf, size_t *bufsz)
Definition:
bt_overflow.c:80
F_ISSET
#define F_ISSET(p, f)
Definition:
btree.h:42
P_BIGDATA
#define P_BIGDATA
Definition:
btree.h:131
GETRLEAF
#define GETRLEAF(pg, indx)
Definition:
btree.h:220
B_DB_LOCK
#define B_DB_LOCK
Definition:
btree.h:385
RET_SUCCESS
#define RET_SUCCESS
Definition:
db.h:52
recno_t
u_int32_t recno_t
Definition:
db.h:82
RET_ERROR
#define RET_ERROR
Definition:
db.h:51
malloc
char * malloc()
__rec_ret
int __rec_ret(BTREE *t, EPG *e, recno_t nrec, DBT *key, DBT *data)
Definition:
rec_utils.c:62
recno.h
NULL
#define NULL
Definition:
resample.c:96
DBT
Definition:
db.h:85
DBT::data
void * data
Definition:
db.h:86
DBT::size
size_t size
Definition:
db.h:87
_btree
Definition:
btree.h:312
_btree::bt_rkey
DBT bt_rkey
Definition:
btree.h:332
_btree::bt_rdata
DBT bt_rdata
Definition:
btree.h:333
_epg
Definition:
btree.h:254
_epg::index
indx_t index
Definition:
btree.h:256
_epg::page
PAGE * page
Definition:
btree.h:255
_rleaf
Definition:
btree.h:213
_rleaf::flags
u_char flags
Definition:
btree.h:215
_rleaf::bytes
char bytes[1]
Definition:
btree.h:216
_rleaf::dsize
u_int32_t dsize
Definition:
btree.h:214
Generated on Wed Dec 18 2024 20:04:23 for Asterisk - The Open Source Telephony Project by
1.9.4