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.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 "contrib/libev/ev.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 ev_loop *loop;
  32. ev_stat stat_ev; /* event structure for checking cdb for modifications */
  33. ev_tstamp check_ts;
  34. /* private members */
  35. unsigned cdb_fsize; /* datafile size */
  36. unsigned cdb_dend; /* end of data ptr */
  37. const unsigned char *cdb_mem; /* mmap'ed file memory */
  38. unsigned cdb_vpos, cdb_vlen; /* found data */
  39. unsigned cdb_kpos, cdb_klen; /* found key */
  40. };
  41. #define CDB_STATIC_INIT {0,0,0,0,0,0,0,0}
  42. #define cdb_datapos(c) ((c)->cdb_vpos)
  43. #define cdb_datalen(c) ((c)->cdb_vlen)
  44. #define cdb_keypos(c) ((c)->cdb_kpos)
  45. #define cdb_keylen(c) ((c)->cdb_klen)
  46. #define cdb_fileno(c) ((c)->cdb_fd)
  47. int cdb_init(struct cdb *cdbp, int fd);
  48. void cdb_add_timer(struct cdb *cdbp, EV_P_ ev_tstamp seconds);
  49. void cdb_free(struct cdb *cdbp);
  50. int cdb_read(const struct cdb *cdbp, void *buf, unsigned len, unsigned pos);
  51. #define cdb_readdata(cdbp, buf) \
  52. cdb_read((cdbp), (buf), cdb_datalen(cdbp), cdb_datapos(cdbp))
  53. #define cdb_readkey(cdbp, buf) \
  54. cdb_read((cdbp), (buf), cdb_keylen(cdbp), cdb_keypos(cdbp))
  55. const void *cdb_get(const struct cdb *cdbp, unsigned len, unsigned pos);
  56. #define cdb_getdata(cdbp) \
  57. cdb_get((cdbp), cdb_datalen(cdbp), cdb_datapos(cdbp))
  58. #define cdb_getkey(cdbp) \
  59. cdb_get((cdbp), cdb_keylen(cdbp), cdb_keypos(cdbp))
  60. int cdb_find(struct cdb *cdbp, const void *key, unsigned klen);
  61. struct cdb_find
  62. {
  63. struct cdb *cdb_cdbp;
  64. unsigned cdb_hval;
  65. const unsigned char *cdb_htp, *cdb_htab, *cdb_htend;
  66. unsigned cdb_httodo;
  67. const void *cdb_key;
  68. unsigned cdb_klen;
  69. };
  70. int cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp, const void *key,
  71. unsigned klen);
  72. int cdb_findnext(struct cdb_find *cdbfp);
  73. #define cdb_seqinit(cptr, cdbp) ((*(cptr))=2048)
  74. int cdb_seqnext(unsigned *cptr, struct cdb *cdbp);
  75. /* old simple interface */
  76. /* open file using standard routine, then: */
  77. int cdb_seek(int fd, const void *key, unsigned klen, unsigned *dlenp);
  78. int cdb_bread(int fd, void *buf, int len);
  79. /* cdb_make */
  80. struct cdb_make
  81. {
  82. int cdb_fd; /* file descriptor */
  83. /* private */
  84. unsigned cdb_dpos; /* data position so far */
  85. unsigned cdb_rcnt; /* record count so far */
  86. unsigned char cdb_buf[4096]; /* write buffer */
  87. unsigned char *cdb_bpos; /* current buf position */
  88. struct cdb_rl *cdb_rec[256]; /* list of arrays of record infos */
  89. };
  90. enum cdb_put_mode
  91. {
  92. CDB_PUT_ADD = 0, /* add unconditionnaly, like cdb_make_add() */
  93. #define CDB_PUT_ADD CDB_PUT_ADD
  94. CDB_FIND = CDB_PUT_ADD, CDB_PUT_REPLACE, /* replace: do not place to index OLD record */
  95. #define CDB_PUT_REPLACE CDB_PUT_REPLACE
  96. CDB_FIND_REMOVE = CDB_PUT_REPLACE, CDB_PUT_INSERT, /* add only if not already exists */
  97. #define CDB_PUT_INSERT CDB_PUT_INSERT
  98. CDB_PUT_WARN, /* add unconditionally but ret. 1 if exists */
  99. #define CDB_PUT_WARN CDB_PUT_WARN
  100. CDB_PUT_REPLACE0, /* if a record exists, fill old one with zeros */
  101. #define CDB_PUT_REPLACE0 CDB_PUT_REPLACE0
  102. CDB_FIND_FILL0 = CDB_PUT_REPLACE0
  103. };
  104. int cdb_make_start(struct cdb_make *cdbmp, int fd);
  105. int cdb_make_add(struct cdb_make *cdbmp, const void *key, unsigned klen,
  106. const void *val, unsigned vlen);
  107. int cdb_make_exists(struct cdb_make *cdbmp, const void *key, unsigned klen);
  108. int cdb_make_find(struct cdb_make *cdbmp, const void *key, unsigned klen,
  109. enum cdb_put_mode mode);
  110. int cdb_make_put(struct cdb_make *cdbmp, const void *key, unsigned klen,
  111. const void *val, unsigned vlen, enum cdb_put_mode mode);
  112. int cdb_make_finish(struct cdb_make *cdbmp);
  113. /** Private API **/
  114. struct cdb_rec
  115. {
  116. unsigned hval;
  117. unsigned rpos;
  118. };
  119. struct cdb_rl
  120. {
  121. struct cdb_rl *next;
  122. unsigned cnt;
  123. struct cdb_rec rec[254];
  124. };
  125. int _cdb_make_write(struct cdb_make *cdbmp, const unsigned char *ptr,
  126. unsigned len);
  127. int _cdb_make_fullwrite(int fd, const unsigned char *buf, unsigned len);
  128. int _cdb_make_flush(struct cdb_make *cdbmp);
  129. int _cdb_make_add(struct cdb_make *cdbmp, unsigned hval, const void *key,
  130. unsigned klen, const void *val, unsigned vlen);
  131. #ifdef __cplusplus
  132. } /* extern "C" */
  133. #endif
  134. #endif /* include guard */