You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cdb.h 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /* $Id: cdb.h,v 1.10 2009-01-31 17:12:22 mjt Exp $
  2. * public cdb include file
  3. *
  4. * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
  5. * Public domain.
  6. */
  7. #ifndef TINYCDB_VERSION
  8. #define TINYCDB_VERSION 0.77
  9. #include "config.h"
  10. #include "unix-std.h"
  11. #include <event.h>
  12. /*
  13. * OpenBSD fix
  14. */
  15. #ifndef EPROTO
  16. #define EPROTO EPROTONOSUPPORT
  17. #endif
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21. typedef unsigned int cdbi_t; /* compatibility */
  22. /* common routines */
  23. unsigned cdb_hash(const void *buf, unsigned len);
  24. unsigned cdb_unpack(const unsigned char buf[4]);
  25. void cdb_pack(unsigned num, unsigned char buf[4]);
  26. struct cdb
  27. {
  28. int cdb_fd; /* file descriptor */
  29. char *filename; /* file name */
  30. time_t mtime; /* mtime of cdb file */
  31. struct event *check_timer_ev; /* event structure for checking cdb for modifications */
  32. struct timeval *check_timer_tv;
  33. /* private members */
  34. unsigned cdb_fsize; /* datafile size */
  35. unsigned cdb_dend; /* end of data ptr */
  36. const unsigned char *cdb_mem; /* mmap'ed file memory */
  37. unsigned cdb_vpos, cdb_vlen; /* found data */
  38. unsigned cdb_kpos, cdb_klen; /* found key */
  39. };
  40. #define CDB_STATIC_INIT {0,0,0,0,0,0,0,0}
  41. #define cdb_datapos(c) ((c)->cdb_vpos)
  42. #define cdb_datalen(c) ((c)->cdb_vlen)
  43. #define cdb_keypos(c) ((c)->cdb_kpos)
  44. #define cdb_keylen(c) ((c)->cdb_klen)
  45. #define cdb_fileno(c) ((c)->cdb_fd)
  46. int cdb_init(struct cdb *cdbp, int fd);
  47. void cdb_add_timer(struct cdb *cdbp, unsigned seconds);
  48. void cdb_free(struct cdb *cdbp);
  49. int cdb_read(const struct cdb *cdbp, void *buf, unsigned len, unsigned pos);
  50. #define cdb_readdata(cdbp, buf) \
  51. cdb_read((cdbp), (buf), cdb_datalen(cdbp), cdb_datapos(cdbp))
  52. #define cdb_readkey(cdbp, buf) \
  53. cdb_read((cdbp), (buf), cdb_keylen(cdbp), cdb_keypos(cdbp))
  54. const void *cdb_get(const struct cdb *cdbp, unsigned len, unsigned pos);
  55. #define cdb_getdata(cdbp) \
  56. cdb_get((cdbp), cdb_datalen(cdbp), cdb_datapos(cdbp))
  57. #define cdb_getkey(cdbp) \
  58. cdb_get((cdbp), cdb_keylen(cdbp), cdb_keypos(cdbp))
  59. int cdb_find(struct cdb *cdbp, const void *key, unsigned klen);
  60. struct cdb_find
  61. {
  62. struct cdb *cdb_cdbp;
  63. unsigned cdb_hval;
  64. const unsigned char *cdb_htp, *cdb_htab, *cdb_htend;
  65. unsigned cdb_httodo;
  66. const void *cdb_key;
  67. unsigned cdb_klen;
  68. };
  69. int cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp, const void *key,
  70. unsigned klen);
  71. int cdb_findnext(struct cdb_find *cdbfp);
  72. #define cdb_seqinit(cptr, cdbp) ((*(cptr))=2048)
  73. int cdb_seqnext(unsigned *cptr, struct cdb *cdbp);
  74. /* old simple interface */
  75. /* open file using standard routine, then: */
  76. int cdb_seek(int fd, const void *key, unsigned klen, unsigned *dlenp);
  77. int cdb_bread(int fd, void *buf, int len);
  78. /* cdb_make */
  79. struct cdb_make
  80. {
  81. int cdb_fd; /* file descriptor */
  82. /* private */
  83. unsigned cdb_dpos; /* data position so far */
  84. unsigned cdb_rcnt; /* record count so far */
  85. unsigned char cdb_buf[4096]; /* write buffer */
  86. unsigned char *cdb_bpos; /* current buf position */
  87. struct cdb_rl *cdb_rec[256]; /* list of arrays of record infos */
  88. };
  89. enum cdb_put_mode
  90. {
  91. CDB_PUT_ADD = 0, /* add unconditionnaly, like cdb_make_add() */
  92. #define CDB_PUT_ADD CDB_PUT_ADD
  93. CDB_FIND = CDB_PUT_ADD, CDB_PUT_REPLACE, /* replace: do not place to index OLD record */
  94. #define CDB_PUT_REPLACE CDB_PUT_REPLACE
  95. CDB_FIND_REMOVE = CDB_PUT_REPLACE, CDB_PUT_INSERT, /* add only if not already exists */
  96. #define CDB_PUT_INSERT CDB_PUT_INSERT
  97. CDB_PUT_WARN, /* add unconditionally but ret. 1 if exists */
  98. #define CDB_PUT_WARN CDB_PUT_WARN
  99. CDB_PUT_REPLACE0, /* if a record exists, fill old one with zeros */
  100. #define CDB_PUT_REPLACE0 CDB_PUT_REPLACE0
  101. CDB_FIND_FILL0 = CDB_PUT_REPLACE0
  102. };
  103. int cdb_make_start(struct cdb_make *cdbmp, int fd);
  104. int cdb_make_add(struct cdb_make *cdbmp, const void *key, unsigned klen,
  105. const void *val, unsigned vlen);
  106. int cdb_make_exists(struct cdb_make *cdbmp, const void *key, unsigned klen);
  107. int cdb_make_find(struct cdb_make *cdbmp, const void *key, unsigned klen,
  108. enum cdb_put_mode mode);
  109. int cdb_make_put(struct cdb_make *cdbmp, const void *key, unsigned klen,
  110. const void *val, unsigned vlen, enum cdb_put_mode mode);
  111. int cdb_make_finish(struct cdb_make *cdbmp);
  112. /** Private API **/
  113. struct cdb_rec
  114. {
  115. unsigned hval;
  116. unsigned rpos;
  117. };
  118. struct cdb_rl
  119. {
  120. struct cdb_rl *next;
  121. unsigned cnt;
  122. struct cdb_rec rec[254];
  123. };
  124. int _cdb_make_write(struct cdb_make *cdbmp, const unsigned char *ptr,
  125. unsigned len);
  126. int _cdb_make_fullwrite(int fd, const unsigned char *buf, unsigned len);
  127. int _cdb_make_flush(struct cdb_make *cdbmp);
  128. int _cdb_make_add(struct cdb_make *cdbmp, unsigned hval, const void *key,
  129. unsigned klen, const void *val, unsigned vlen);
  130. #ifdef __cplusplus
  131. } /* extern "C" */
  132. #endif
  133. #endif /* include guard */