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

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 copyright[] =
  10.     "Copyright (c) 1996-2000nSleepycat Software Inc.  All rights reserved.n";
  11. static const char revid[] =
  12.     "$Id: db_printlog.c,v 11.23 2001/01/18 18:36:58 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. #include "db_page.h"
  23. #include "btree.h"
  24. #include "db_am.h"
  25. #include "hash.h"
  26. #include "log.h"
  27. #include "qam.h"
  28. #include "txn.h"
  29. int main __P((int, char *[]));
  30. void usage __P((void));
  31. void version_check __P((void));
  32. DB_ENV *dbenv;
  33. const char
  34. *progname = "db_printlog"; /* Program name. */
  35. int
  36. main(argc, argv)
  37. int argc;
  38. char *argv[];
  39. {
  40. extern char *optarg;
  41. extern int optind;
  42. DBT data;
  43. DB_LSN key;
  44. int ch, e_close, exitval, nflag, ret;
  45. char *home;
  46. version_check();
  47. e_close = exitval = 0;
  48. nflag = 0;
  49. home = NULL;
  50. while ((ch = getopt(argc, argv, "h:NV")) != EOF)
  51. switch (ch) {
  52. case 'h':
  53. home = optarg;
  54. break;
  55. case 'N':
  56. nflag = 1;
  57. if ((ret = db_env_set_panicstate(0)) != 0) {
  58. fprintf(stderr,
  59.     "%s: db_env_set_panicstate: %sn",
  60.     progname, db_strerror(ret));
  61. return (1);
  62. }
  63. break;
  64. case 'V':
  65. printf("%sn", db_version(NULL, NULL, NULL));
  66. exit(0);
  67. case '?':
  68. default:
  69. usage();
  70. }
  71. argc -= optind;
  72. argv += optind;
  73. if (argc > 0)
  74. usage();
  75. /* Handle possible interruptions. */
  76. __db_util_siginit();
  77. /*
  78.  * Create an environment object and initialize it for error
  79.  * reporting.
  80.  */
  81. if ((ret = db_env_create(&dbenv, 0)) != 0) {
  82. fprintf(stderr,
  83.     "%s: db_env_create: %sn", progname, db_strerror(ret));
  84. goto shutdown;
  85. }
  86. e_close = 1;
  87. dbenv->set_errfile(dbenv, stderr);
  88. dbenv->set_errpfx(dbenv, progname);
  89. if (nflag && (ret = dbenv->set_mutexlocks(dbenv, 0)) != 0) {
  90. dbenv->err(dbenv, ret, "set_mutexlocks");
  91. goto shutdown;
  92. }
  93. /*
  94.  * An environment is required, but as all we're doing is reading log
  95.  * files, we create one if it doesn't already exist.  If we create
  96.  * it, create it private so it automatically goes away when we're done.
  97.  */
  98. if ((ret = dbenv->open(dbenv, home,
  99.     DB_JOINENV | DB_USE_ENVIRON, 0)) != 0 &&
  100.     (ret = dbenv->open(dbenv, home,
  101.     DB_CREATE | DB_INIT_LOG | DB_PRIVATE | DB_USE_ENVIRON, 0)) != 0) {
  102. dbenv->err(dbenv, ret, "open");
  103. goto shutdown;
  104. }
  105. /* Initialize print callbacks. */
  106. if ((ret = __bam_init_print(dbenv)) != 0 ||
  107.     (ret = __crdel_init_print(dbenv)) != 0 ||
  108.     (ret = __db_init_print(dbenv)) != 0 ||
  109.     (ret = __qam_init_print(dbenv)) != 0 ||
  110.     (ret = __ham_init_print(dbenv)) != 0 ||
  111.     (ret = __log_init_print(dbenv)) != 0 ||
  112.     (ret = __txn_init_print(dbenv)) != 0) {
  113. dbenv->err(dbenv, ret, "callback: initialization");
  114. goto shutdown;
  115. }
  116. memset(&data, 0, sizeof(data));
  117. while (!__db_util_interrupted()) {
  118. if ((ret = log_get(dbenv, &key, &data, DB_NEXT)) != 0) {
  119. if (ret == DB_NOTFOUND)
  120. break;
  121. dbenv->err(dbenv, ret, "log_get");
  122. goto shutdown;
  123. }
  124. /*
  125.  * XXX
  126.  * We use DB_TXN_ABORT as our op because that's the only op
  127.  * that calls the underlying recovery function without any
  128.  * consideration as to the contents of the transaction list.
  129.  */
  130. ret = __db_dispatch(dbenv, &data, &key, DB_TXN_ABORT, NULL);
  131. /*
  132.  * XXX
  133.  * Just in case the underlying routines don't flush.
  134.  */
  135. (void)fflush(stdout);
  136. if (ret != 0) {
  137. dbenv->err(dbenv, ret, "tx: dispatch");
  138. goto shutdown;
  139. }
  140. }
  141. if (0) {
  142. shutdown: exitval = 1;
  143. }
  144. if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
  145. exitval = 1;
  146. fprintf(stderr,
  147.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  148. }
  149. /* Resend any caught signal. */
  150. __db_util_sigresend();
  151. return (exitval);
  152. }
  153. void
  154. usage()
  155. {
  156. fprintf(stderr, "usage: db_printlog [-NV] [-h home]n");
  157. exit (1);
  158. }
  159. void
  160. version_check()
  161. {
  162. int v_major, v_minor, v_patch;
  163. /* Make sure we're loaded with the right version of the DB library. */
  164. (void)db_version(&v_major, &v_minor, &v_patch);
  165. if (v_major != DB_VERSION_MAJOR ||
  166.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  167. fprintf(stderr,
  168. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  169.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  170.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  171. exit (1);
  172. }
  173. }