cdb_init.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* cdb_init, cdb_free and cdb_read routines
  2.  *
  3.  * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
  4.  * Public domain.
  5.  */
  6. #include "common/setup_before.h"
  7. #include <stdio.h>
  8. #ifdef HAVE_SYS_STAT_H
  9. # include <sys/stat.h>
  10. #endif
  11. #include "compat/mmap.h"
  12. #include "cdb_int.h"
  13. #include "common/setup_after.h"
  14. int
  15. cdb_init(struct cdb *cdbp, FILE *fd)
  16. {
  17.   unsigned char *mem;
  18.   unsigned fsize, dend;
  19.   /* get file size */
  20.   if (fseek(fd, 0, SEEK_END))
  21.     return -1;
  22.   fsize = (unsigned)(ftell(fd));
  23.   rewind(fd);
  24.   /* trivial sanity check: at least toc should be here */
  25.   if (fsize < 2048)
  26.     return errno = EPROTO, -1;
  27.   /* memory-map file */
  28.   if ((mem = pmmap(NULL, fsize, PROT_READ, MAP_SHARED, fileno(fd), 0)) ==
  29.       (unsigned char *)-1)
  30.     return -1;
  31.   cdbp->cdb_fd = fd;
  32.   cdbp->cdb_fsize = fsize;
  33.   cdbp->cdb_mem = mem;
  34. #if 0
  35.   /* XXX don't know well about madvise syscall -- is it legal
  36.      to set different options for parts of one mmap() region?
  37.      There is also posix_madvise() exist, with POSIX_MADV_RANDOM etc...
  38.   */
  39. #ifdef MADV_RANDOM
  40.   /* set madvise() parameters. Ignore errors for now if system
  41.      doesn't support it */
  42.   madvise(mem, 2048, MADV_WILLNEED);
  43.   madvise(mem + 2048, cdbp->cdb_fsize - 2048, MADV_RANDOM);
  44. #endif
  45. #endif
  46.   cdbp->cdb_vpos = cdbp->cdb_vlen = 0;
  47.   cdbp->cdb_kpos = cdbp->cdb_klen = 0;
  48.   dend = cdb_unpack(mem);
  49.   if (dend < 2048) dend = 2048;
  50.   else if (dend >= fsize) dend = fsize;
  51.   cdbp->cdb_dend = dend;
  52.   return 0;
  53. }
  54. void
  55. cdb_free(struct cdb *cdbp)
  56. {
  57.   if (cdbp->cdb_mem) {
  58.     pmunmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize);
  59.     cdbp->cdb_mem = NULL;
  60.   }
  61.   cdbp->cdb_fsize = 0;
  62. }
  63. const void *
  64. cdb_get(const struct cdb *cdbp, unsigned len, unsigned pos)
  65. {
  66.   if (pos > cdbp->cdb_fsize || cdbp->cdb_fsize - pos < len) {
  67.     errno = EPROTO;
  68.     return NULL;
  69.   }
  70.   return cdbp->cdb_mem + pos;
  71. }
  72. int
  73. cdb_read(const struct cdb *cdbp, void *buf, unsigned len, unsigned pos)
  74. {
  75.   const void *data = cdb_get(cdbp, len, pos);
  76.   if (!data) return -1;
  77.   memcpy(buf, data, len);
  78.   return 0;
  79. }