34 #if defined(LIBC_SCCS) && !defined(lint)
35 static char sccsid[] =
"@(#)rec_close.c 8.6 (Berkeley) 8/18/94";
38 #include <sys/types.h>
47 #include "../include/db.h"
69 if (t->bt_pinned != NULL) {
70 mpool_put(t->bt_mp, t->bt_pinned, 0);
74 if (__rec_sync(dbp, 0) == RET_ERROR)
79 if (F_ISSET(t, R_MEMMAPPED) && munmap(t->bt_smap, t->bt_msize))
82 if (!F_ISSET(t, R_INMEM)) {
83 if (F_ISSET(t, R_CLOSEFP)) {
84 if (fclose(t->bt_rfp))
91 if (__bt_close(dbp) == RET_ERROR)
107 __rec_sync(dbp, flags)
115 recno_t scursor, trec;
121 if (t->bt_pinned != NULL) {
122 mpool_put(t->bt_mp, t->bt_pinned, 0);
126 if (flags == R_RECNOSYNC)
127 return (__bt_sync(dbp, 0));
129 if (F_ISSET(t, R_RDONLY | R_INMEM) || !F_ISSET(t, R_MODIFIED))
130 return (RET_SUCCESS);
133 if (!F_ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
137 if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
141 scursor = t->bt_cursor.rcursor;
143 key.size =
sizeof(recno_t);
146 if (F_ISSET(t, R_FIXLEN)) {
152 status = (dbp->seq)(dbp, &key, &data, R_FIRST);
153 while (status == RET_SUCCESS) {
154 if ((
size_t) write(t->bt_rfd, data.data, data.size) != data.size)
156 status = (dbp->seq)(dbp, &key, &data, R_NEXT);
159 iov[1].iov_base = &t->bt_bval;
162 status = (dbp->seq)(dbp, &key, &data, R_FIRST);
163 while (status == RET_SUCCESS) {
164 iov[0].iov_base = data.data;
165 iov[0].iov_len = data.size;
166 if ((
size_t) writev(t->bt_rfd, iov, 2) != data.size + 1)
168 status = (dbp->seq)(dbp, &key, &data, R_NEXT);
173 t->bt_cursor.rcursor = scursor;
175 if (status == RET_ERROR)
177 if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
179 if (ftruncate(t->bt_rfd, off))
181 F_CLR(t, R_MODIFIED);
182 return (RET_SUCCESS);