os_seek.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  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.17 2002/08/06 04:56:20 bostic Exp $";
  10. #endif /* not lint */
  11. #include "db_int.h"
  12. /*
  13.  * __os_seek --
  14.  * Seek to a page/byte offset in the file.
  15.  */
  16. int
  17. __os_seek(dbenv, fhp, pgsize, pageno, relative, isrewind, db_whence)
  18. DB_ENV *dbenv;
  19. DB_FH *fhp;
  20. size_t pgsize;
  21. db_pgno_t pageno;
  22. u_int32_t relative;
  23. int isrewind;
  24. DB_OS_SEEK db_whence;
  25. {
  26. /* Yes, this really is how Microsoft have designed their API */
  27. union {
  28. __int64 bigint;
  29. struct {
  30. unsigned long low;
  31. long high;
  32. };
  33. } offset;
  34. int ret, whence;
  35. DWORD from;
  36. if (DB_GLOBAL(j_seek) != NULL) {
  37. switch (db_whence) {
  38. case DB_OS_SEEK_CUR:
  39. whence = SEEK_CUR;
  40. break;
  41. case DB_OS_SEEK_END:
  42. whence = SEEK_END;
  43. break;
  44. case DB_OS_SEEK_SET:
  45. whence = SEEK_SET;
  46. break;
  47. default:
  48. return (EINVAL);
  49. }
  50. ret = DB_GLOBAL(j_seek)(fhp->fd, pgsize, pageno,
  51.     relative, isrewind, whence);
  52. } else {
  53. switch (db_whence) {
  54. case DB_OS_SEEK_CUR:
  55. from = FILE_CURRENT;
  56. break;
  57. case DB_OS_SEEK_END:
  58. from = FILE_END;
  59. break;
  60. case DB_OS_SEEK_SET:
  61. from = FILE_BEGIN;
  62. break;
  63. default:
  64. return (EINVAL);
  65. }
  66. offset.bigint = (__int64)pgsize * pageno + relative;
  67. if (isrewind)
  68. offset.bigint = -offset.bigint;
  69. ret = (SetFilePointer(fhp->handle,
  70.     offset.low, &offset.high, from) == (DWORD) - 1) ?
  71.     __os_win32_errno() : 0;
  72. }
  73. if (ret != 0)
  74. __db_err(dbenv, "seek: %lu %d %d: %s",
  75.     (u_long)pgsize * pageno + relative,
  76.     isrewind, db_whence, strerror(ret));
  77. return (ret);
  78. }