hash_reclaim.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: hash_reclaim.c,v 11.12 2002/03/28 19:49:43 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #endif
  15. #include "db_int.h"
  16. #include "dbinc/db_page.h"
  17. #include "dbinc/hash.h"
  18. /*
  19.  * __ham_reclaim --
  20.  * Reclaim the pages from a subdatabase and return them to the
  21.  * parent free list.  For now, we link each freed page on the list
  22.  * separately.  If people really store hash databases in subdatabases
  23.  * and do a lot of creates and deletes, this is going to be a problem,
  24.  * because hash needs chunks of contiguous storage.  We may eventually
  25.  * need to go to a model where we maintain the free list with chunks of
  26.  * contiguous pages as well.
  27.  *
  28.  * PUBLIC: int __ham_reclaim __P((DB *, DB_TXN *txn));
  29.  */
  30. int
  31. __ham_reclaim(dbp, txn)
  32. DB *dbp;
  33. DB_TXN *txn;
  34. {
  35. DBC *dbc;
  36. HASH_CURSOR *hcp;
  37. int ret;
  38. /* Open up a cursor that we'll use for traversing. */
  39. if ((ret = dbp->cursor(dbp, txn, &dbc, 0)) != 0)
  40. return (ret);
  41. hcp = (HASH_CURSOR *)dbc->internal;
  42. if ((ret = __ham_get_meta(dbc)) != 0)
  43. goto err;
  44. if ((ret = __ham_traverse(dbc,
  45.     DB_LOCK_WRITE, __db_reclaim_callback, dbc, 1)) != 0)
  46. goto err;
  47. if ((ret = dbc->c_close(dbc)) != 0)
  48. goto err;
  49. if ((ret = __ham_release_meta(dbc)) != 0)
  50. goto err;
  51. return (0);
  52. err: if (hcp->hdr != NULL)
  53. (void)__ham_release_meta(dbc);
  54. (void)dbc->c_close(dbc);
  55. return (ret);
  56. }
  57. /*
  58.  * __ham_truncate --
  59.  * Reclaim the pages from a subdatabase and return them to the
  60.  * parent free list.
  61.  *
  62.  * PUBLIC: int __ham_truncate __P((DB *, DB_TXN *txn, u_int32_t *));
  63.  */
  64. int
  65. __ham_truncate(dbp, txn, countp)
  66. DB *dbp;
  67. DB_TXN *txn;
  68. u_int32_t *countp;
  69. {
  70. DBC *dbc;
  71. HASH_CURSOR *hcp;
  72. db_trunc_param trunc;
  73. int ret;
  74. /* Open up a cursor that we'll use for traversing. */
  75. if ((ret = dbp->cursor(dbp, txn, &dbc, 0)) != 0)
  76. return (ret);
  77. hcp = (HASH_CURSOR *)dbc->internal;
  78. if ((ret = __ham_get_meta(dbc)) != 0)
  79. goto err;
  80. trunc.count = 0;
  81. trunc.dbc = dbc;
  82. if ((ret = __ham_traverse(dbc,
  83.     DB_LOCK_WRITE, __db_truncate_callback, &trunc, 1)) != 0)
  84. goto err;
  85. if ((ret = __ham_release_meta(dbc)) != 0)
  86. goto err;
  87. if ((ret = dbc->c_close(dbc)) != 0)
  88. goto err;
  89. *countp = trunc.count;
  90. return (0);
  91. err: if (hcp->hdr != NULL)
  92. (void)__ham_release_meta(dbc);
  93. (void)dbc->c_close(dbc);
  94. return (ret);
  95. }