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

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. /*
  8.  * Copyright (c) 1990, 1993
  9.  * Margo Seltzer.  All rights reserved.
  10.  */
  11. /*
  12.  * Copyright (c) 1990, 1993
  13.  * The Regents of the University of California.  All rights reserved.
  14.  *
  15.  * This code is derived from software contributed to Berkeley by
  16.  * Margo Seltzer.
  17.  *
  18.  * Redistribution and use in source and binary forms, with or without
  19.  * modification, are permitted provided that the following conditions
  20.  * are met:
  21.  * 1. Redistributions of source code must retain the above copyright
  22.  *    notice, this list of conditions and the following disclaimer.
  23.  * 2. Redistributions in binary form must reproduce the above copyright
  24.  *    notice, this list of conditions and the following disclaimer in the
  25.  *    documentation and/or other materials provided with the distribution.
  26.  * 3. Neither the name of the University nor the names of its contributors
  27.  *    may be used to endorse or promote products derived from this software
  28.  *    without specific prior written permission.
  29.  *
  30.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  31.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  32.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  34.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  35.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  36.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  37.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  38.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  39.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  40.  * SUCH DAMAGE.
  41.  */
  42. #include "db_config.h"
  43. #ifndef lint
  44. static const char revid[] = "$Id: hsearch.c,v 11.5 2000/11/30 00:58:37 ubell Exp $";
  45. #endif /* not lint */
  46. #ifndef NO_SYSTEM_INCLUDES
  47. #include <sys/types.h>
  48. #include <string.h>
  49. #endif
  50. #define DB_DBM_HSEARCH 1
  51. #include "db_int.h"
  52. static DB *dbp;
  53. static ENTRY  retval;
  54. int
  55. __db_hcreate(nel)
  56. size_t nel;
  57. {
  58. int ret;
  59. if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  60. __os_set_errno(ret);
  61. return (1);
  62. }
  63. if ((ret = dbp->set_pagesize(dbp, 512)) != 0 ||
  64.     (ret = dbp->set_h_ffactor(dbp, 16)) != 0 ||
  65.     (ret = dbp->set_h_nelem(dbp, nel)) != 0 ||
  66.     (ret = dbp->open(dbp,
  67.     NULL, NULL, DB_HASH, DB_CREATE, __db_omode("rw----"))) != 0)
  68. __os_set_errno(ret);
  69. /*
  70.  * !!!
  71.  * Hsearch returns 0 on error, not 1.
  72.  */
  73. return (ret == 0 ? 1 : 0);
  74. }
  75. ENTRY *
  76. __db_hsearch(item, action)
  77. ENTRY item;
  78. ACTION action;
  79. {
  80. DBT key, val;
  81. int ret;
  82. if (dbp == NULL) {
  83. __os_set_errno(EINVAL);
  84. return (NULL);
  85. }
  86. memset(&key, 0, sizeof(key));
  87. memset(&val, 0, sizeof(val));
  88. key.data = item.key;
  89. key.size = strlen(item.key) + 1;
  90. switch (action) {
  91. case ENTER:
  92. val.data = item.data;
  93. val.size = strlen(item.data) + 1;
  94. /*
  95.  * Try and add the key to the database.  If we fail because
  96.  * the key already exists, return the existing key.
  97.  */
  98. if ((ret =
  99.     dbp->put(dbp, NULL, &key, &val, DB_NOOVERWRITE)) == 0)
  100. break;
  101. if (ret == DB_KEYEXIST &&
  102.     (ret = dbp->get(dbp, NULL, &key, &val, 0)) == 0)
  103. break;
  104. /*
  105.  * The only possible DB error is DB_NOTFOUND, and it can't
  106.  * happen.  Check for a DB error, and lie if we find one.
  107.  */
  108. __os_set_errno(ret > 0 ? ret : EINVAL);
  109. return (NULL);
  110. case FIND:
  111. if ((ret = dbp->get(dbp, NULL, &key, &val, 0)) != 0) {
  112. if (ret != DB_NOTFOUND)
  113. __os_set_errno(ret);
  114. return (NULL);
  115. }
  116. item.data = (char *)val.data;
  117. break;
  118. default:
  119. __os_set_errno(EINVAL);
  120. return (NULL);
  121. }
  122. retval.key = item.key;
  123. retval.data = item.data;
  124. return (&retval);
  125. }
  126. void
  127. __db_hdestroy()
  128. {
  129. if (dbp != NULL) {
  130. (void)dbp->close(dbp, 0);
  131. dbp = NULL;
  132. }
  133. }