testbdb.C
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. #include "bdbobj.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. static void fw(char *p, size_t a, size_t b, FILE *f)
  5. {
  6. size_t i, j=a*b;
  7. for (i=0; i<j; i++)
  8. putc(p[i], f);
  9. }
  10. struct kd {
  11. struct kd *next;
  12. char *key, *data;
  13. } ;
  14. static int kdcmp (const void *a, const void *b)
  15. {
  16. return (strcmp(  (*(const struct kd **)a)->key,
  17. (*(const struct kd **)b)->key));
  18. }
  19. int main(int argc, char **argv)
  20. {
  21. if (argc < 2) exit(1);
  22. if (argc < 3)
  23. {
  24. BDbObj dbw;
  25. char *key, *data;
  26. size_t keylen, datalen;
  27. struct kd *kdlist, **kdarray;
  28. size_t kdcnt;
  29. if (dbw.Open(argv[1], "R"))
  30. {
  31. perror("open");
  32. exit(1);
  33. }
  34. printf("Dumping %s:n", argv[1]);
  35. kdlist=0;
  36. kdcnt=0;
  37. for (key=dbw.FetchFirstKeyVal(keylen, data, datalen);
  38. key; key=dbw.FetchNextKeyVal(keylen, data, datalen))
  39. {
  40. struct kd *k=(struct kd *)malloc(sizeof(struct kd));
  41. if (!k)
  42. {
  43. perror("malloc");
  44. exit(1);
  45. }
  46. if ((k->key=(char *)malloc(keylen+1)) == 0 ||
  47. (k->data=(char *)malloc(datalen+1)) == 0)
  48. {
  49. perror("malloc");
  50. exit(1);
  51. }
  52. memcpy(k->key, key, keylen);
  53. k->key[keylen]=0;
  54. memcpy(k->data, data, datalen);
  55. k->data[datalen]=0;
  56. free(data);
  57. ++kdcnt;
  58. k->next=kdlist;
  59. kdlist=k;
  60. }
  61. if ((kdarray=(struct kd **)
  62. malloc( (kdcnt+1)*sizeof(struct kd *))) == 0)
  63. {
  64. perror("malloc");
  65. exit(1);
  66. }
  67. kdcnt=0;
  68. while ( kdlist )
  69. {
  70. kdarray[kdcnt++]=kdlist;
  71. kdlist=kdlist->next;
  72. }
  73. kdarray[kdcnt]=0;
  74. qsort( kdarray, kdcnt, sizeof(kdarray[0]), &kdcmp);
  75. for (kdcnt=0; kdarray[kdcnt]; kdcnt++)
  76. {
  77. printf("Key: ");
  78. fw(kdarray[kdcnt]->key, strlen(kdarray[kdcnt]->key),
  79. 1, stdout);
  80. printf(", Data: ");
  81. fw(kdarray[kdcnt]->data, strlen(kdarray[kdcnt]->data),
  82. 1, stdout);
  83. printf("n");
  84. free(kdarray[kdcnt]->key);
  85. free(kdarray[kdcnt]->data);
  86. free(kdarray[kdcnt]);
  87. }
  88. free(kdarray);
  89. dbw.Close();
  90. } else if (argc < 4 && argv[2][0] == '-')
  91. {
  92. BDbObj dbw;
  93. if (dbw.Open(argv[1], "W"))
  94. {
  95. perror("open");
  96. exit(1);
  97. }
  98. printf("Deleting %s from %s:n", argv[2], argv[1]);
  99. if (dbw.Delete(argv[2]+1, strlen(argv[2]+1)))
  100. fprintf(stderr, "Not found.n");
  101. dbw.Close();
  102. } else if (argc < 4)
  103. {
  104. BDbObj dbw;
  105. if (dbw.Open(argv[1], "R"))
  106. {
  107. perror("open");
  108. exit(1);
  109. }
  110. size_t len;
  111. char *val=dbw.Fetch(argv[2], strlen(argv[2]), len, 0);
  112. if (!val)
  113. {
  114. fprintf(stderr, "%s: not found.n", argv[2]);
  115. exit(1);
  116. }
  117. printf("Fetching %s from %s: ", argv[2], argv[1]);
  118. fw(val, len, 1, stdout);
  119. printf("n");
  120. free(val);
  121. dbw.Close();
  122. }
  123. else
  124. {
  125. BDbObj dbw;
  126. if (dbw.Open(argv[1], "C"))
  127. {
  128. perror("open");
  129. exit(1);
  130. }
  131. printf("Storing %s/%s into %s:n", argv[2], argv[3], argv[1]);
  132. if (dbw.Store(argv[2], strlen(argv[2]),
  133. argv[3], strlen(argv[3]), "R"))
  134. {
  135. perror("write");
  136. exit(1);
  137. }
  138. dbw.Close();
  139. }
  140. exit(0);
  141. return (0);
  142. }