xref: /illumos-gate/usr/src/lib/krb5/plugins/kdb/db2/libdb2/btree/bt_conv.c (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
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