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

MySQL数据库

开发平台:

Visual C++

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