home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / EDITOR / NVI179B / NVI179B.ZIP / db / btree / bt_close.c next >
C/C++ Source or Header  |  1994-08-18  |  5KB  |  183 lines

  1. /*-
  2.  * Copyright (c) 1990, 1993, 1994
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Mike Olson.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #if defined(LIBC_SCCS) && !defined(lint)
  38. static char sccsid[] = "@(#)bt_close.c    8.7 (Berkeley) 8/17/94";
  39. #endif /* LIBC_SCCS and not lint */
  40.  
  41. #include <sys/param.h>
  42.  
  43. #include <errno.h>
  44. #include <stdio.h>
  45. #include <stdlib.h>
  46. #include <string.h>
  47. #include <unistd.h>
  48.  
  49. #include <db.h>
  50. #include "btree.h"
  51.  
  52. static int bt_meta __P((BTREE *));
  53.  
  54. /*
  55.  * BT_CLOSE -- Close a btree.
  56.  *
  57.  * Parameters:
  58.  *    dbp:    pointer to access method
  59.  *
  60.  * Returns:
  61.  *    RET_ERROR, RET_SUCCESS
  62.  */
  63. int
  64. __bt_close(dbp)
  65.     DB *dbp;
  66. {
  67.     BTREE *t;
  68.     int fd;
  69.  
  70.     t = dbp->internal;
  71.  
  72.     /* Toss any page pinned across calls. */
  73.     if (t->bt_pinned != NULL) {
  74.         mpool_put(t->bt_mp, t->bt_pinned, 0);
  75.         t->bt_pinned = NULL;
  76.     }
  77.  
  78.     /* Sync the tree. */
  79.     if (__bt_sync(dbp, 0) == RET_ERROR)
  80.         return (RET_ERROR);
  81.  
  82.     /* Close the memory pool. */
  83.     if (mpool_close(t->bt_mp) == RET_ERROR)
  84.         return (RET_ERROR);
  85.  
  86.     /* Free random memory. */
  87.     if (t->bt_cursor.key.data != NULL) {
  88.         free(t->bt_cursor.key.data);
  89.         t->bt_cursor.key.size = 0;
  90.         t->bt_cursor.key.data = NULL;
  91.     }
  92.     if (t->bt_rkey.data) {
  93.         free(t->bt_rkey.data);
  94.         t->bt_rkey.size = 0;
  95.         t->bt_rkey.data = NULL;
  96.     }
  97.     if (t->bt_rdata.data) {
  98.         free(t->bt_rdata.data);
  99.         t->bt_rdata.size = 0;
  100.         t->bt_rdata.data = NULL;
  101.     }
  102.  
  103.     fd = t->bt_fd;
  104.     free(t);
  105.     free(dbp);
  106.     return (close(fd) ? RET_ERROR : RET_SUCCESS);
  107. }
  108.  
  109. /*
  110.  * BT_SYNC -- sync the btree to disk.
  111.  *
  112.  * Parameters:
  113.  *    dbp:    pointer to access method
  114.  *
  115.  * Returns:
  116.  *    RET_SUCCESS, RET_ERROR.
  117.  */
  118. int
  119. __bt_sync(dbp, flags)
  120.     const DB *dbp;
  121.     u_int flags;
  122. {
  123.     BTREE *t;
  124.     int status;
  125.  
  126.     t = dbp->internal;
  127.  
  128.     /* Toss any page pinned across calls. */
  129.     if (t->bt_pinned != NULL) {
  130.         mpool_put(t->bt_mp, t->bt_pinned, 0);
  131.         t->bt_pinned = NULL;
  132.     }
  133.  
  134.     /* Sync doesn't currently take any flags. */
  135.     if (flags != 0) {
  136.         errno = EINVAL;
  137.         return (RET_ERROR);
  138.     }
  139.  
  140.     if (F_ISSET(t, B_INMEM | B_RDONLY) || !F_ISSET(t, B_MODIFIED))
  141.         return (RET_SUCCESS);
  142.  
  143.     if (F_ISSET(t, B_METADIRTY) && bt_meta(t) == RET_ERROR)
  144.         return (RET_ERROR);
  145.  
  146.     if ((status = mpool_sync(t->bt_mp)) == RET_SUCCESS)
  147.         F_CLR(t, B_MODIFIED);
  148.  
  149.     return (status);
  150. }
  151.  
  152. /*
  153.  * BT_META -- write the tree meta data to disk.
  154.  *
  155.  * Parameters:
  156.  *    t:    tree
  157.  *
  158.  * Returns:
  159.  *    RET_ERROR, RET_SUCCESS
  160.  */
  161. static int
  162. bt_meta(t)
  163.     BTREE *t;
  164. {
  165.     BTMETA m;
  166.     void *p;
  167.  
  168.     if ((p = mpool_get(t->bt_mp, P_META, 0)) == NULL)
  169.         return (RET_ERROR);
  170.  
  171.     /* Fill in metadata. */
  172.     m.magic = BTREEMAGIC;
  173.     m.version = BTREEVERSION;
  174.     m.psize = t->bt_psize;
  175.     m.free = t->bt_free;
  176.     m.nrecs = t->bt_nrecs;
  177.     m.flags = F_ISSET(t, SAVEMETA);
  178.  
  179.     memmove(p, &m, sizeof(BTMETA));
  180.     mpool_put(t->bt_mp, p, MPOOL_DIRTY);
  181.     return (RET_SUCCESS);
  182. }
  183.