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