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

MySQL数据库

开发平台:

Visual C++

  1. #include <sys/types.h>
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include "db_185.h"
  8. void err(char *);
  9. int mycmp(const DBT *, const DBT *);
  10. void ops(DB *, int);
  11. int
  12. main()
  13. {
  14. DB *dbp;
  15. HASHINFO h_info;
  16. BTREEINFO b_info;
  17. RECNOINFO r_info;
  18. printf("tBtree...n");
  19. memset(&b_info, 0, sizeof(b_info));
  20. b_info.flags = R_DUP;
  21. b_info.cachesize = 100 * 1024;
  22. b_info.psize = 512;
  23. b_info.lorder = 4321;
  24. b_info.compare = mycmp;
  25. (void)remove("a.db");
  26. if ((dbp =
  27.    dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_BTREE, &b_info)) == NULL)
  28. err("dbopen: btree");
  29. ops(dbp, DB_BTREE);
  30. printf("tHash...n");
  31. memset(&h_info, 0, sizeof(h_info));
  32. h_info.bsize = 512;
  33. h_info.ffactor = 6;
  34. h_info.nelem = 1000;
  35. h_info.cachesize = 100 * 1024;
  36. h_info.lorder = 1234;
  37. (void)remove("a.db");
  38. if ((dbp =
  39.     dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_HASH, &h_info)) == NULL)
  40. err("dbopen: hash");
  41. ops(dbp, DB_HASH);
  42. printf("tRecno...n");
  43. memset(&r_info, 0, sizeof(r_info));
  44. r_info.flags = R_FIXEDLEN;
  45. r_info.cachesize = 100 * 1024;
  46. r_info.psize = 1024;
  47. r_info.reclen = 37;
  48. (void)remove("a.db");
  49. if ((dbp =
  50.    dbopen("a.db", O_CREAT | O_RDWR, 0664, DB_RECNO, &r_info)) == NULL)
  51. err("dbopen: recno");
  52. ops(dbp, DB_RECNO);
  53. return (0);
  54. }
  55. int
  56. mycmp(a, b)
  57. const DBT *a, *b;
  58. {
  59. size_t len;
  60. u_int8_t *p1, *p2;
  61. len = a->size > b->size ? b->size : a->size;
  62. for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2)
  63. if (*p1 != *p2)
  64. return ((long)*p1 - (long)*p2);
  65. return ((long)a->size - (long)b->size);
  66. }
  67. void
  68. ops(dbp, type)
  69. DB *dbp;
  70. int type;
  71. {
  72. FILE *outfp;
  73. DBT key, data;
  74. recno_t recno;
  75. int i, ret;
  76. char buf[64];
  77. memset(&key, 0, sizeof(key));
  78. memset(&data, 0, sizeof(data));
  79. for (i = 1; i < 100; ++i) { /* Test DB->put. */
  80. sprintf(buf, "abc_%d_efg", i);
  81. if (type == DB_RECNO) {
  82. recno = i;
  83. key.data = &recno;
  84. key.size = sizeof(recno);
  85. } else {
  86. key.data = data.data = buf;
  87. key.size = data.size = strlen(buf);
  88. }
  89. data.data = buf;
  90. data.size = strlen(buf);
  91. if (dbp->put(dbp, &key, &data, 0))
  92. err("DB->put");
  93. }
  94. if (type == DB_RECNO) { /* Test DB->get. */
  95. recno = 97;
  96. key.data = &recno;
  97. key.size = sizeof(recno);
  98. } else {
  99. key.data = buf;
  100. key.size = strlen(buf);
  101. }
  102. sprintf(buf, "abc_%d_efg", 97);
  103. if (dbp->get(dbp, &key, &data, 0) != 0)
  104. err("DB->get");
  105. if (memcmp(data.data, buf, strlen(buf)))
  106. err("DB->get: wrong data returned");
  107. if (type == DB_RECNO) { /* Test DB->put no-overwrite. */
  108. recno = 42;
  109. key.data = &recno;
  110. key.size = sizeof(recno);
  111. } else {
  112. key.data = buf;
  113. key.size = strlen(buf);
  114. }
  115. sprintf(buf, "abc_%d_efg", 42);
  116. if (dbp->put(dbp, &key, &data, R_NOOVERWRITE) == 0)
  117. err("DB->put: no-overwrite succeeded");
  118. if (type == DB_RECNO) { /* Test DB->del. */
  119. recno = 35;
  120. key.data = &recno;
  121. key.size = sizeof(recno);
  122. } else {
  123. sprintf(buf, "abc_%d_efg", 35);
  124. key.data = buf;
  125. key.size = strlen(buf);
  126. }
  127. if (dbp->del(dbp, &key, 0))
  128. err("DB->del");
  129. /* Test DB->seq. */
  130. if ((outfp = fopen("output", "w")) == NULL)
  131. err("fopen: output");
  132. while ((ret = dbp->seq(dbp, &key, &data, R_NEXT)) == 0) {
  133. if (type == DB_RECNO)
  134. fprintf(outfp, "%dn", *(int *)key.data);
  135. else
  136. fprintf(outfp,
  137.     "%.*sn", (int)key.size, (char *)key.data);
  138. fprintf(outfp, "%.*sn", (int)data.size, (char *)data.data);
  139. }
  140. if (ret != 1)
  141. err("DB->seq");
  142. fclose(outfp);
  143. switch (type) {
  144. case DB_BTREE:
  145. ret = system("cmp output O.BH");
  146. break;
  147. case DB_HASH:
  148. ret = system("sort output | cmp - O.BH");
  149. break;
  150. case DB_RECNO:
  151. ret = system("cmp output O.R");
  152. break;
  153. }
  154. if (ret != 0)
  155. err("output comparison failed");
  156. if (dbp->sync(dbp, 0)) /* Test DB->sync. */
  157. err("DB->sync");
  158. if (dbp->close(dbp)) /* Test DB->close. */
  159. err("DB->close");
  160. }
  161. void
  162. err(s)
  163. char *s;
  164. {
  165. fprintf(stderr, "t%s: %sn", s, strerror(errno));
  166. exit (1);
  167. }