msgdbx.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <db.h>
  4. #include "msgdb.h"
  5. struct Msgdb
  6. {
  7. DB *db;
  8. int reset;
  9. };
  10. Msgdb*
  11. mdopen(char *file, int create)
  12. {
  13. Msgdb *mdb;
  14. DB *db;
  15. HASHINFO h;
  16. if((mdb = mallocz(sizeof(Msgdb), 1)) == nil)
  17. return nil;
  18. memset(&h, 0, sizeof h);
  19. h.cachesize = 2*1024*1024;
  20. if((db = dbopen(file, ORDWR|(create ? OCREATE:0), 0666, DB_HASH, &h)) == nil){
  21. free(mdb);
  22. return nil;
  23. }
  24. mdb->db = db;
  25. mdb->reset = 1;
  26. return mdb;
  27. }
  28. long
  29. mdget(Msgdb *mdb, char *tok)
  30. {
  31. DB *db = mdb->db;
  32. DBT key, val;
  33. uchar *p;
  34. key.data = tok;
  35. key.size = strlen(tok)+1;
  36. val.data = 0;
  37. val.size = 0;
  38. if(db->get(db, &key, &val, 0) < 0)
  39. return 0;
  40. if(val.data == 0)
  41. return 0;
  42. if(val.size != 4)
  43. return 0;
  44. p = val.data;
  45. return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
  46. }
  47. void
  48. mdput(Msgdb *mdb, char *tok, long n)
  49. {
  50. uchar p[4];
  51. DB *db = mdb->db;
  52. DBT key, val;
  53. key.data = tok;
  54. key.size = strlen(tok)+1;
  55. if(n <= 0){
  56. db->del(db, &key, 0);
  57. return;
  58. }
  59. p[0] = n>>24;
  60. p[1] = n>>16;
  61. p[2] = n>>8;
  62. p[3] = n;
  63. val.data = p;
  64. val.size = 4;
  65. db->put(db, &key, &val, 0);
  66. }
  67. void
  68. mdenum(Msgdb *mdb)
  69. {
  70. mdb->reset = 1;
  71. }
  72. int
  73. mdnext(Msgdb *mdb, char **sp, long *vp)
  74. {
  75. DBT key, val;
  76. uchar *p;
  77. DB *db = mdb->db;
  78. int i;
  79. i = db->seq(db, &key, &val, mdb->reset ? R_FIRST : R_NEXT);
  80. mdb->reset = 0;
  81. if(i)
  82. return -1;
  83. *sp = key.data;
  84. p = val.data;
  85. *vp = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
  86. return 0;
  87. }
  88. void
  89. mdclose(Msgdb *mdb)
  90. {
  91. DB *db = mdb->db;
  92. db->close(db);
  93. mdb->db = nil;
  94. }