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

MySQL数据库

开发平台:

Visual C++

  1. /*NOTE: AccessExample changed to test Db.key_range.
  2.  * We made a global change of /AccessExample/TestKeyRange/,
  3.  * the only other changes are marked with comments that
  4.  * are notated as 'ADDED'.
  5.  */
  6. /*-
  7.  * See the file LICENSE for redistribution information.
  8.  *
  9.  * Copyright (c) 1997-2002
  10.  * Sleepycat Software.  All rights reserved.
  11.  *
  12.  * $Id: TestKeyRange.cpp,v 1.4 2002/01/23 14:26:41 bostic Exp $
  13.  */
  14. #ifndef NO_SYSTEM_INCLUDES
  15. #include <sys/types.h>
  16. #include <iostream.h>
  17. #include <errno.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #ifndef _MSC_VER
  21. #include <unistd.h>
  22. #endif
  23. #endif
  24. #include <iomanip.h>
  25. #include <db_cxx.h>
  26. class TestKeyRange
  27. {
  28. public:
  29. TestKeyRange();
  30. void run();
  31. private:
  32. static const char FileName[];
  33. // no need for copy and assignment
  34. TestKeyRange(const TestKeyRange &);
  35. void operator = (const TestKeyRange &);
  36. };
  37. static void usage();          // forward
  38. int main(int argc, char *argv[])
  39. {
  40. if (argc > 1) {
  41. usage();
  42. }
  43. // Use a try block just to report any errors.
  44. // An alternate approach to using exceptions is to
  45. // use error models (see DbEnv::set_error_model()) so
  46. // that error codes are returned for all Berkeley DB methods.
  47. //
  48. try {
  49. TestKeyRange app;
  50. app.run();
  51. return 0;
  52. }
  53. catch (DbException &dbe) {
  54. cerr << "TestKeyRange: " << dbe.what() << "n";
  55. return 1;
  56. }
  57. }
  58. static void usage()
  59. {
  60. cerr << "usage: TestKeyRangen";
  61. exit(1);
  62. }
  63. const char TestKeyRange::FileName[] = "access.db";
  64. TestKeyRange::TestKeyRange()
  65. {
  66. }
  67. void TestKeyRange::run()
  68. {
  69. // Remove the previous database.
  70. (void)unlink(FileName);
  71. // Create the database object.
  72. // There is no environment for this simple example.
  73. Db db(0, 0);
  74. db.set_error_stream(&cerr);
  75. db.set_errpfx("TestKeyRange");
  76. db.set_pagesize(1024); /* Page size: 1K. */
  77. db.set_cachesize(0, 32 * 1024, 0);
  78. db.open(NULL, FileName, NULL, DB_BTREE, DB_CREATE, 0664);
  79. //
  80. // Insert records into the database, where the key is the user
  81. // input and the data is the user input in reverse order.
  82. //
  83. char buf[1024];
  84. char rbuf[1024];
  85. char *t;
  86. char *p;
  87. int ret;
  88. int len;
  89. Dbt *firstkey = NULL;
  90. char firstbuf[1024];
  91. for (;;) {
  92. cout << "input>";
  93. cout.flush();
  94. cin.getline(buf, sizeof(buf));
  95. if (cin.eof())
  96. break;
  97. if ((len = strlen(buf)) <= 0)
  98. continue;
  99. for (t = rbuf, p = buf + (len - 1); p >= buf;)
  100. *t++ = *p--;
  101. *t++ = '';
  102. Dbt key(buf, len + 1);
  103. Dbt data(rbuf, len + 1);
  104. if (firstkey == NULL) {
  105. strcpy(firstbuf, buf);
  106. firstkey = new Dbt(firstbuf, len + 1);
  107. }
  108. ret = db.put(0, &key, &data, DB_NOOVERWRITE);
  109. if (ret == DB_KEYEXIST) {
  110. cout << "Key " << buf << " already exists.n";
  111. }
  112. cout << "n";
  113. }
  114. // We put a try block around this section of code
  115. // to ensure that our database is properly closed
  116. // in the event of an error.
  117. //
  118. try {
  119. // Acquire a cursor for the table.
  120. Dbc *dbcp;
  121. db.cursor(NULL, &dbcp, 0);
  122. /*ADDED...*/
  123. DB_KEY_RANGE range;
  124. memset(&range, 0, sizeof(range));
  125. db.key_range(NULL, firstkey, &range, 0);
  126. printf("less: %fn", range.less);
  127. printf("equal: %fn", range.equal);
  128. printf("greater: %fn", range.greater);
  129. /*end ADDED*/
  130. Dbt key;
  131. Dbt data;
  132. // Walk through the table, printing the key/data pairs.
  133. while (dbcp->get(&key, &data, DB_NEXT) == 0) {
  134. char *key_string = (char *)key.get_data();
  135. char *data_string = (char *)data.get_data();
  136. cout << key_string << " : " << data_string << "n";
  137. }
  138. dbcp->close();
  139. }
  140. catch (DbException &dbe) {
  141. cerr << "TestKeyRange: " << dbe.what() << "n";
  142. }
  143. db.close(0);
  144. }