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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2001-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_truncate.c,v 11.185 2002/08/07 16:16:48 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 "dbinc/db_page.h"
  16. #include "dbinc/btree.h"
  17. #include "dbinc/hash.h"
  18. #include "dbinc/qam.h"
  19. /*
  20.  * __db_truncate
  21.  * truncate method for DB.
  22.  *
  23.  * PUBLIC: int __db_truncate __P((DB *, DB_TXN *, u_int32_t *, u_int32_t));
  24.  */
  25. int
  26. __db_truncate(dbp, txn, countp, flags)
  27. DB *dbp;
  28. DB_TXN *txn;
  29. u_int32_t *countp, flags;
  30. {
  31. DB_ENV *dbenv;
  32. int ret, t_ret, txn_local;
  33. dbenv = dbp->dbenv;
  34. ret = txn_local = 0;
  35. PANIC_CHECK(dbenv);
  36. /* Check for invalid flags. */
  37. if ((ret =
  38.     __db_fchk(dbenv, "DB->truncate", flags, DB_AUTO_COMMIT)) != 0)
  39. return (ret);
  40. /*
  41.  * Create local transaction as necessary, check for consistent
  42.  * transaction usage.
  43.  */
  44. if (IS_AUTO_COMMIT(dbenv, txn, flags)) {
  45. if ((ret = __db_txn_auto(dbp, &txn)) != 0)
  46. return (ret);
  47. txn_local = 1;
  48. } else
  49. if (txn != NULL && !TXN_ON(dbenv))
  50. return (__db_not_txn_env(dbenv));
  51. DB_TEST_RECOVERY(dbp, DB_TEST_PREDESTROY, ret, NULL);
  52. switch (dbp->type) {
  53. case DB_BTREE:
  54. case DB_RECNO:
  55. if ((ret = __bam_truncate(dbp, txn, countp)) != 0)
  56. goto err;
  57. break;
  58. case DB_HASH:
  59. if ((ret = __ham_truncate(dbp, txn, countp)) != 0)
  60. goto err;
  61. break;
  62. case DB_QUEUE:
  63. if ((ret = __qam_truncate(dbp, txn, countp)) != 0)
  64. goto err;
  65. break;
  66. default:
  67. ret = __db_unknown_type(
  68.     dbenv, "__db_truncate", dbp->type);
  69. goto err;
  70. }
  71. DB_TEST_RECOVERY(dbp, DB_TEST_POSTDESTROY, ret, NULL);
  72. DB_TEST_RECOVERY_LABEL
  73. err:
  74. /* Commit for DB_AUTO_COMMIT. */
  75. if (txn_local) {
  76. if (ret == 0)
  77. ret = txn->commit(txn, 0);
  78. else
  79. if ((t_ret = txn->abort(txn)) != 0)
  80. ret = __db_panic(dbenv, t_ret);
  81. }
  82. return (ret);
  83. }