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

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_upgrade.c,v 1.31 2002/03/28 20:13:47 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_upgrade";
  33. DB *dbp;
  34. DB_ENV *dbenv;
  35. u_int32_t flags;
  36. int ch, e_close, exitval, nflag, ret, t_ret;
  37. char *home, *passwd;
  38. if ((ret = version_check(progname)) != 0)
  39. return (ret);
  40. dbenv = NULL;
  41. flags = nflag = 0;
  42. e_close = exitval = 0;
  43. home = passwd = NULL;
  44. while ((ch = getopt(argc, argv, "h:NP:sV")) != EOF)
  45. switch (ch) {
  46. case 'h':
  47. home = optarg;
  48. break;
  49. case 'N':
  50. nflag = 1;
  51. break;
  52. case 'P':
  53. passwd = strdup(optarg);
  54. memset(optarg, 0, strlen(optarg));
  55. if (passwd == NULL) {
  56. fprintf(stderr, "%s: strdup: %sn",
  57.     progname, strerror(errno));
  58. return (EXIT_FAILURE);
  59. }
  60. break;
  61. case 's':
  62. LF_SET(DB_DUPSORT);
  63. break;
  64. case 'V':
  65. printf("%sn", db_version(NULL, NULL, NULL));
  66. return (EXIT_SUCCESS);
  67. case '?':
  68. default:
  69. return (usage());
  70. }
  71. argc -= optind;
  72. argv += optind;
  73. if (argc <= 0)
  74. return (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, "%s: db_env_create: %sn",
  83.     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) {
  90. if ((ret = dbenv->set_flags(dbenv, DB_NOLOCKING, 1)) != 0) {
  91. dbenv->err(dbenv, ret, "set_flags: DB_NOLOCKING");
  92. goto shutdown;
  93. }
  94. if ((ret = dbenv->set_flags(dbenv, DB_NOPANIC, 1)) != 0) {
  95. dbenv->err(dbenv, ret, "set_flags: DB_NOPANIC");
  96. goto shutdown;
  97. }
  98. }
  99. if (passwd != NULL && (ret = dbenv->set_encrypt(dbenv,
  100.     passwd, DB_ENCRYPT_AES)) != 0) {
  101. dbenv->err(dbenv, ret, "set_passwd");
  102. goto shutdown;
  103. }
  104. /*
  105.  * If attaching to a pre-existing environment fails, create a
  106.  * private one and try again.
  107.  */
  108. if ((ret = dbenv->open(dbenv,
  109.     home, DB_JOINENV | DB_USE_ENVIRON, 0)) != 0 &&
  110.     (ret = dbenv->open(dbenv, home,
  111.     DB_CREATE | DB_INIT_MPOOL | DB_PRIVATE | DB_USE_ENVIRON, 0)) != 0) {
  112. dbenv->err(dbenv, ret, "open");
  113. goto shutdown;
  114. }
  115. for (; !__db_util_interrupted() && argv[0] != NULL; ++argv) {
  116. if ((ret = db_create(&dbp, dbenv, 0)) != 0) {
  117. fprintf(stderr,
  118.     "%s: db_create: %sn", progname, db_strerror(ret));
  119. goto shutdown;
  120. }
  121. dbp->set_errfile(dbp, stderr);
  122. dbp->set_errpfx(dbp, progname);
  123. if ((ret = dbp->upgrade(dbp, argv[0], flags)) != 0)
  124. dbp->err(dbp, ret, "DB->upgrade: %s", argv[0]);
  125. if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0) {
  126. dbenv->err(dbenv, ret, "DB->close: %s", argv[0]);
  127. ret = t_ret;
  128. }
  129. if (ret != 0)
  130. goto shutdown;
  131. }
  132. if (0) {
  133. shutdown: exitval = 1;
  134. }
  135. if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
  136. exitval = 1;
  137. fprintf(stderr,
  138.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  139. }
  140. /* Resend any caught signal. */
  141. __db_util_sigresend();
  142. return (exitval == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
  143. }
  144. int
  145. usage()
  146. {
  147. fprintf(stderr, "%sn",
  148.     "usage: db_upgrade [-NsV] [-h home] [-P password] db_file ...");
  149. return (EXIT_FAILURE);
  150. }
  151. int
  152. version_check(progname)
  153. const char *progname;
  154. {
  155. int v_major, v_minor, v_patch;
  156. /* Make sure we're loaded with the right version of the DB library. */
  157. (void)db_version(&v_major, &v_minor, &v_patch);
  158. if (v_major != DB_VERSION_MAJOR ||
  159.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  160. fprintf(stderr,
  161. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  162.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  163.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  164. return (EXIT_FAILURE);
  165. }
  166. return (0);
  167. }