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

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 copyright[] =
  10.     "Copyright (c) 1996-2002nSleepycat Software Inc.  All rights reserved.n";
  11. static const char revid[] =
  12.     "$Id: db_verify.c,v 1.38 2002/08/08 03:51:38 bostic Exp $";
  13. #endif
  14. #ifndef NO_SYSTEM_INCLUDES
  15. #include <sys/types.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <unistd.h>
  20. #endif
  21. #include "db_int.h"
  22. int main __P((int, char *[]));
  23. int usage __P((void));
  24. int version_check __P((const char *));
  25. int
  26. main(argc, argv)
  27. int argc;
  28. char *argv[];
  29. {
  30. extern char *optarg;
  31. extern int optind;
  32. const char *progname = "db_verify";
  33. DB *dbp, *dbp1;
  34. DB_ENV *dbenv;
  35. u_int32_t cache;
  36. int ch, d_close, e_close, exitval, nflag, oflag, private;
  37. int quiet, resize, ret, t_ret;
  38. char *home, *passwd;
  39. if ((ret = version_check(progname)) != 0)
  40. return (ret);
  41. dbenv = NULL;
  42. cache = MEGABYTE;
  43. d_close = e_close = exitval = nflag = oflag = quiet = 0;
  44. home = passwd = NULL;
  45. while ((ch = getopt(argc, argv, "h:NoP:qV")) != EOF)
  46. switch (ch) {
  47. case 'h':
  48. home = optarg;
  49. break;
  50. case 'N':
  51. nflag = 1;
  52. break;
  53. case 'P':
  54. passwd = strdup(optarg);
  55. memset(optarg, 0, strlen(optarg));
  56. if (passwd == NULL) {
  57. fprintf(stderr, "%s: strdup: %sn",
  58.     progname, strerror(errno));
  59. return (EXIT_FAILURE);
  60. }
  61. break;
  62. case 'o':
  63. oflag = 1;
  64. break;
  65. case 'q':
  66. quiet = 1;
  67. break;
  68. case 'V':
  69. printf("%sn", db_version(NULL, NULL, NULL));
  70. return (EXIT_SUCCESS);
  71. case '?':
  72. default:
  73. return (usage());
  74. }
  75. argc -= optind;
  76. argv += optind;
  77. if (argc <= 0)
  78. return (usage());
  79. /* Handle possible interruptions. */
  80. __db_util_siginit();
  81. /*
  82.  * Create an environment object and initialize it for error
  83.  * reporting.
  84.  */
  85. retry: if ((ret = db_env_create(&dbenv, 0)) != 0) {
  86. fprintf(stderr,
  87.     "%s: db_env_create: %sn", progname, db_strerror(ret));
  88. goto shutdown;
  89. }
  90. e_close = 1;
  91. if (!quiet) {
  92. dbenv->set_errfile(dbenv, stderr);
  93. dbenv->set_errpfx(dbenv, progname);
  94. }
  95. if (nflag) {
  96. if ((ret = dbenv->set_flags(dbenv, DB_NOLOCKING, 1)) != 0) {
  97. dbenv->err(dbenv, ret, "set_flags: DB_NOLOCKING");
  98. goto shutdown;
  99. }
  100. if ((ret = dbenv->set_flags(dbenv, DB_NOPANIC, 1)) != 0) {
  101. dbenv->err(dbenv, ret, "set_flags: DB_NOPANIC");
  102. goto shutdown;
  103. }
  104. }
  105. if (passwd != NULL &&
  106.     (ret = dbenv->set_encrypt(dbenv, passwd, DB_ENCRYPT_AES)) != 0) {
  107. dbenv->err(dbenv, ret, "set_passwd");
  108. goto shutdown;
  109. }
  110. /*
  111.  * Attach to an mpool if it exists, but if that fails, attach to a
  112.  * private region.  In the latter case, declare a reasonably large
  113.  * cache so that we don't fail when verifying large databases.
  114.  */
  115. private = 0;
  116. if ((ret =
  117.     dbenv->open(dbenv, home, DB_INIT_MPOOL | DB_USE_ENVIRON, 0)) != 0) {
  118. if ((ret = dbenv->set_cachesize(dbenv, 0, cache, 1)) != 0) {
  119. dbenv->err(dbenv, ret, "set_cachesize");
  120. goto shutdown;
  121. }
  122. private = 1;
  123. if ((ret = dbenv->open(dbenv, home,
  124.     DB_CREATE | DB_INIT_MPOOL | DB_PRIVATE | DB_USE_ENVIRON, 0)) != 0) {
  125. dbenv->err(dbenv, ret, "open");
  126. goto shutdown;
  127. }
  128. }
  129. for (; !__db_util_interrupted() && argv[0] != NULL; ++argv) {
  130. if ((ret = db_create(&dbp, dbenv, 0)) != 0) {
  131. dbenv->err(dbenv, ret, "%s: db_create", progname);
  132. goto shutdown;
  133. }
  134. d_close = 1;
  135. /*
  136.  * We create a 2nd dbp to this database to get its pagesize
  137.  * because the dbp we're using for verify cannot be opened.
  138.  */
  139. if (private) {
  140. if ((ret = db_create(&dbp1, dbenv, 0)) != 0) {
  141. dbenv->err(
  142.     dbenv, ret, "%s: db_create", progname);
  143. goto shutdown;
  144. }
  145. if ((ret = dbp1->open(dbp1, NULL,
  146.     argv[0], NULL, DB_UNKNOWN, DB_RDONLY, 0)) != 0) {
  147. dbenv->err(dbenv, ret, "DB->open: %s", argv[0]);
  148. (void)dbp1->close(dbp1, 0);
  149. goto shutdown;
  150. }
  151. /*
  152.  * If we get here, we can check the cache/page.
  153.  * !!!
  154.  * If we have to retry with an env with a larger
  155.  * cache, we jump out of this loop.  However, we
  156.  * will still be working on the same argv when we
  157.  * get back into the for-loop.
  158.  */
  159. ret = __db_util_cache(dbenv, dbp1, &cache, &resize);
  160. (void)dbp1->close(dbp1, 0);
  161. if (ret != 0)
  162. goto shutdown;
  163. if (resize) {
  164. (void)dbp->close(dbp, 0);
  165. d_close = 0;
  166. (void)dbenv->close(dbenv, 0);
  167. e_close = 0;
  168. goto retry;
  169. }
  170. }
  171. if ((ret = dbp->verify(dbp,
  172.     argv[0], NULL, NULL, oflag ? DB_NOORDERCHK : 0)) != 0)
  173. dbp->err(dbp, ret, "DB->verify: %s", argv[0]);
  174. if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0) {
  175. dbenv->err(dbenv, ret, "DB->close: %s", argv[0]);
  176. ret = t_ret;
  177. }
  178. d_close = 0;
  179. if (ret != 0)
  180. goto shutdown;
  181. }
  182. if (0) {
  183. shutdown: exitval = 1;
  184. }
  185. if (d_close && (ret = dbp->close(dbp, 0)) != 0) {
  186. exitval = 1;
  187. dbenv->err(dbenv, ret, "close");
  188. }
  189. if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
  190. exitval = 1;
  191. fprintf(stderr,
  192.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  193. }
  194. /* Resend any caught signal. */
  195. __db_util_sigresend();
  196. return (exitval == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
  197. }
  198. int
  199. usage()
  200. {
  201. fprintf(stderr, "%sn",
  202.     "usage: db_verify [-NoqV] [-h home] [-P password] db_file ...");
  203. return (EXIT_FAILURE);
  204. }
  205. int
  206. version_check(progname)
  207. const char *progname;
  208. {
  209. int v_major, v_minor, v_patch;
  210. /* Make sure we're loaded with the right version of the DB library. */
  211. (void)db_version(&v_major, &v_minor, &v_patch);
  212. if (v_major != DB_VERSION_MAJOR ||
  213.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  214. fprintf(stderr,
  215. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  216.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  217.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  218. return (EXIT_FAILURE);
  219. }
  220. return (0);
  221. }