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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: env_file.c,v 1.5 2002/03/08 17:47:18 sue 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. static int __db_overwrite_pass __P((DB_ENV *,
  17.        const char *, DB_FH *, u_int32_t, u_int32_t, u_int32_t));
  18. /*
  19.  * __db_fileinit --
  20.  * Initialize a regular file, optionally zero-filling it as well.
  21.  *
  22.  * PUBLIC: int __db_fileinit __P((DB_ENV *, DB_FH *, size_t, int));
  23.  */
  24. int
  25. __db_fileinit(dbenv, fhp, size, zerofill)
  26. DB_ENV *dbenv;
  27. DB_FH *fhp;
  28. size_t size;
  29. int zerofill;
  30. {
  31. db_pgno_t pages;
  32. size_t i;
  33. size_t nw;
  34. u_int32_t relative;
  35. int ret;
  36. char buf[OS_VMPAGESIZE];
  37. /* Write nuls to the new bytes. */
  38. memset(buf, 0, sizeof(buf));
  39. /*
  40.  * Extend the region by writing the last page.  If the region is >4Gb,
  41.  * increment may be larger than the maximum possible seek "relative"
  42.  * argument, as it's an unsigned 32-bit value.  Break the offset into
  43.  * pages of 1MB each so that we don't overflow (2^20 + 2^32 is bigger
  44.  * than any memory I expect to see for awhile).
  45.  */
  46. if ((ret = __os_seek(dbenv, fhp, 0, 0, 0, 0, DB_OS_SEEK_END)) != 0)
  47. return (ret);
  48. pages = (db_pgno_t)((size - OS_VMPAGESIZE) / MEGABYTE);
  49. relative = (u_int32_t)((size - OS_VMPAGESIZE) % MEGABYTE);
  50. if ((ret = __os_seek(dbenv,
  51.     fhp, MEGABYTE, pages, relative, 0, DB_OS_SEEK_CUR)) != 0)
  52. return (ret);
  53. if ((ret = __os_write(dbenv, fhp, buf, sizeof(buf), &nw)) != 0)
  54. return (ret);
  55. /*
  56.  * We may want to guarantee that there is enough disk space for the
  57.  * file, so we also write a byte to each page.  We write the byte
  58.  * because reading it is insufficient on systems smart enough not to
  59.  * instantiate disk pages to satisfy a read (e.g., Solaris).
  60.  */
  61. if (zerofill) {
  62. pages = (db_pgno_t)(size / MEGABYTE);
  63. relative = (u_int32_t)(size % MEGABYTE);
  64. if ((ret = __os_seek(dbenv, fhp,
  65.     MEGABYTE, pages, relative, 1, DB_OS_SEEK_END)) != 0)
  66. return (ret);
  67. /* Write a byte to each page. */
  68. for (i = 0; i < size; i += OS_VMPAGESIZE) {
  69. if ((ret = __os_write(dbenv, fhp, buf, 1, &nw)) != 0)
  70. return (ret);
  71. if ((ret = __os_seek(dbenv, fhp,
  72.     0, 0, OS_VMPAGESIZE - 1, 0, DB_OS_SEEK_CUR)) != 0)
  73. return (ret);
  74. }
  75. }
  76. return (0);
  77. }
  78. /*
  79.  * __db_overwrite  --
  80.  * Overwrite a file.
  81.  *
  82.  * PUBLIC: int __db_overwrite __P((DB_ENV *, const char *));
  83.  */
  84. int
  85. __db_overwrite(dbenv, path)
  86. DB_ENV *dbenv;
  87. const char *path;
  88. {
  89. DB_FH fh, *fhp;
  90. u_int32_t mbytes, bytes;
  91. int ret;
  92. fhp = &fh;
  93. if ((ret = __os_open(dbenv, path, DB_OSO_REGION, 0, fhp)) == 0 &&
  94.     (ret = __os_ioinfo(dbenv, path, fhp, &mbytes, &bytes, NULL)) == 0) {
  95. /*
  96.  * !!!
  97.  * Overwrite a regular file with alternating 0xff, 0x00 and 0xff
  98.  * byte patterns.  Implies a fixed-block filesystem, journaling
  99.  * or logging filesystems will require operating system support.
  100.  */
  101. if ((ret = __db_overwrite_pass(
  102.     dbenv, path, fhp, mbytes, bytes, 0xff)) != 0)
  103. goto err;
  104. if ((ret = __db_overwrite_pass(
  105.     dbenv, path, fhp, mbytes, bytes, 0x00)) != 0)
  106. goto err;
  107. if ((ret = __db_overwrite_pass(
  108.     dbenv, path, fhp, mbytes, bytes, 0xff)) != 0)
  109. goto err;
  110. } else
  111. __db_err(dbenv, "%s: %s", path, db_strerror(ret));
  112. err: if (F_ISSET(fhp, DB_FH_VALID))
  113. __os_closehandle(dbenv, fhp);
  114. return (ret);
  115. }
  116. /*
  117.  * __db_overwrite_pass --
  118.  * A single pass over the file, writing the specified byte pattern.
  119.  */
  120. static int
  121. __db_overwrite_pass(dbenv, path, fhp, mbytes, bytes, pattern)
  122. DB_ENV *dbenv;
  123. const char *path;
  124. DB_FH *fhp;
  125. u_int32_t mbytes, bytes, pattern;
  126. {
  127. size_t len, nw;
  128. int i, ret;
  129. char buf[8 * 1024];
  130. if ((ret = __os_seek(dbenv, fhp, 0, 0, 0, 0, DB_OS_SEEK_SET)) != 0)
  131. goto err;
  132. memset(buf, pattern, sizeof(buf));
  133. for (; mbytes > 0; --mbytes)
  134. for (i = MEGABYTE / sizeof(buf); i > 0; --i)
  135. if ((ret =
  136.     __os_write(dbenv, fhp, buf, sizeof(buf), &nw)) != 0)
  137. goto err;
  138. for (; bytes > 0; bytes -= (u_int32_t)len) {
  139. len = bytes < sizeof(buf) ? bytes : sizeof(buf);
  140. if ((ret = __os_write(dbenv, fhp, buf, len, &nw)) != 0)
  141. goto err;
  142. }
  143. if ((ret = __os_fsync(dbenv, fhp)) != 0)
  144. err: __db_err(dbenv, "%s: %s", path, db_strerror(ret));
  145. return (ret);
  146. }