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

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. /*
  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.12 2002/02/22 01:55:57 mjc 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. /*
  55.  * Translate HSEARCH calls into DB calls so that DB doesn't step on the
  56.  * application's name space.
  57.  *
  58.  * EXTERN: #if DB_DBM_HSEARCH != 0
  59.  *
  60.  * EXTERN: int __db_hcreate __P((size_t));
  61.  * EXTERN: ENTRY *__db_hsearch __P((ENTRY, ACTION));
  62.  * EXTERN: void __db_hdestroy __P((void));
  63.  *
  64.  * EXTERN: #endif
  65.  */
  66. int
  67. __db_hcreate(nel)
  68. size_t nel;
  69. {
  70. int ret;
  71. if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  72. __os_set_errno(ret);
  73. return (1);
  74. }
  75. if ((ret = dbp->set_pagesize(dbp, 512)) != 0 ||
  76.     (ret = dbp->set_h_ffactor(dbp, 16)) != 0 ||
  77.     (ret = dbp->set_h_nelem(dbp, (u_int32_t)nel)) != 0 ||
  78.     (ret = dbp->open(dbp,
  79.     NULL, NULL, NULL, DB_HASH, DB_CREATE, __db_omode("rw----"))) != 0)
  80. __os_set_errno(ret);
  81. /*
  82.  * !!!
  83.  * Hsearch returns 0 on error, not 1.
  84.  */
  85. return (ret == 0 ? 1 : 0);
  86. }
  87. ENTRY *
  88. __db_hsearch(item, action)
  89. ENTRY item;
  90. ACTION action;
  91. {
  92. DBT key, val;
  93. int ret;
  94. if (dbp == NULL) {
  95. __os_set_errno(EINVAL);
  96. return (NULL);
  97. }
  98. memset(&key, 0, sizeof(key));
  99. memset(&val, 0, sizeof(val));
  100. key.data = item.key;
  101. key.size = (u_int32_t)strlen(item.key) + 1;
  102. switch (action) {
  103. case ENTER:
  104. val.data = item.data;
  105. val.size = (u_int32_t)strlen(item.data) + 1;
  106. /*
  107.  * Try and add the key to the database.  If we fail because
  108.  * the key already exists, return the existing key.
  109.  */
  110. if ((ret =
  111.     dbp->put(dbp, NULL, &key, &val, DB_NOOVERWRITE)) == 0)
  112. break;
  113. if (ret == DB_KEYEXIST &&
  114.     (ret = dbp->get(dbp, NULL, &key, &val, 0)) == 0)
  115. break;
  116. /*
  117.  * The only possible DB error is DB_NOTFOUND, and it can't
  118.  * happen.  Check for a DB error, and lie if we find one.
  119.  */
  120. __os_set_errno(ret > 0 ? ret : EINVAL);
  121. return (NULL);
  122. case FIND:
  123. if ((ret = dbp->get(dbp, NULL, &key, &val, 0)) != 0) {
  124. if (ret != DB_NOTFOUND)
  125. __os_set_errno(ret);
  126. return (NULL);
  127. }
  128. item.data = (char *)val.data;
  129. break;
  130. default:
  131. __os_set_errno(EINVAL);
  132. return (NULL);
  133. }
  134. retval.key = item.key;
  135. retval.data = item.data;
  136. return (&retval);
  137. }
  138. void
  139. __db_hdestroy()
  140. {
  141. if (dbp != NULL) {
  142. (void)dbp->close(dbp, 0);
  143. dbp = NULL;
  144. }
  145. }