os_seek.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_seek.c,v 11.12 2000/11/30 00:58:42 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <unistd.h>
  16. #endif
  17. #include "db_int.h"
  18. #include "os_jump.h"
  19. /*
  20.  * __os_seek --
  21.  * Seek to a page/byte offset in the file.
  22.  *
  23.  * PUBLIC: int __os_seek __P((DB_ENV *,
  24.  * PUBLIC:      DB_FH *, size_t, db_pgno_t, u_int32_t, int, DB_OS_SEEK));
  25.  */
  26. int
  27. __os_seek(dbenv, fhp, pgsize, pageno, relative, isrewind, db_whence)
  28. DB_ENV *dbenv;
  29. DB_FH *fhp;
  30. size_t pgsize;
  31. db_pgno_t pageno;
  32. u_int32_t relative;
  33. int isrewind;
  34. DB_OS_SEEK db_whence;
  35. {
  36. off_t offset;
  37. int ret, whence;
  38. switch (db_whence) {
  39. case DB_OS_SEEK_CUR:
  40. whence = SEEK_CUR;
  41. break;
  42. case DB_OS_SEEK_END:
  43. whence = SEEK_END;
  44. break;
  45. case DB_OS_SEEK_SET:
  46. whence = SEEK_SET;
  47. break;
  48. default:
  49. return (EINVAL);
  50. }
  51. if (__db_jump.j_seek != NULL)
  52. ret = __db_jump.j_seek(fhp->fd,
  53.     pgsize, pageno, relative, isrewind, whence);
  54. else {
  55. offset = (off_t)pgsize * pageno + relative;
  56. if (isrewind)
  57. offset = -offset;
  58. ret =
  59.     lseek(fhp->fd, offset, whence) == -1 ? __os_get_errno() : 0;
  60. }
  61. if (ret != 0)
  62. __db_err(dbenv, "seek: %lu %d %d: %s",
  63.     (u_long)pgsize * pageno + relative,
  64.     isrewind, db_whence, strerror(ret));
  65. return (ret);
  66. }