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

WEB邮件程序

开发平台:

C/C++

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