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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 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: hash_conv.c,v 11.5 2000/03/31 00:30:32 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. #include "db_page.h"
  16. #include "db_swap.h"
  17. #include "hash.h"
  18. /*
  19.  * __ham_pgin --
  20.  * Convert host-specific page layout from the host-independent format
  21.  * stored on disk.
  22.  *
  23.  * PUBLIC: int __ham_pgin __P((DB_ENV *, db_pgno_t, void *, DBT *));
  24.  */
  25. int
  26. __ham_pgin(dbenv, pg, pp, cookie)
  27. DB_ENV *dbenv;
  28. db_pgno_t pg;
  29. void *pp;
  30. DBT *cookie;
  31. {
  32. DB_PGINFO *pginfo;
  33. PAGE *h;
  34. h = pp;
  35. pginfo = (DB_PGINFO *)cookie->data;
  36. /*
  37.  * The hash access method does blind reads of pages, causing them
  38.  * to be created.  If the type field isn't set it's one of them,
  39.  * initialize the rest of the page and return.
  40.  */
  41. if (h->type != P_HASHMETA && h->pgno == PGNO_INVALID) {
  42. P_INIT(pp, pginfo->db_pagesize,
  43.     pg, PGNO_INVALID, PGNO_INVALID, 0, P_HASH);
  44. return (0);
  45. }
  46. if (!pginfo->needswap)
  47. return (0);
  48. return (h->type == P_HASHMETA ?  __ham_mswap(pp) :
  49.     __db_byteswap(dbenv, pg, pp, pginfo->db_pagesize, 1));
  50. }
  51. /*
  52.  * __ham_pgout --
  53.  * Convert host-specific page layout to the host-independent format
  54.  * stored on disk.
  55.  *
  56.  * PUBLIC: int __ham_pgout __P((DB_ENV *, db_pgno_t, void *, DBT *));
  57.  */
  58. int
  59. __ham_pgout(dbenv, pg, pp, cookie)
  60. DB_ENV *dbenv;
  61. db_pgno_t pg;
  62. void *pp;
  63. DBT *cookie;
  64. {
  65. DB_PGINFO *pginfo;
  66. PAGE *h;
  67. pginfo = (DB_PGINFO *)cookie->data;
  68. if (!pginfo->needswap)
  69. return (0);
  70. h = pp;
  71. return (h->type == P_HASHMETA ?  __ham_mswap(pp) :
  72.      __db_byteswap(dbenv, pg, pp, pginfo->db_pagesize, 0));
  73. }
  74. /*
  75.  * __ham_mswap --
  76.  * Swap the bytes on the hash metadata page.
  77.  *
  78.  * PUBLIC: int __ham_mswap __P((void *));
  79.  */
  80. int
  81. __ham_mswap(pg)
  82. void *pg;
  83. {
  84. u_int8_t *p;
  85. int i;
  86. __db_metaswap(pg);
  87. p = (u_int8_t *)pg + sizeof(DBMETA);
  88. SWAP32(p); /* max_bucket */
  89. SWAP32(p); /* high_mask */
  90. SWAP32(p); /* low_mask */
  91. SWAP32(p); /* ffactor */
  92. SWAP32(p); /* nelem */
  93. SWAP32(p); /* h_charkey */
  94. for (i = 0; i < NCACHED; ++i)
  95. SWAP32(p); /* spares */
  96. return (0);
  97. }