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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: log_method.c,v 11.32 2002/05/30 22:16:47 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #ifdef HAVE_RPC
  14. #include <rpc/rpc.h>
  15. #endif
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #endif
  20. #include "db_int.h"
  21. #include "dbinc/log.h"
  22. #ifdef HAVE_RPC
  23. #include "dbinc_auto/db_server.h"
  24. #include "dbinc_auto/rpc_client_ext.h"
  25. #endif
  26. static int __log_set_lg_bsize __P((DB_ENV *, u_int32_t));
  27. static int __log_set_lg_dir __P((DB_ENV *, const char *));
  28. static int __log_set_lg_max __P((DB_ENV *, u_int32_t));
  29. static int __log_set_lg_regionmax __P((DB_ENV *, u_int32_t));
  30. /*
  31.  * __log_dbenv_create --
  32.  * Log specific initialization of the DB_ENV structure.
  33.  *
  34.  * PUBLIC: void __log_dbenv_create __P((DB_ENV *));
  35.  */
  36. void
  37. __log_dbenv_create(dbenv)
  38. DB_ENV *dbenv;
  39. {
  40. /*
  41.  * !!!
  42.  * Our caller has not yet had the opportunity to reset the panic
  43.  * state or turn off mutex locking, and so we can neither check
  44.  * the panic state or acquire a mutex in the DB_ENV create path.
  45.  */
  46. dbenv->lg_bsize = LG_BSIZE_DEFAULT;
  47. dbenv->lg_regionmax = LG_BASE_REGION_SIZE;
  48. #ifdef HAVE_RPC
  49. /*
  50.  * If we have a client, overwrite what we just setup to
  51.  * point to client functions.
  52.  */
  53. if (F_ISSET(dbenv, DB_ENV_RPCCLIENT)) {
  54. dbenv->set_lg_bsize = __dbcl_set_lg_bsize;
  55. dbenv->set_lg_dir = __dbcl_set_lg_dir;
  56. dbenv->set_lg_max = __dbcl_set_lg_max;
  57. dbenv->set_lg_regionmax = __dbcl_set_lg_regionmax;
  58. dbenv->log_archive = __dbcl_log_archive;
  59. dbenv->log_cursor = __dbcl_log_cursor;
  60. dbenv->log_file = __dbcl_log_file;
  61. dbenv->log_flush = __dbcl_log_flush;
  62. dbenv->log_put = __dbcl_log_put;
  63. dbenv->log_stat = __dbcl_log_stat;
  64. } else
  65. #endif
  66. {
  67. dbenv->set_lg_bsize = __log_set_lg_bsize;
  68. dbenv->set_lg_dir = __log_set_lg_dir;
  69. dbenv->set_lg_max = __log_set_lg_max;
  70. dbenv->set_lg_regionmax = __log_set_lg_regionmax;
  71. dbenv->log_archive = __log_archive;
  72. dbenv->log_cursor = __log_cursor;
  73. dbenv->log_file = __log_file;
  74. dbenv->log_flush = __log_flush;
  75. dbenv->log_put = __log_put;
  76. dbenv->log_stat = __log_stat;
  77. }
  78. }
  79. /*
  80.  * __log_set_lg_bsize --
  81.  * Set the log buffer size.
  82.  */
  83. static int
  84. __log_set_lg_bsize(dbenv, lg_bsize)
  85. DB_ENV *dbenv;
  86. u_int32_t lg_bsize;
  87. {
  88. u_int32_t lg_max;
  89. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lg_bsize");
  90. if (lg_bsize == 0)
  91. lg_bsize = LG_BSIZE_DEFAULT;
  92. /* Let's not be silly. */
  93. lg_max = dbenv->lg_size == 0 ? LG_MAX_DEFAULT : dbenv->lg_size;
  94. if (lg_bsize > lg_max / 4) {
  95. __db_err(dbenv, "log buffer size must be <= log file size / 4");
  96. return (EINVAL);
  97. }
  98. dbenv->lg_bsize = lg_bsize;
  99. return (0);
  100. }
  101. /*
  102.  * __log_set_lg_max --
  103.  * Set the maximum log file size.
  104.  */
  105. static int
  106. __log_set_lg_max(dbenv, lg_max)
  107. DB_ENV *dbenv;
  108. u_int32_t lg_max;
  109. {
  110. LOG *region;
  111. if (lg_max == 0)
  112. lg_max = LG_MAX_DEFAULT;
  113. if (F_ISSET(dbenv, DB_ENV_OPEN_CALLED)) {
  114. if (!LOGGING_ON(dbenv))
  115. return (__db_env_config(
  116.     dbenv, "set_lg_max", DB_INIT_LOG));
  117. region = ((DB_LOG *)dbenv->lg_handle)->reginfo.primary;
  118. /* Let's not be silly. */
  119. if (lg_max < region->buffer_size * 4)
  120. goto err;
  121. region->log_nsize = lg_max;
  122. } else {
  123. /* Let's not be silly. */
  124. if (lg_max < dbenv->lg_bsize * 4)
  125. goto err;
  126. dbenv->lg_size = lg_max;
  127. }
  128. return (0);
  129. err: __db_err(dbenv, "log file size must be >= log buffer size * 4");
  130. return (EINVAL);
  131. }
  132. /*
  133.  * __log_set_lg_regionmax --
  134.  * Set the region size.
  135.  */
  136. static int
  137. __log_set_lg_regionmax(dbenv, lg_regionmax)
  138. DB_ENV *dbenv;
  139. u_int32_t lg_regionmax;
  140. {
  141. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lg_regionmax");
  142. /* Let's not be silly. */
  143. if (lg_regionmax != 0 && lg_regionmax < LG_BASE_REGION_SIZE) {
  144. __db_err(dbenv,
  145.     "log file size must be >= %d", LG_BASE_REGION_SIZE);
  146. return (EINVAL);
  147. }
  148. dbenv->lg_regionmax = lg_regionmax;
  149. return (0);
  150. }
  151. /*
  152.  * __log_set_lg_dir --
  153.  * Set the log file directory.
  154.  */
  155. static int
  156. __log_set_lg_dir(dbenv, dir)
  157. DB_ENV *dbenv;
  158. const char *dir;
  159. {
  160. if (dbenv->db_log_dir != NULL)
  161. __os_free(dbenv, dbenv->db_log_dir);
  162. return (__os_strdup(dbenv, dir, &dbenv->db_log_dir));
  163. }