]> git.saurik.com Git - apple/libc.git/blame - db/btree/bt_close.c
Libc-262.3.2.tar.gz
[apple/libc.git] / db / btree / bt_close.c
CommitLineData
e9ce8d39
A
1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
734aad71 6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
e9ce8d39 7 *
734aad71
A
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
e9ce8d39
A
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
734aad71
A
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
e9ce8d39
A
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25/*
26 * Copyright (c) 1990, 1993
27 * The Regents of the University of California. All rights reserved.
28 *
29 * This code is derived from software contributed to Berkeley by
30 * Mike Olson.
31 *
32 * Redistribution and use in source and binary forms, with or without
33 * modification, are permitted provided that the following conditions
34 * are met:
35 * 1. Redistributions of source code must retain the above copyright
36 * notice, this list of conditions and the following disclaimer.
37 * 2. Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in the
39 * documentation and/or other materials provided with the distribution.
40 * 3. All advertising materials mentioning features or use of this software
41 * must display the following acknowledgement:
42 * This product includes software developed by the University of
43 * California, Berkeley and its contributors.
44 * 4. Neither the name of the University nor the names of its contributors
45 * may be used to endorse or promote products derived from this software
46 * without specific prior written permission.
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 */
60
61
62#include <sys/param.h>
63
64#include <errno.h>
65#include <stdio.h>
66#include <stdlib.h>
67#include <string.h>
68#include <unistd.h>
69
70#include <db.h>
71#include "btree.h"
72
73static int bt_meta __P((BTREE *));
74
75/*
76 * BT_CLOSE -- Close a btree.
77 *
78 * Parameters:
79 * dbp: pointer to access method
80 *
81 * Returns:
82 * RET_ERROR, RET_SUCCESS
83 */
84int
85__bt_close(dbp)
86 DB *dbp;
87{
88 BTREE *t;
89 int fd;
90
91 t = dbp->internal;
92
93 /* Toss any page pinned across calls. */
94 if (t->bt_pinned != NULL) {
95 mpool_put(t->bt_mp, t->bt_pinned, 0);
96 t->bt_pinned = NULL;
97 }
98
99 /*
100 * Delete any already deleted record that we've been saving
101 * because the cursor pointed to it.
102 */
103 if (ISSET(t, B_DELCRSR) && __bt_crsrdel(t, &t->bt_bcursor))
104 return (RET_ERROR);
105
106 if (__bt_sync(dbp, 0) == RET_ERROR)
107 return (RET_ERROR);
108
109 if (mpool_close(t->bt_mp) == RET_ERROR)
110 return (RET_ERROR);
111
112 if (t->bt_stack)
113 free(t->bt_stack);
114 if (t->bt_kbuf)
115 free(t->bt_kbuf);
116 if (t->bt_dbuf)
117 free(t->bt_dbuf);
118
119 fd = t->bt_fd;
120 free(t);
121 free(dbp);
122 return (close(fd) ? RET_ERROR : RET_SUCCESS);
123}
124
125/*
126 * BT_SYNC -- sync the btree to disk.
127 *
128 * Parameters:
129 * dbp: pointer to access method
130 *
131 * Returns:
132 * RET_SUCCESS, RET_ERROR.
133 */
134int
135__bt_sync(dbp, flags)
136 const DB *dbp;
137 u_int flags;
138{
139 BTREE *t;
140 int status;
141 PAGE *h;
142 void *p;
143
144 t = dbp->internal;
145
146 /* Toss any page pinned across calls. */
147 if (t->bt_pinned != NULL) {
148 mpool_put(t->bt_mp, t->bt_pinned, 0);
149 t->bt_pinned = NULL;
150 }
151
152 /* Sync doesn't currently take any flags. */
153 if (flags != 0) {
154 errno = EINVAL;
155 return (RET_ERROR);
156 }
157
158 if (ISSET(t, B_INMEM | B_RDONLY) || !ISSET(t, B_MODIFIED))
159 return (RET_SUCCESS);
160
161 if (ISSET(t, B_METADIRTY) && bt_meta(t) == RET_ERROR)
162 return (RET_ERROR);
163
164 /*
165 * Nastiness. If the cursor has been marked for deletion, but not
166 * actually deleted, we have to make a copy of the page, delete the
167 * key/data item, sync the file, and then restore the original page
168 * contents.
169 */
170 if (ISSET(t, B_DELCRSR)) {
171 if ((p = (void *)malloc(t->bt_psize)) == NULL)
172 return (RET_ERROR);
173 if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
174 return (RET_ERROR);
175 memmove(p, h, t->bt_psize);
176 if ((status =
177 __bt_dleaf(t, h, t->bt_bcursor.index)) == RET_ERROR)
178 goto ecrsr;
179 mpool_put(t->bt_mp, h, MPOOL_DIRTY);
180 }
181
182 if ((status = mpool_sync(t->bt_mp)) == RET_SUCCESS)
183 CLR(t, B_MODIFIED);
184
185ecrsr: if (ISSET(t, B_DELCRSR)) {
186 if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
187 return (RET_ERROR);
188 memmove(h, p, t->bt_psize);
189 free(p);
190 mpool_put(t->bt_mp, h, MPOOL_DIRTY);
191 }
192 return (status);
193}
194
195/*
196 * BT_META -- write the tree meta data to disk.
197 *
198 * Parameters:
199 * t: tree
200 *
201 * Returns:
202 * RET_ERROR, RET_SUCCESS
203 */
204static int
205bt_meta(t)
206 BTREE *t;
207{
208 BTMETA m;
209 void *p;
210
211 if ((p = mpool_get(t->bt_mp, P_META, 0)) == NULL)
212 return (RET_ERROR);
213
214 /* Fill in metadata. */
215 m.m_magic = BTREEMAGIC;
216 m.m_version = BTREEVERSION;
217 m.m_psize = t->bt_psize;
218 m.m_free = t->bt_free;
219 m.m_nrecs = t->bt_nrecs;
220 m.m_flags = t->bt_flags & SAVEMETA;
221
222 memmove(p, &m, sizeof(BTMETA));
223 mpool_put(t->bt_mp, p, MPOOL_DIRTY);
224 return (RET_SUCCESS);
225}