aboutsummaryrefslogtreecommitdiff
path: root/db2/hash/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/hash/hash.c')
-rw-r--r--db2/hash/hash.c92
1 files changed, 43 insertions, 49 deletions
diff --git a/db2/hash/hash.c b/db2/hash/hash.c
index 5193ece561..5e0660b727 100644
--- a/db2/hash/hash.c
+++ b/db2/hash/hash.c
@@ -1,7 +1,7 @@
/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 1996, 1997
+ * Copyright (c) 1996, 1997, 1998
* Sleepycat Software. All rights reserved.
*/
/*
@@ -47,23 +47,19 @@
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)hash.c 10.36 (Sleepycat) 1/8/98";
+static const char sccsid[] = "@(#)hash.c 10.45 (Sleepycat) 5/11/98";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
-#include <sys/stat.h>
#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#endif
-#include "shqueue.h"
#include "db_int.h"
+#include "shqueue.h"
#include "db_page.h"
#include "db_am.h"
#include "db_ext.h"
@@ -71,20 +67,20 @@ static const char sccsid[] = "@(#)hash.c 10.36 (Sleepycat) 1/8/98";
#include "log.h"
static int __ham_c_close __P((DBC *));
-static int __ham_c_del __P((DBC *, int));
-static int __ham_c_get __P((DBC *, DBT *, DBT *, int));
-static int __ham_c_put __P((DBC *, DBT *, DBT *, int));
+static int __ham_c_del __P((DBC *, u_int32_t));
+static int __ham_c_get __P((DBC *, DBT *, DBT *, u_int32_t));
+static int __ham_c_put __P((DBC *, DBT *, DBT *, u_int32_t));
static int __ham_c_init __P((DB *, DB_TXN *, DBC **));
static int __ham_cursor __P((DB *, DB_TXN *, DBC **));
-static int __ham_delete __P((DB *, DB_TXN *, DBT *, int));
-static int __ham_dup_return __P((HTAB *, HASH_CURSOR *, DBT *, int));
-static int __ham_get __P((DB *, DB_TXN *, DBT *, DBT *, int));
-static void __ham_init_htab __P((HTAB *, u_int));
+static int __ham_delete __P((DB *, DB_TXN *, DBT *, u_int32_t));
+static int __ham_dup_return __P((HTAB *, HASH_CURSOR *, DBT *, u_int32_t));
+static int __ham_get __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
+static void __ham_init_htab __P((HTAB *, u_int32_t, u_int32_t));
static int __ham_lookup __P((HTAB *,
HASH_CURSOR *, const DBT *, u_int32_t, db_lockmode_t));
static int __ham_overwrite __P((HTAB *, HASH_CURSOR *, DBT *));
-static int __ham_put __P((DB *, DB_TXN *, DBT *, DBT *, int));
-static int __ham_sync __P((DB *, int));
+static int __ham_put __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
+static int __ham_sync __P((DB *, u_int32_t));
/************************** INTERFACE ROUTINES ***************************/
/* OPEN/CLOSE */
@@ -175,9 +171,9 @@ __ham_open(dbp, dbinfo)
goto out;
}
- hashp->hdr->ffactor =
- dbinfo != NULL && dbinfo->h_ffactor ? dbinfo->h_ffactor : 0;
- __ham_init_htab(hashp, dbinfo != NULL ? dbinfo->h_nelem : 0);
+ __ham_init_htab(hashp,
+ dbinfo != NULL ? dbinfo->h_nelem : 0,
+ dbinfo != NULL ? dbinfo->h_ffactor : 0);
if (F_ISSET(dbp, DB_AM_DUP))
F_SET(hashp->hdr, DB_HASH_DUP);
if ((ret = __ham_dirty_page(hashp, (PAGE *)hashp->hdr)) != 0)
@@ -230,7 +226,7 @@ out: (void)__ham_close(dbp);
}
/*
- * PUBLIC: int __ham_close __P((DB *));
+ * PUBLIC: int __ham_close __P((DB *));
*/
int
__ham_close(dbp)
@@ -264,13 +260,14 @@ __ham_close(dbp)
* Returns 0 on No Error
*/
static void
-__ham_init_htab(hashp, nelem)
+__ham_init_htab(hashp, nelem, ffactor)
HTAB *hashp;
- u_int nelem;
+ u_int32_t nelem, ffactor;
{
int32_t l2, nbuckets;
- hashp->hdr->nelem = 0;
+ memset(hashp->hdr, 0, sizeof(HASHHDR));
+ hashp->hdr->ffactor = ffactor;
hashp->hdr->pagesize = hashp->dbp->pgsize;
ZERO_LSN(hashp->hdr->lsn);
hashp->hdr->magic = DB_HASHMAGIC;
@@ -287,8 +284,6 @@ __ham_init_htab(hashp, nelem)
nbuckets = 1 << l2;
- hashp->hdr->spares[l2] = 0;
- hashp->hdr->spares[l2 + 1] = 0;
hashp->hdr->ovfl_point = l2;
hashp->hdr->last_freed = PGNO_INVALID;
@@ -310,7 +305,7 @@ __ham_init_htab(hashp, nelem)
static int
__ham_sync(dbp, flags)
DB *dbp;
- int flags;
+ u_int32_t flags;
{
int ret;
@@ -342,10 +337,9 @@ __ham_get(dbp, txn, key, data, flags)
DB_TXN *txn;
DBT *key;
DBT *data;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
- DBC *cp;
HTAB *hashp;
HASH_CURSOR *hcp;
int ret, t_ret;
@@ -362,7 +356,6 @@ __ham_get(dbp, txn, key, data, flags)
hashp = (HTAB *)ldbp->internal;
SET_LOCKER(ldbp, txn);
GET_META(ldbp, hashp);
- cp = TAILQ_FIRST(&ldbp->curs_queue);
hashp->hash_accesses++;
hcp = (HASH_CURSOR *)TAILQ_FIRST(&ldbp->curs_queue)->internal;
@@ -386,14 +379,14 @@ __ham_put(dbp, txn, key, data, flags)
DB_TXN *txn;
DBT *key;
DBT *data;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
- HTAB *hashp;
- HASH_CURSOR *hcp;
DBT tmp_val, *myval;
- int ret, t_ret;
+ HASH_CURSOR *hcp;
+ HTAB *hashp;
u_int32_t nbytes;
+ int ret, t_ret;
DEBUG_LWRITE(dbp, txn, "ham_put", key, data, flags);
if ((ret = __db_putchk(dbp, key, data,
@@ -531,7 +524,7 @@ __ham_delete(dbp, txn, key, flags)
DB *dbp;
DB_TXN *txn;
DBT *key;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
HTAB *hashp;
@@ -539,7 +532,8 @@ __ham_delete(dbp, txn, key, flags)
int ret, t_ret;
DEBUG_LWRITE(dbp, txn, "ham_delete", key, NULL, flags);
- if ((ret = __db_delchk(dbp, flags, F_ISSET(dbp, DB_AM_RDONLY))) != 0)
+ if ((ret =
+ __db_delchk(dbp, key, flags, F_ISSET(dbp, DB_AM_RDONLY))) != 0)
return (ret);
ldbp = dbp;
@@ -639,12 +633,12 @@ __ham_c_iclose(dbp, dbc)
static int
__ham_c_del(cursor, flags)
DBC *cursor;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
- HTAB *hashp;
HASH_CURSOR *hcp;
HASH_CURSOR save_curs;
+ HTAB *hashp;
db_pgno_t ppgno, chg_pgno;
int ret, t_ret;
@@ -756,7 +750,7 @@ __ham_c_del(cursor, flags)
normal: ret = __ham_del_pair(hashp, hcp, 1);
out: if ((t_ret = __ham_item_done(hashp, hcp, ret == 0)) != 0 && ret == 0)
- t_ret = ret;
+ ret = t_ret;
if (ret != 0)
*hcp = save_curs;
RELEASE_META(hashp->dbp, hashp);
@@ -770,7 +764,7 @@ __ham_c_get(cursor, key, data, flags)
DBC *cursor;
DBT *key;
DBT *data;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
HTAB *hashp;
@@ -805,7 +799,7 @@ __ham_c_get(cursor, key, data, flags)
ret = __ham_item_prev(hashp, hcp, DB_LOCK_READ);
break;
}
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case DB_LAST:
ret = __ham_item_last(hashp, hcp, DB_LOCK_READ);
break;
@@ -893,7 +887,7 @@ __ham_c_get(cursor, key, data, flags)
}
}
out1: if ((t_ret = __ham_item_done(hashp, hcp, 0)) != 0 && ret == 0)
- t_ret = ret;
+ ret = t_ret;
out: if (ret)
*hcp = save_curs;
RELEASE_META(hashp->dbp, hashp);
@@ -907,17 +901,17 @@ __ham_c_put(cursor, key, data, flags)
DBC *cursor;
DBT *key;
DBT *data;
- int flags;
+ u_int32_t flags;
{
DB *ldbp;
- HTAB *hashp;
HASH_CURSOR *hcp, save_curs;
- int ret, t_ret;
+ HTAB *hashp;
u_int32_t nbytes;
+ int ret, t_ret;
DEBUG_LWRITE(cursor->dbp, cursor->txn, "ham_c_put",
flags == DB_KEYFIRST || flags == DB_KEYLAST ? key : NULL,
- NULL, flags);
+ data, flags);
ldbp = cursor->dbp;
if (F_ISSET(cursor->dbp, DB_AM_THREAD) &&
(ret = __db_gethandle(cursor->dbp, __ham_hdup, &ldbp)) != 0)
@@ -1087,14 +1081,14 @@ __ham_dup_return(hashp, hcp, val, flags)
HTAB *hashp;
HASH_CURSOR *hcp;
DBT *val;
- int flags;
+ u_int32_t flags;
{
PAGE *pp;
DBT *myval, tmp_val;
db_indx_t ndx;
db_pgno_t pgno;
u_int8_t *hk, type;
- int indx, ret;
+ int ret;
db_indx_t len;
/* Check for duplicate and return the first one. */
@@ -1145,7 +1139,6 @@ __ham_dup_return(hashp, hcp, val, flags)
memcpy(&pgno, HOFFDUP_PGNO(P_ENTRY(hcp->pagep, ndx)),
sizeof(db_pgno_t));
if (flags == DB_LAST || flags == DB_PREV) {
- indx = (int)hcp->dndx;
if ((ret = __db_dend(hashp->dbp,
pgno, &hcp->dpagep)) != 0)
return (ret);
@@ -1451,14 +1444,15 @@ __ham_c_update(hcp, chg_pgno, len, add, is_dup)
* __ham_hdup --
* This function gets called when we create a duplicate handle for a
* threaded DB. It should create the private part of the DB structure.
+ *
* PUBLIC: int __ham_hdup __P((DB *, DB *));
*/
int
__ham_hdup(orig, new)
DB *orig, *new;
{
- HTAB *hashp;
DBC *curs;
+ HTAB *hashp;
int ret;
if ((hashp = (HTAB *)__db_malloc(sizeof(HTAB))) == NULL)