⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 find.c

📁 unix高级编程源代码.<<unix高级编程>>
💻 C
字号:
#include	"db.h"

/* Find the specified record.
 * Called by db_delete(), db_fetch(), and db_store(). */

int
_db_find(DB *db, const char *key, int writelock)
{
	off_t	offset, nextoffset;

		/* Calculate hash value for this key, then calculate byte
		   offset of corresponding chain ptr in hash table.
		   This is where our search starts. */

			/* calc offset in hash table for this key */
	db->chainoff = (_db_hash(db, key) * PTR_SZ) + db->hashoff;
	db->ptroff = db->chainoff;

			/* Here's where we lock this hash chain.  It's the
			   caller's responsibility to unlock it when done.
			   Note we lock and unlock only the first byte. */
	if (writelock) {
		if (writew_lock(db->idxfd, db->chainoff, SEEK_SET, 1) < 0)
			err_dump("writew_lock error");
	} else {
		if (readw_lock(db->idxfd, db->chainoff, SEEK_SET, 1) < 0)
			err_dump("readw_lock error");
	}
			/* Get the offset in the index file of first record
			   on the hash chain (can be 0) */
	offset = _db_readptr(db, db->ptroff);

	while (offset != 0) {
		nextoffset = _db_readidx(db, offset);
		if (strcmp(db->idxbuf, key) == 0)
			break;		/* found a match */

		db->ptroff = offset;	/* offset of this (unequal) record */
		offset = nextoffset;	/* next one to compare */
	}
	if (offset == 0)
		return(-1);		/* error, record not found */

		/* We have a match.  We're guaranteed that db->ptroff contains
		   the offset of the chain ptr that points to this matching
		   index record.  _db_dodelete() uses this fact.  (The chain
		   ptr that points to this matching record could be in an
		   index record or in the hash table.) */
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -