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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: MpoolExample.cpp,v 11.9 2000/10/27 20:32:01 dda Exp $
  8.  */
  9. #include "db_config.h"
  10. #ifndef NO_SYSTEM_INCLUDES
  11. #include <sys/types.h>
  12. #include <errno.h>
  13. #include <fcntl.h>
  14. #include <iostream.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <time.h>
  18. #include <unistd.h>
  19. #endif
  20. #include <db_cxx.h>
  21. #define MPOOL "mpool"
  22. void init(char *, int, int);
  23. void run(DB_ENV *, int, int, int);
  24. static void usage();
  25. char *progname = "MpoolExample"; // Program name.
  26. class MpoolExample : public DbEnv
  27. {
  28. public:
  29. MpoolExample();
  30. void initdb(const char *home, int cachesize);
  31. void run(int hits, int pagesize, int npages);
  32. private:
  33. static const char FileName[];
  34. // no need for copy and assignment
  35. MpoolExample(const MpoolExample &);
  36. void operator = (const MpoolExample &);
  37. };
  38. int main(int argc, char *argv[])
  39. {
  40. int cachesize = 20 * 1024;
  41. int hits = 1000;
  42. int npages = 50;
  43. int pagesize = 1024;
  44. for (int i = 1; i < argc; ++i) {
  45. if (strcmp(argv[i], "-c") == 0) {
  46. if ((cachesize = atoi(argv[++i])) < 20 * 1024)
  47. usage();
  48. }
  49. else if (strcmp(argv[i], "-h") == 0) {
  50. if ((hits = atoi(argv[++i])) <= 0)
  51. usage();
  52. }
  53. else if (strcmp(argv[i], "-n") == 0) {
  54. if ((npages = atoi(argv[++i])) <= 0)
  55. usage();
  56. }
  57. else if (strcmp(argv[i], "-p") == 0) {
  58. if ((pagesize = atoi(argv[++i])) <= 0)
  59. usage();
  60. }
  61. else {
  62. usage();
  63. }
  64. }
  65. // Initialize the file.
  66. init(MPOOL, pagesize, npages);
  67. try {
  68. MpoolExample app;
  69. cout << progname
  70.      << ": cachesize: " << cachesize
  71.      << "; pagesize: " << pagesize
  72.      << "; N pages: " << npages << "n";
  73. app.initdb(NULL, cachesize);
  74. app.run(hits, pagesize, npages);
  75. cout << "MpoolExample: completedn";
  76. return 0;
  77. }
  78. catch (DbException &dbe) {
  79. cerr << "MpoolExample: " << dbe.what() << "n";
  80. return 1;
  81. }
  82. }
  83. //
  84. // init --
  85. // Create a backing file.
  86. //
  87. void
  88. init(char *file, int pagesize, int npages)
  89. {
  90. //
  91. // Create a file with the right number of pages, and store a page
  92. // number on each page.
  93. //
  94. int fd;
  95. int flags = O_CREAT | O_RDWR | O_TRUNC;
  96. #ifdef DB_WIN32
  97. flags |= O_BINARY;
  98. #endif
  99. if ((fd = open(file, flags, 0666)) < 0) {
  100. cerr << "MpoolExample: " << file << ": " << strerror(errno) << "n";
  101. exit(1);
  102. }
  103. char *p = new char[pagesize];
  104. memset(p, 0, pagesize);
  105. // The pages are numbered from 0.
  106. for (int cnt = 0; cnt <= npages; ++cnt) {
  107. *(db_pgno_t *)p = cnt;
  108. if (write(fd, p, pagesize) != pagesize) {
  109. cerr << "MpoolExample: " << file
  110.      << ": " << strerror(errno) << "n";
  111. exit(1);
  112. }
  113. }
  114. delete [] p;
  115. }
  116. static void
  117. usage()
  118. {
  119. cerr << "usage: MpoolExample [-c cachesize] "
  120.      << "[-h hits] [-n npages] [-p pagesize]n";
  121. exit(1);
  122. }
  123. // Note: by using DB_CXX_NO_EXCEPTIONS, we get explicit error returns
  124. // from various methods rather than exceptions so we can report more
  125. // information with each error.
  126. //
  127. MpoolExample::MpoolExample()
  128. : DbEnv(DB_CXX_NO_EXCEPTIONS)
  129. {
  130. }
  131. void MpoolExample::initdb(const char *home, int cachesize)
  132. {
  133. set_error_stream(&cerr);
  134. set_errpfx("MpoolExample");
  135. set_cachesize(0, cachesize, 0);
  136. open(home, DB_CREATE | DB_INIT_MPOOL, 0);
  137. }
  138. //
  139. // run --
  140. // Get a set of pages.
  141. //
  142. void
  143. MpoolExample::run(int hits, int pagesize, int npages)
  144. {
  145. db_pgno_t pageno;
  146. int cnt;
  147. void *p;
  148. // Open the file in the pool.
  149. DbMpoolFile *dbmfp;
  150. DbMpoolFile::open(this, MPOOL, 0, 0, pagesize, NULL, &dbmfp);
  151. cout << "retrieve " << hits << " random pages... ";
  152. srand((unsigned int)time(NULL));
  153. for (cnt = 0; cnt < hits; ++cnt) {
  154. pageno = (rand() % npages) + 1;
  155. if ((errno = dbmfp->get(&pageno, 0, &p)) != 0) {
  156. cerr << "MpoolExample: unable to retrieve page "
  157.      << (unsigned long)pageno << ": "
  158.      << strerror(errno) << "n";
  159. exit(1);
  160. }
  161. if (*(db_pgno_t *)p != pageno) {
  162. cerr << "MpoolExample: wrong page retrieved ("
  163.      << (unsigned long)pageno << " != "
  164.      << *(int *)p << ")n";
  165. exit(1);
  166. }
  167. if ((errno = dbmfp->put(p, 0)) != 0) {
  168. cerr << "MpoolExample: unable to return page "
  169.      << (unsigned long)pageno << ": "
  170.      << strerror(errno) << "n";
  171. exit(1);
  172. }
  173. }
  174. cout << "successful.n";
  175. // Close the pool.
  176. if ((errno = close(0)) != 0) {
  177. cerr << "MpoolExample: " << strerror(errno) << "n";
  178. exit(1);
  179. }
  180. }