]> git.saurik.com Git - apple/libc.git/blame - db.subproj/recno.subproj/rec_close.c
Libc-166.tar.gz
[apple/libc.git] / db.subproj / recno.subproj / rec_close.c
CommitLineData
e9ce8d39
A
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 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
28 * are met:
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. All advertising materials mentioning features or use of this software
35 * must display the following acknowledgement:
36 * This product includes software developed by the University of
37 * California, Berkeley and its contributors.
38 * 4. Neither the name of the University nor the names of its contributors
39 * may be used to endorse or promote products derived from this software
40 * without specific prior written permission.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 */
54
55
56#include <sys/types.h>
57#include <sys/uio.h>
58
59#include <mach/mach.h>
60
61#include <errno.h>
62#include <limits.h>
63#include <stdio.h>
64#include <unistd.h>
65
66#include <db.h>
67#include "recno.h"
68
69/*
70 * __REC_CLOSE -- Close a recno tree.
71 *
72 * Parameters:
73 * dbp: pointer to access method
74 *
75 * Returns:
76 * RET_ERROR, RET_SUCCESS
77 */
78int
79__rec_close(dbp)
80 DB *dbp;
81{
82 BTREE *t;
83 int status;
84
85 t = dbp->internal;
86
87 /* Toss any page pinned across calls. */
88 if (t->bt_pinned != NULL) {
89 mpool_put(t->bt_mp, t->bt_pinned, 0);
90 t->bt_pinned = NULL;
91 }
92
93 if (__rec_sync(dbp, 0) == RET_ERROR)
94 return (RET_ERROR);
95
96 /* Committed to closing. */
97 status = RET_SUCCESS;
98 if (ISSET(t, R_MEMMAPPED)
99 && vm_deallocate(mach_task_self(), (vm_offset_t) t->bt_smap, t->bt_msize))
100 status = RET_ERROR;
101
102 if (!ISSET(t, R_INMEM))
103 if (ISSET(t, R_CLOSEFP)) {
104 if (fclose(t->bt_rfp))
105 status = RET_ERROR;
106 } else
107 if (close(t->bt_rfd))
108 status = RET_ERROR;
109
110 if (__bt_close(dbp) == RET_ERROR)
111 status = RET_ERROR;
112
113 return (status);
114}
115
116/*
117 * __REC_SYNC -- sync the recno tree to disk.
118 *
119 * Parameters:
120 * dbp: pointer to access method
121 *
122 * Returns:
123 * RET_SUCCESS, RET_ERROR.
124 */
125int
126__rec_sync(dbp, flags)
127 const DB *dbp;
128 u_int flags;
129{
130 struct iovec iov[2];
131 BTREE *t;
132 DBT data, key;
133 off_t off;
134 recno_t scursor, trec;
135 int status;
136
137 t = dbp->internal;
138
139 /* Toss any page pinned across calls. */
140 if (t->bt_pinned != NULL) {
141 mpool_put(t->bt_mp, t->bt_pinned, 0);
142 t->bt_pinned = NULL;
143 }
144
145 if (flags == R_RECNOSYNC)
146 return (__bt_sync(dbp, 0));
147
148 if (ISSET(t, R_RDONLY | R_INMEM) || !ISSET(t, R_MODIFIED))
149 return (RET_SUCCESS);
150
151 /* Read any remaining records into the tree. */
152 if (!ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
153 return (RET_ERROR);
154
155 /* Rewind the file descriptor. */
156 if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
157 return (RET_ERROR);
158
159 iov[1].iov_base = "\n";
160 iov[1].iov_len = 1;
161 scursor = t->bt_rcursor;
162
163 key.size = sizeof(recno_t);
164 key.data = &trec;
165
166 status = (dbp->seq)(dbp, &key, &data, R_FIRST);
167 while (status == RET_SUCCESS) {
168 iov[0].iov_base = data.data;
169 iov[0].iov_len = data.size;
170 if (writev(t->bt_rfd, iov, 2) != data.size + 1)
171 return (RET_ERROR);
172 status = (dbp->seq)(dbp, &key, &data, R_NEXT);
173 }
174 t->bt_rcursor = scursor;
175 if (status == RET_ERROR)
176 return (RET_ERROR);
177 if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
178 return (RET_ERROR);
179 if (ftruncate(t->bt_rfd, off))
180 return (RET_ERROR);
181 CLR(t, R_MODIFIED);
182 return (RET_SUCCESS);
183}