1*54925bf6Swillf /*-
2*54925bf6Swillf * Copyright (c) 1990, 1993, 1994
3*54925bf6Swillf * The Regents of the University of California. All rights reserved.
4*54925bf6Swillf *
5*54925bf6Swillf * This code is derived from software contributed to Berkeley by
6*54925bf6Swillf * Mike Olson.
7*54925bf6Swillf *
8*54925bf6Swillf * Redistribution and use in source and binary forms, with or without
9*54925bf6Swillf * modification, are permitted provided that the following conditions
10*54925bf6Swillf * are met:
11*54925bf6Swillf * 1. Redistributions of source code must retain the above copyright
12*54925bf6Swillf * notice, this list of conditions and the following disclaimer.
13*54925bf6Swillf * 2. Redistributions in binary form must reproduce the above copyright
14*54925bf6Swillf * notice, this list of conditions and the following disclaimer in the
15*54925bf6Swillf * documentation and/or other materials provided with the distribution.
16*54925bf6Swillf * 3. All advertising materials mentioning features or use of this software
17*54925bf6Swillf * must display the following acknowledgement:
18*54925bf6Swillf * This product includes software developed by the University of
19*54925bf6Swillf * California, Berkeley and its contributors.
20*54925bf6Swillf * 4. Neither the name of the University nor the names of its contributors
21*54925bf6Swillf * may be used to endorse or promote products derived from this software
22*54925bf6Swillf * without specific prior written permission.
23*54925bf6Swillf *
24*54925bf6Swillf * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25*54925bf6Swillf * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26*54925bf6Swillf * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27*54925bf6Swillf * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28*54925bf6Swillf * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29*54925bf6Swillf * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30*54925bf6Swillf * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31*54925bf6Swillf * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32*54925bf6Swillf * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33*54925bf6Swillf * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34*54925bf6Swillf * SUCH DAMAGE.
35*54925bf6Swillf */
36*54925bf6Swillf
37*54925bf6Swillf #if defined(LIBC_SCCS) && !defined(lint)
38*54925bf6Swillf static char sccsid[] = "@(#)bt_conv.c 8.5 (Berkeley) 8/17/94";
39*54925bf6Swillf #endif /* LIBC_SCCS and not lint */
40*54925bf6Swillf
41*54925bf6Swillf #include <sys/param.h>
42*54925bf6Swillf
43*54925bf6Swillf #include <stdio.h>
44*54925bf6Swillf
45*54925bf6Swillf #include "db-int.h"
46*54925bf6Swillf #include "btree.h"
47*54925bf6Swillf
48*54925bf6Swillf static void mswap __P((PAGE *));
49*54925bf6Swillf
50*54925bf6Swillf /*
51*54925bf6Swillf * __BT_BPGIN, __BT_BPGOUT --
52*54925bf6Swillf * Convert host-specific number layout to/from the host-independent
53*54925bf6Swillf * format stored on disk.
54*54925bf6Swillf *
55*54925bf6Swillf * Parameters:
56*54925bf6Swillf * t: tree
57*54925bf6Swillf * pg: page number
58*54925bf6Swillf * h: page to convert
59*54925bf6Swillf */
60*54925bf6Swillf void
__bt_pgin(t,pg,pp)61*54925bf6Swillf __bt_pgin(t, pg, pp)
62*54925bf6Swillf void *t;
63*54925bf6Swillf db_pgno_t pg;
64*54925bf6Swillf void *pp;
65*54925bf6Swillf {
66*54925bf6Swillf PAGE *h;
67*54925bf6Swillf indx_t i, top;
68*54925bf6Swillf u_char flags;
69*54925bf6Swillf char *p;
70*54925bf6Swillf
71*54925bf6Swillf if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
72*54925bf6Swillf return;
73*54925bf6Swillf if (pg == P_META) {
74*54925bf6Swillf mswap(pp);
75*54925bf6Swillf return;
76*54925bf6Swillf }
77*54925bf6Swillf
78*54925bf6Swillf h = pp;
79*54925bf6Swillf M_32_SWAP(h->pgno);
80*54925bf6Swillf M_32_SWAP(h->prevpg);
81*54925bf6Swillf M_32_SWAP(h->nextpg);
82*54925bf6Swillf M_32_SWAP(h->flags);
83*54925bf6Swillf M_16_SWAP(h->lower);
84*54925bf6Swillf M_16_SWAP(h->upper);
85*54925bf6Swillf
86*54925bf6Swillf top = NEXTINDEX(h);
87*54925bf6Swillf if ((h->flags & P_TYPE) == P_BINTERNAL)
88*54925bf6Swillf for (i = 0; i < top; i++) {
89*54925bf6Swillf M_16_SWAP(h->linp[i]);
90*54925bf6Swillf p = (char *)GETBINTERNAL(h, i);
91*54925bf6Swillf P_32_SWAP(p);
92*54925bf6Swillf p += sizeof(u_int32_t);
93*54925bf6Swillf P_32_SWAP(p);
94*54925bf6Swillf p += sizeof(db_pgno_t);
95*54925bf6Swillf if (*(u_char *)p & P_BIGKEY) {
96*54925bf6Swillf p += sizeof(u_char);
97*54925bf6Swillf P_32_SWAP(p);
98*54925bf6Swillf p += sizeof(db_pgno_t);
99*54925bf6Swillf P_32_SWAP(p);
100*54925bf6Swillf }
101*54925bf6Swillf }
102*54925bf6Swillf else if ((h->flags & P_TYPE) == P_BLEAF)
103*54925bf6Swillf for (i = 0; i < top; i++) {
104*54925bf6Swillf M_16_SWAP(h->linp[i]);
105*54925bf6Swillf p = (char *)GETBLEAF(h, i);
106*54925bf6Swillf P_32_SWAP(p);
107*54925bf6Swillf p += sizeof(u_int32_t);
108*54925bf6Swillf P_32_SWAP(p);
109*54925bf6Swillf p += sizeof(u_int32_t);
110*54925bf6Swillf flags = *(u_char *)p;
111*54925bf6Swillf if (flags & (P_BIGKEY | P_BIGDATA)) {
112*54925bf6Swillf p += sizeof(u_char);
113*54925bf6Swillf if (flags & P_BIGKEY) {
114*54925bf6Swillf P_32_SWAP(p);
115*54925bf6Swillf p += sizeof(db_pgno_t);
116*54925bf6Swillf P_32_SWAP(p);
117*54925bf6Swillf }
118*54925bf6Swillf if (flags & P_BIGDATA) {
119*54925bf6Swillf p += sizeof(u_int32_t);
120*54925bf6Swillf P_32_SWAP(p);
121*54925bf6Swillf p += sizeof(db_pgno_t);
122*54925bf6Swillf P_32_SWAP(p);
123*54925bf6Swillf }
124*54925bf6Swillf }
125*54925bf6Swillf }
126*54925bf6Swillf }
127*54925bf6Swillf
128*54925bf6Swillf void
__bt_pgout(t,pg,pp)129*54925bf6Swillf __bt_pgout(t, pg, pp)
130*54925bf6Swillf void *t;
131*54925bf6Swillf db_pgno_t pg;
132*54925bf6Swillf void *pp;
133*54925bf6Swillf {
134*54925bf6Swillf PAGE *h;
135*54925bf6Swillf indx_t i, top;
136*54925bf6Swillf u_char flags;
137*54925bf6Swillf char *p;
138*54925bf6Swillf
139*54925bf6Swillf if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
140*54925bf6Swillf return;
141*54925bf6Swillf if (pg == P_META) {
142*54925bf6Swillf mswap(pp);
143*54925bf6Swillf return;
144*54925bf6Swillf }
145*54925bf6Swillf
146*54925bf6Swillf h = pp;
147*54925bf6Swillf top = NEXTINDEX(h);
148*54925bf6Swillf if ((h->flags & P_TYPE) == P_BINTERNAL)
149*54925bf6Swillf for (i = 0; i < top; i++) {
150*54925bf6Swillf p = (char *)GETBINTERNAL(h, i);
151*54925bf6Swillf P_32_SWAP(p);
152*54925bf6Swillf p += sizeof(u_int32_t);
153*54925bf6Swillf P_32_SWAP(p);
154*54925bf6Swillf p += sizeof(db_pgno_t);
155*54925bf6Swillf if (*(u_char *)p & P_BIGKEY) {
156*54925bf6Swillf p += sizeof(u_char);
157*54925bf6Swillf P_32_SWAP(p);
158*54925bf6Swillf p += sizeof(db_pgno_t);
159*54925bf6Swillf P_32_SWAP(p);
160*54925bf6Swillf }
161*54925bf6Swillf M_16_SWAP(h->linp[i]);
162*54925bf6Swillf }
163*54925bf6Swillf else if ((h->flags & P_TYPE) == P_BLEAF)
164*54925bf6Swillf for (i = 0; i < top; i++) {
165*54925bf6Swillf p = (char *)GETBLEAF(h, i);
166*54925bf6Swillf P_32_SWAP(p);
167*54925bf6Swillf p += sizeof(u_int32_t);
168*54925bf6Swillf P_32_SWAP(p);
169*54925bf6Swillf p += sizeof(u_int32_t);
170*54925bf6Swillf flags = *(u_char *)p;
171*54925bf6Swillf if (flags & (P_BIGKEY | P_BIGDATA)) {
172*54925bf6Swillf p += sizeof(u_char);
173*54925bf6Swillf if (flags & P_BIGKEY) {
174*54925bf6Swillf P_32_SWAP(p);
175*54925bf6Swillf p += sizeof(db_pgno_t);
176*54925bf6Swillf P_32_SWAP(p);
177*54925bf6Swillf }
178*54925bf6Swillf if (flags & P_BIGDATA) {
179*54925bf6Swillf p += sizeof(u_int32_t);
180*54925bf6Swillf P_32_SWAP(p);
181*54925bf6Swillf p += sizeof(db_pgno_t);
182*54925bf6Swillf P_32_SWAP(p);
183*54925bf6Swillf }
184*54925bf6Swillf }
185*54925bf6Swillf M_16_SWAP(h->linp[i]);
186*54925bf6Swillf }
187*54925bf6Swillf
188*54925bf6Swillf M_32_SWAP(h->pgno);
189*54925bf6Swillf M_32_SWAP(h->prevpg);
190*54925bf6Swillf M_32_SWAP(h->nextpg);
191*54925bf6Swillf M_32_SWAP(h->flags);
192*54925bf6Swillf M_16_SWAP(h->lower);
193*54925bf6Swillf M_16_SWAP(h->upper);
194*54925bf6Swillf }
195*54925bf6Swillf
196*54925bf6Swillf /*
197*54925bf6Swillf * MSWAP -- Actually swap the bytes on the meta page.
198*54925bf6Swillf *
199*54925bf6Swillf * Parameters:
200*54925bf6Swillf * p: page to convert
201*54925bf6Swillf */
202*54925bf6Swillf static void
mswap(pg)203*54925bf6Swillf mswap(pg)
204*54925bf6Swillf PAGE *pg;
205*54925bf6Swillf {
206*54925bf6Swillf char *p;
207*54925bf6Swillf
208*54925bf6Swillf p = (char *)pg;
209*54925bf6Swillf P_32_SWAP(p); /* magic */
210*54925bf6Swillf p += sizeof(u_int32_t);
211*54925bf6Swillf P_32_SWAP(p); /* version */
212*54925bf6Swillf p += sizeof(u_int32_t);
213*54925bf6Swillf P_32_SWAP(p); /* psize */
214*54925bf6Swillf p += sizeof(u_int32_t);
215*54925bf6Swillf P_32_SWAP(p); /* free */
216*54925bf6Swillf p += sizeof(u_int32_t);
217*54925bf6Swillf P_32_SWAP(p); /* nrecs */
218*54925bf6Swillf p += sizeof(u_int32_t);
219*54925bf6Swillf P_32_SWAP(p); /* flags */
220*54925bf6Swillf p += sizeof(u_int32_t);
221*54925bf6Swillf }
222