db_reclaim.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_reclaim.c,v 11.5 2000/04/07 14:26:58 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. #include "db_page.h"
  16. #include "db_am.h"
  17. /*
  18.  * Assume that we enter with a valid pgno.  We traverse a set of
  19.  * duplicate pages.  The format of the callback routine is:
  20.  * callback(dbp, page, cookie, did_put).  did_put is an output
  21.  * value that will be set to 1 by the callback routine if it
  22.  * already put the page back.  Otherwise, this routine must
  23.  * put the page.
  24.  *
  25.  * PUBLIC: int __db_traverse_dup __P((DB *,
  26.  * PUBLIC:    db_pgno_t, int (*)(DB *, PAGE *, void *, int *), void *));
  27.  */
  28. int
  29. __db_traverse_dup(dbp, pgno, callback, cookie)
  30. DB *dbp;
  31. db_pgno_t pgno;
  32. int (*callback) __P((DB *, PAGE *, void *, int *));
  33. void *cookie;
  34. {
  35. PAGE *p;
  36. int did_put, i, opgno, ret;
  37. do {
  38. did_put = 0;
  39. if ((ret = memp_fget(dbp->mpf, &pgno, 0, &p)) != 0)
  40. return (ret);
  41. pgno = NEXT_PGNO(p);
  42. for (i = 0; i < NUM_ENT(p); i++) {
  43. if (B_TYPE(GET_BKEYDATA(p, i)->type) == B_OVERFLOW) {
  44. opgno = GET_BOVERFLOW(p, i)->pgno;
  45. if ((ret = __db_traverse_big(dbp,
  46.     opgno, callback, cookie)) != 0)
  47. goto err;
  48. }
  49. }
  50. if ((ret = callback(dbp, p, cookie, &did_put)) != 0)
  51. goto err;
  52. if (!did_put)
  53. if ((ret = memp_fput(dbp->mpf, p, 0)) != 0)
  54. return (ret);
  55. } while (pgno != PGNO_INVALID);
  56. if (0) {
  57. err: if (did_put == 0)
  58. (void)memp_fput(dbp->mpf, p, 0);
  59. }
  60. return (ret);
  61. }
  62. /*
  63.  * __db_traverse_big
  64.  * Traverse a chain of overflow pages and call the callback routine
  65.  * on each one.  The calling convention for the callback is:
  66.  * callback(dbp, page, cookie, did_put),
  67.  * where did_put is a return value indicating if the page in question has
  68.  * already been returned to the mpool.
  69.  *
  70.  * PUBLIC: int __db_traverse_big __P((DB *,
  71.  * PUBLIC:     db_pgno_t, int (*)(DB *, PAGE *, void *, int *), void *));
  72.  */
  73. int
  74. __db_traverse_big(dbp, pgno, callback, cookie)
  75. DB *dbp;
  76. db_pgno_t pgno;
  77. int (*callback) __P((DB *, PAGE *, void *, int *));
  78. void *cookie;
  79. {
  80. PAGE *p;
  81. int did_put, ret;
  82. do {
  83. did_put = 0;
  84. if ((ret = memp_fget(dbp->mpf, &pgno, 0, &p)) != 0)
  85. return (ret);
  86. pgno = NEXT_PGNO(p);
  87. if ((ret = callback(dbp, p, cookie, &did_put)) == 0 &&
  88.     !did_put)
  89. ret = memp_fput(dbp->mpf, p, 0);
  90. } while (ret == 0 && pgno != PGNO_INVALID);
  91. return (ret);
  92. }
  93. /*
  94.  * __db_reclaim_callback
  95.  * This is the callback routine used during a delete of a subdatabase.
  96.  * we are traversing a btree or hash table and trying to free all the
  97.  * pages.  Since they share common code for duplicates and overflow
  98.  * items, we traverse them identically and use this routine to do the
  99.  * actual free.  The reason that this is callback is because hash uses
  100.  * the same traversal code for statistics gathering.
  101.  *
  102.  * PUBLIC: int __db_reclaim_callback __P((DB *, PAGE *, void *, int *));
  103.  */
  104. int
  105. __db_reclaim_callback(dbp, p, cookie, putp)
  106. DB *dbp;
  107. PAGE *p;
  108. void *cookie;
  109. int *putp;
  110. {
  111. int ret;
  112. COMPQUIET(dbp, NULL);
  113. if ((ret = __db_free(cookie, p)) != 0)
  114. return (ret);
  115. *putp = 1;
  116. return (0);
  117. }