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

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.  * $Id: db_shash.h,v 11.7 2000/12/12 17:43:56 bostic Exp $
  8.  */
  9. /* Hash Headers */
  10. typedef SH_TAILQ_HEAD(__hash_head) DB_HASHTAB;
  11. /*
  12.  * HASHLOOKUP --
  13.  *
  14.  * Look up something in a shared memory hash table.  The "elt" argument
  15.  * should be a key, and cmp_func must know how to compare a key to whatever
  16.  * structure it is that appears in the hash table.  The comparison function
  17.  *
  18.  * begin: address of the beginning of the hash table.
  19.  * ndx:   index into table for this item.
  20.  * type:  the structure type of the elements that are linked in each bucket.
  21.  * field: the name of the field by which the "type" structures are linked.
  22.  * elt:   the item for which we are searching in the hash table.
  23.  * res:   the variable into which we'll store the element if we find it.
  24.  * cmp:   called as: cmp(lookup_elt, table_elt).
  25.  *
  26.  * If the element is not in the hash table, this macro exits with res set
  27.  * to NULL.
  28.  */
  29. #define HASHLOOKUP(begin, ndx, type, field, elt, res, cmp) do {
  30. DB_HASHTAB *__bucket;
  31. __bucket = &begin[ndx];
  32. for (res = SH_TAILQ_FIRST(__bucket, type);
  33.     res != NULL; res = SH_TAILQ_NEXT(res, field, type))
  34. if (cmp(elt, res))
  35. break;
  36. } while (0)
  37. /*
  38.  * HASHINSERT --
  39.  *
  40.  * Insert a new entry into the hash table.  This assumes that you already
  41.  * have the bucket locked and that lookup has failed; don't call it if you
  42.  * haven't already called HASHLOOKUP.  If you do, you could get duplicate
  43.  * entries.
  44.  *
  45.  * begin: the beginning address of the hash table.
  46.  * ndx:   the index for this element.
  47.  * type:  the structure type of the elements that are linked in each bucket.
  48.  * field: the name of the field by which the "type" structures are linked.
  49.  * elt:   the item to be inserted.
  50.  */
  51. #define HASHINSERT(begin, ndx, type, field, elt) do {
  52. DB_HASHTAB *__bucket;
  53. __bucket = &begin[ndx];
  54. SH_TAILQ_INSERT_HEAD(__bucket, elt, field, type);
  55. } while (0)
  56. /*
  57.  * HASHREMOVE_EL --
  58.  * Given the object "obj" in the table, remove it.
  59.  *
  60.  * begin: address of the beginning of the hash table.
  61.  * ndx:   index into hash table of where this element belongs.
  62.  * type:  the structure type of the elements that are linked in each bucket.
  63.  * field: the name of the field by which the "type" structures are linked.
  64.  * obj:   the object in the table that we with to delete.
  65.  */
  66. #define HASHREMOVE_EL(begin, ndx, type, field, obj) {
  67. DB_HASHTAB *__bucket;
  68. __bucket = &begin[ndx];
  69. SH_TAILQ_REMOVE(__bucket, obj, field, type);
  70. }